我是否应该在域模型中使用数据注释? ASP.NET MVC

时间:2016-12-11 20:07:36

标签: asp.net-mvc model entity viewmodel

我是ASP.NET MVC的新手,有些让我困惑的事情。 我正在创建一个登录/注册web-app,当我来确认密码时,我有点困惑。我当然不希望在我的数据库中确认密码列。因此,我使用ViewModel。我在ViewModel中使用数据注释进行验证。因此,无需在我的域模型中编写任何验证代码。

但是当Entity Framework从我的Domain Model对象创建一个表时,它将从哪里获取有关用户名应该占用多少个字符的信息?如果我在我的域模型中使用数据注释,我会写MaxLength或其他东西。

我是否应该验证域模型中的数据?

1 个答案:

答案 0 :(得分:1)

您可以在View Model上使用Data Annotations来处理客户端验证,并在View中包含jQuery验证脚本。

因此,在View Model中,您可以设置最小密码长度限制,如下所示:

using System.ComponentModel.DataAnnotations;

public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

当然,这仅适用于客户端验证,对于服务器端验证,您必须验证控制器中的数据,但我不认为您必须在域模型上使用数据注释。

因此,在您的控制器中,您可以像这样验证传递的数据

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterViewModel model)
{
    //checks for data passed through, if somehow people bypasses client side validation
    if (ModelState.IsValid)
    {
        //continue
    } 
    //validation failed, return to view
    return View(model);
}
  

ModelState.IsValid指示是否可以正确地将请求中的传入值绑定到模型,以及在模型绑定过程中是否破坏了任何显式指定的验证规则。 ---- what does this do : ModelState.IsValid