2012-06-01 37 views
4

我设计一个新网站,ASP.NET MVC 4(测试版),VS 11(测试版),EF 5(测试版),但这个问题西服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; } 
} 

这是我的问题开始:我应该在哪里把我的资料验证注解?例如,密码长度不得超过10个字符,并且PasswordConfirmed必须与密码匹配等。我必须写在每一个模型,它可以做密码的东西(我想有ChangePassword模型,太)

的另一件事是如何处理的控制器。当我显示我的Registration ViewModel并且一切正常时,我是否创建一个User模型并将Registration ViewModel中的变量赋值给它?

有时候,我有很多哪去了数据库的性能,但不向用户显示(外键的计算值,等等)。

因为想干DRY,我不想重复我的自我。

这个最好的做法是什么?

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

回答

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-模型也作为额外的措施,只是“万一”,避免字符串截断异常等。如果你不知怎的忘记了,试图将一个较长的字符串推到数据库

至于映射,是的,在你的模型验证后,在POST行动结束时,你通常会将属性从模型映射到要么是新的User实例(当添加到数据库时),要么到现有的实例进行更新。你可以使用AutoMapper或者使用反射自己写一个天真的映射器 - 这是一个相对容易的任务,但将它作为一个独立的练习可能会更好,但重新发明轮子没有意义。

1

您应该只在域图层中创建实体。但是,如果您需要一些DataValidation注释,您可以使用MvcExtensions。如果你有一些复合或嵌套实体,并且你想让它们变成扁平物体,你应该使用automapper。这对你来说是一个最佳实践!

+0

嗯,我不需要注释。我也可以使用其他的做法 –