Asp.net mvc 我应该在域模型中也使用数据注释吗?ASP.NETMVC

Asp.net mvc 我应该在域模型中也使用数据注释吗?ASP.NETMVC,asp.net-mvc,model,entity,viewmodel,Asp.net Mvc,Model,Entity,Viewmodel,我是ASP.NETMVC的新手,有些事情让我感到困惑。 我正在创建一个登录/注册web应用程序,当我来确认密码时,我有点困惑。我当然不想在我的数据库中确认密码列。因此,我使用ViewModel。我在ViewModel中使用数据注释进行验证。因此,不需要在我的域模型中编写任何验证代码 但当实体框架从我的域模型对象创建一个表时,它将从哪里获得信息,例如用户名应该包含多少个字符?如果我在域模型中使用数据注释,我会编写MaxLength之类的东西 我也应该验证域模型中的数据吗?您可以在视图模型上使用数据

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

但当实体框架从我的域模型对象创建一个表时,它将从哪里获得信息,例如用户名应该包含多少个字符?如果我在域模型中使用数据注释,我会编写MaxLength之类的东西


我也应该验证域模型中的数据吗?

您可以在视图模型上使用数据注释并在视图中包含jQuery验证脚本来进行客户端验证

因此,在视图模型中,您可以如下设置最小密码长度限制:

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表示是否可以将来自请求的传入值正确绑定到模型,以及在模型绑定过程中是否违反了任何明确指定的验证规则。---


是-您还需要验证数据模型。我的数据库表如何获得有关数据对象必须具有哪些限制的信息?例如,如果我没有在我的域模型中键入上面所要求的用户名,我的数据库如何理解我的表中的用户名字段不能为空?@bazera字符串是引用类型,因此已经是“可空”的。只有值类型(如int)可以为null,否则它们不能为null。您可以通过执行public int将其他类型设置为可为null?MyInt等…因此在将用户名保存到数据库之前,必须检查控制器中的用户名是否为null。如果您在viewmodel中的用户名上设置了[Required],ModelState.IsValid将检查服务器端传递的用户名是否为null。在保存用户之前,您也可以自己再次检查。@bazera Identity 2已经为您完成了:var result=wait userManager.CreateAsync(user,model.Password);如果您的用户没有用户名,则会在“结果”中显示错误。您可以检查(result.successed){continue}或者{throw error}