私は、サーバー側のフォーム検証で遊んでいたモデルの結合およびにModelStateと、私は次のように気づいた:ASP MVC - フォーム入力タイプとモデルバインディング問題
- 私はタイプの入力を持っている場合は「電子メール "無効なメール アドレス(「hello」など)を挿入すると、モデルバインドが機能しません。値 が「null」として表示されます。
- ただし、有効なメールアドレスを入力すると、 すべてが機能します。
なぜこのようなことが起こるのか説明できますか? ありがとうございます!
フォーム:
<form name="contactForm" id="contactF" ng-controller="Contacts" ng-submit="contactForm.$invalid ? sendMessage() : return;" novalidate>
<input type="email" name="email" ng-model="model.EmailAddress" required placeholder="Email"/>
<div ng-messages="contactForm.email.$error" ng-if="contactForm.email.$touched || contactForm.$submitted">
<div ng-messages-include="/Helpers/error-messages.html"></div>
</div>
<textarea name="message" ng-model="model.message" required placeholder="Escreva a sua mensagem aqui."></textarea>
<div ng-messages="contactForm.message.$error" ng-if="contactForm.message.$touched || contactForm.$submitted">
<div ng-messages-include="/Helpers/error-messages.html"></div>
</div>
<br />
<input type="submit" value="Enviar"/>
</form>
モデル:
public class HomeContactVM
{
[Required(ErrorMessage = "Error message here")]
public string Name { get; set; }
[Required(ErrorMessage = "Error msg here.")]
[EmailAddress(ErrorMessage = "Please use a valid email address.")]
public string EmailAddress { get; set; }
[Required(ErrorMessage = "Error msg here.")]
public string Message { get; set; }
}
対処方法:
[HttpPost]
public JsonResult Contact(HomeContactVM model)
{
string message;
if (ModelState.IsValid)
{
using (SmtpClient client = new SmtpClient())
{
MailMessage msg = new MailMessage()
{
Body = model.Message,
BodyEncoding = Encoding.UTF8,
Subject = "New message from " + model.EmailAddress,
From = new MailAddress(model.EmailAddress),
Sender = new MailAddress("[email protected]", "xx")
};
int retries = 5;
bool retry = true;
while (retry)
{
try
{
client.Send(msg);
message = "Your message was sent.";
return Json(message, JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
if (retries > 0) {
retries--;
}
else {
retry = false;
message = "Something went wrong. Please try again later.";
return Json(message, JsonRequestBehavior.AllowGet);
}
}
}
}
}
message = "Your model is not valid.";
return Json(message, JsonRequestBehavior.AllowGet);
}
あなたのモデルプロパティは 'EmailAddress'ですが、入力名は' email'です - それらの1つは間違っています。 –
あなたの入力タイプは電子メールですが、とにかくhtmlの検証をどのようにパスしていますか、送信は許可しないでください。メッセージが無効なメールが表示されます。空であることを確認するためにも必要です。それは奇妙です – Munzer
Tieson T - ちょうどそれを変更し、問題は残っています(モデルバインディングは電子メールアドレスが有効な場合のみ動作します)。 Munzer - あなたはクライアント側の検証について話していますか? AngularJS $無効のために渡しています。私はng-submitディレクティブに追加しました(クライアント側の検証をバイパスしてサーバー側の検証をテストできるようにしました) – Acla