4

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

第一步:我使用实体框架代码优先方法,例如,我有以下用户模型:

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 Annotations 放在哪里?例如,密码至少应包含 10 个字符,并且 PasswordConfirmed 必须与 Password 匹配,依此类推。我是否必须在每个可以用密码做某事的模型上写这个(我也在考虑有一个 ChangePassword 模型)

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

有时我有很多属性进入数据库,但没有向用户显示(外键、计算值等)。

作为对 DRY 的思考,我不想重复我自己。

这个的最佳实践是什么?

需要明确的是:注释不是必需的。如果有更好的方法来验证,我会很高兴,如果你告诉他们。

4

2 回答 2

2

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

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 模型上作为一项附加措施,以“以防万一”以避免字符串截断异常等,如果您以某种方式忘记并尝试将更长的字符串推送到数据库

As for the mapping, yes, after you have your model validated, at the end of the POST action you usually you map the properties from the model to either a new User instance (when adding to the DB) or to the existing one for update. You can use AutoMapper or write a naive mapper yourself using reflection - it's a relatively easy task, but it might be better to leave that as a stand-alone exercise, there is no point in reinventing the wheel.

于 2012-06-01T07:24:42.620 回答
1

您应该只在域层中创建实体。但是当您的实体需要一些 DataValidation Annotations 时,您可以为此使用MvcExtensions。如果您有一些复合或嵌套实体,并且希望将它们作为扁平对象获取,则应该使用automapper。这将是您的最佳实践!

于 2012-06-01T07:21:10.907 回答