2017-05-27 70 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' - 其中一個是不正確的。 –

+0

你的輸入類型是電子郵件,它是如何通過html驗證的,它不應該允許提交,它會告訴你一個消息無效的電子郵件,它不會驗證的唯一方法是當它是空的,但你的輸入是必需的,所以它也會驗證空。這很奇怪 – Munzer

+0

Tieson T - 只是改變它,問題仍然存在(模型綁定只在電子郵件地址有效時纔有效); Munzer - 你在談論客戶端驗證?它是因爲我添加到ng-submit指令中的AngularJS $無效而傳遞的(我這樣做只是爲了能繞過客戶端驗證和測試服務器端驗證) – Acla

回答

0

所以,如果有人也面臨同樣的問題,這是我發現的:問題與ASP無關,這是由於Angular的默認行爲。 如果輸入未通過驗證,Angular會將其值設置爲undefined,並且不會將其傳遞給模型,因此它顯示爲空。一個可能的解決方法是設置NG-模型選項=「{allowInvalid:真正}」

你可以找到更多有關此問題在這裏:Angular.js - ngModel value is undefined when ng-pattern is set in directiveGet "raw" value from invalid input field

希望這有助於!