在ASP.NET MVC 中使用模型繫結 (Model Binding)時,我們會使用 ModelState 去驗證有沒有綁好,說明如下:
[ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { //有綁好,可以往下做 }else{ //沒有綁好 return View(model); } }
要怎麼判斷有沒有綁好,首先要來看 LoginViewModel
public class LoginViewModel { [Required] [Display(Name = "電子郵件")] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "密碼")] public string Password { get; set; } [Display(Name = "記住我?")] public bool RememberMe { get; set; } }
在這個 LoginViewModel 有兩個欄位必填([Required]),所以在 cshtml 送過來的資料這兩個欄位一定要有正確的值,ModelState.IsValid 才會等於true
@using (Html.BeginForm("Login", "Account", FormMethod.Post)) { @Html.AntiForgeryToken() @Html.TextBoxFor(m => m.Email) @Html.PasswordFor(m => m.Password) <input type="submit" value="登入" class="btn btn-default" /> }
如果今天我們在 LoginViewModel 加了一個欄位,且必填而且沒有出現Form裡面,這樣 ModelState.IsValid 就會等於false
public class LoginViewModel { [Required] [Display(Name = "電子郵件")] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "密碼")] public string Password { get; set; } [Display(Name = "記住我?")] public bool RememberMe { get; set; } [Required] [Display(Name = "帳號")] public string UserName { get; set; } }
為確保cshtml送過來的值,可以通過 ModelState.IsValid 的驗證,所以通常我們會加上防呆
//LoginViewModel public class LoginViewModel { [Required] [Display(Name = "電子郵件")] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "密碼")] public string Password { get; set; } [Display(Name = "記住我?")] public bool RememberMe { get; set; } } // @Html.ValidationMessageFor根據LoginViewModel的 meta規則,來做防呆 @using (Html.BeginForm("Login", "Account", FormMethod.Post)) { @Html.AntiForgeryToken() @Html.TextBoxFor(m => m.Email) @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" }) @Html.PasswordFor(m => m.Password) @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" }) <input type="submit" value="登入" class="btn btn-default" /> }