【问题标题】:Should I use data annotations in domain model too? ASP.NET MVC我也应该在域模型中使用数据注释吗? ASP.NET MVC
【发布时间】:2017-04-26 17:08:54
【问题描述】:

我是 ASP.NET MVC 的新手,有些事情让我很困惑。 我正在创建一个登录/注册网络应用程序,当我来确认密码时,我有点困惑。我当然不想在我的数据库中确认密码列。所以出于这个原因,我使用 ViewModel。我在 ViewModel 中使用数据注释进行验证。所以不需要在我的领域模型中编写任何验证代码。

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

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

【问题讨论】:

  • 是的 - 您还需要验证您的数据模型。

标签: asp.net-mvc model entity viewmodel


【解决方案1】:

您可以在您的视图模型上使用数据注释来进行客户端验证,并在您的视图中包含 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 指示是否可以将来自请求的传入值正确绑定到模型,以及在模型绑定过程中是否违反了任何明确指定的验证规则。 ----what does this do : ModelState.IsValid

【讨论】:

  • 我的数据库表如何获取有关数据对象必须具有哪些限制的信息?例如,如果我没有在上面输入Required,例如我的域模型中的用户名,我的数据库将如何理解我的表中的用户名字段不能为空?
  • @bazera 字符串是引用类型,因此已经是“可空的”。只有值类型(例如 int)可以为空,因为它们不能为空。您可以通过执行 public int? 将其他类型设置为可为空的? MyInt 等...因此,您必须先检查控制器中的用户名是否为空,然后再将其保存到数据库中。如果您在视图模型中的用户名上设置 [必需],则 ModelState.IsValid 将检查服务器端是否传递的用户名为空。并且您也可以在保存用户之前自己再次检查。
  • @bazera Identity 2 已经为您做到了: var result = await userManager.CreateAsync(user, model.Password);如果您的用户没有用户名,它将通过“结果”中的错误。你可以检查 if (result.Succeeded) { continue } else { throw error }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2012-11-23
  • 2011-09-14
  • 2011-05-26
相关资源
最近更新 更多