编程语言
首页 > 编程语言> > c# – DataValidation Model / ViewModel / Entity Framework Code First

c# – DataValidation Model / ViewModel / Entity Framework Code First

作者:互联网

我正在设计一个包含ASP.NET MVC 4(Beta),VS 11(Beta),EF 5(Beta)的新网站,但这个问题也适用于ASP.NET MVC 3,VS 2010,EF 4的发布版本.

第一步:我正在使用Entity Framework Code First方法,例如,我有以下用户模型:

public class User
{
  [Key]
  public int UserId {get;set;}

  public String LoginName { get; set; }

  public String Password { get; set; }
}

现在,为了注册我需要另一个模型,注册模型:

public class Registration
{
  public String LoginName { get; set; }

  public String Password { get; set; }

  public String PasswordConfirm { get; set; }
}

这是我的问题开始的地方:我应该在哪里放置我的DataValidation注释?例如,密码长度至少为10个字符,PasswordConfirmed必须与密码匹配,依此类推.我是否必须在每个可以使用密码做某事的模型上写这个(我也考虑使用ChangePassword模型)

另一件事是如何处理控制器.当我显示我的注册ViewModel并且一切正常时,我是否创建用户模型并将注册ViewModel中的变量分配给它?

有时我会有很多属性转到数据库,但没有显示给用户(外键,计算值等).

作为DRY的思考,我不想重复我的自我.

这个的最佳做法是什么?

需要明确的是:注释不是必需的.如果有更好的验证方法,如果你展示它们,我会很高兴.

解决方法:

我不能客观地说哪个是“最佳实践”,但这就是我的看法.
如果要绑定到视图模型,请验证视图模型,以便:

public class Registration
{

    public String LoginName { get; set; }

    [Required]
    [StringLength(50, MinimumLength=10)]
    public String Password { get; set; }

    [Required]
    [StringLength(50, MinimumLength=10)]
    public String PasswordConfirm { get; set; }
}

您可以在控制器中“手动”进行验证,如果密码和确认匹配则检查POST,如果没有向ModelState添加条目(但可能导致代码重复并且有点麻烦)或者使用不错的IValidatableObject模型上的界面:

public class Registration : IValidatableObject
{

    public String LoginName { get; set; }

    [Required]
    [StringLength(50, MinimumLength=10)]
    public String Password { get; set; }

    [Required]
    [StringLength(50, MinimumLength=10)]
    public String PasswordConfirm { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext context)
    {
        if(Password != PasswordConfirm)
            yield return new ValidationResult("Confirmation doesn't match", new[] {"PasswordConfirm"})
        //etc.
    }
}

现在,当您在POST之后绑定模型时,只需调用ModelState.IsValid即可完成验证,如果它无效,则返回错误列表 – 包括您的自定义错误.

当然,你现在可以将DataAnnotations放在DB模型上作为一个额外的措施,只是为了“以防万一”,以避免字符串截断异常等,如果你以某种方式忘记并试图将更长的字符串推送到数据库

至于映射,是的,在验证模型后,在POST操作结束时,通常将属性从模型映射到新的User实例(添加到DB时)或现有的实例更新.您可以使用反射来使用AutoMapper或自己写一个天真的映射器 – 这是一个相对容易的任务,但最好将其作为一个独立的练习,重新发明轮子是没有意义的.

标签:c,entity-framework,asp-net-mvc-4,code-first
来源: https://codeday.me/bug/20190630/1333376.html