2017-05-27 20 views
0

私は、サーバー側のフォーム検証で遊んでいたモデルの結合およびに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); 
} 
+0

あなたのモデルプロパティは 'EmailAddress'ですが、入力名は' email'です - それらの1つは間違っています。 –

+0

あなたの入力タイプは電子メールですが、とにかくhtmlの検証をどのようにパスしていますか、送信は許可しないでください。メッセージが無効なメールが表示されます。空であることを確認するためにも必要です。それは奇妙です – Munzer

+0

Tieson T - ちょうどそれを変更し、問題は残っています(モデルバインディングは電子メールアドレスが有効な場合のみ動作します)。 Munzer - あなたはクライアント側の検証について話していますか? AngularJS $無効のために渡しています。私はng-submitディレクティブに追加しました(クライアント側の検証をバイパスしてサーバー側の検証をテストできるようにしました) – Acla

答えて

0

だから、誰もが同じに直面している場合問題は、ここに私が見つけたものです:問題はASPに関連していません、それはAngularのデフォルト動作に起因しています。 入力が検証に失敗した場合、Angularはその値をundefinedに設定し、モデルに渡さないため、nullとして表示されます。

あなたがここでこの動作に関する詳細を見つけることができます:可能な回避策は、「{真allowInvalid}」:= NG-モデルのオプションを設定することですAngular.js - ngModel value is undefined when ng-pattern is set in directiveGet "raw" value from invalid input field

・ホープこのことができます!

関連する問題