验证我的域对象或视图模型?它应该去哪里?

时间:2011-01-25 19:51:24

标签: asp.net-mvc service asp.net-mvc-3 data-annotations

我试图保持我的服务层免受asp.net mvc依赖,但我遇到了一个问题。我想使用Compare,但这是asp.net mvc库的一部分。那我该怎么办?

我有一个域类(后来与流利的nhibernate一起使用)

public class User()
{
   [Required(ErrorMessage = "Required")]
   [Compare()] // can't do this because not my User domain needs to know about mvc and I   rather it not
   public virtual string Email (get; set;}
   public virtual string ConfirmEmail (get; set;} // not mapped with fluent nhibernate
}

public class UserViewModel()
{
   public User User {get; set;}
}


public ActionMethod method()
{
  if(!this.ModelState.isValid)
  {

   }
}

我有这个域对象,所以我发现将所有这些属性移动到UsersViewAModel只是为了将验证放在它们上然后通过所有那些回到将用于提交的域模型(nhibernate)是没有意义的。提交)

3 个答案:

答案 0 :(得分:4)

如果您尝试分离问题,那么在您的域模型上设置验证属性就更糟糕了。

在ViewModels上放置验证属性。

答案 1 :(得分:4)

您应该使用模型类的“伙伴类”来保存验证属性:

// Note the partial keyword below:  the full definition of MyModel 
// can be put in a file in the model
[MetadataType(typeof(MyModelMetadata))]
public partial class MyModel {}

public class MyModelMetadata
{
    //properties with validation attributes (dataannotations)  go here...
}

验证属性是一个在MVC问题之间不能完全分开的项目: 它们与视图中的客户端验证和域中的服务器验证有关,在数据存储到数据库时需要进行验证。

所以@jfar说他们应该进入ViewModel,就像那个说他们应该在域中的人一样错误。

事实上,恕我直言,将验证属性放在ViewModel中是完全错误的。 ViewModel应该是发送到View的数据的容器。它不应该移植任何自己的逻辑。该逻辑(在本例中为验证属性)应在ViewModel之外定义,伙伴类是最佳选择,特别是如果您使用的是自动ORM,但不仅仅是在特殊情况下。

这个问题说明了并非每个问题都整齐地映射到MVC,因此获得所有斯大林主义关于验证属性应该去的地方是完全错误的。

我的建议:将它们放在一个地方,与所有其他问题分开。这样做的方法是使用好友类。

答案 2 :(得分:2)

public class User()
    {
       public virtual string Email (get; set;}
       public virtual string ConfirmEmail (get; set;} // not mapped with fluent nhibernate
    }
public class UserModel()
{
   [Required(ErrorMessage = "Required")]
   [Compare()] // can't do this because not my User domain needs to know about mvc and I   rather it not
   public virtual string Email (get; set;}
   public virtual string ConfirmEmail (get; set;} // not mapped with fluent nhibernate
}

public class UserViewModel()
{
   public UserModel User {get; set;}
}


public ActionMethod method()
{
  if(!this.ModelState.isValid)
  {

   }
}

您可能希望使用 AutoMapper 来解决从用户填充UserModel的问题,反之亦然。