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