ASP.NET MVC ModelState.IsValid 說明

在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" />
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *