MVC验证:服务层或数据注释

时间:2012-11-05 15:22:30

标签: asp.net-mvc asp.net-mvc-3 model-view-controller

我希望这不是非常主观,但是当谈到验证业务逻辑时,我会看到两条路径,除非我弄错了,否则会产生几乎相同的结果:

在第一个实例中,模型是数据的哑容器,在第二个实例中,模型知道其有效状态。除此之外,我错过了两者之间的细微差别吗?在某些情况下,是否应该使用另一个?

谢谢,

克里斯

2 个答案:

答案 0 :(得分:1)

在我看来,您可以使用数据注释或Fluent Validation在模型(InputModel)上保留基本验证(必填字段,正则表达式字段,比较字段等...),以及服务层中的业务验证。我认为Annotations更多的是创建一个屏幕验证和输入到服务器端而不是业务验证。如果您将业务保留在服务层,则必须记住创建一个ModelState包装器以将其与Asp.Net MVC集成,并在视图上显示它。

看一下ModelState Wrapper的相同内容:

public class ModelStateWrapper : IValidationDictionary
{
   private ModelStateDictionary _modelState;
   public ModelStateWrapper(ModelStateDictionary modelState)
   {
      _modelState = modelState;
   }

   #region IValidationDictionary Members

   public void AddError(string key, string errorMessage)
   {
      _modelState.AddModelError(key, errorMessage);
   }

   public bool IsValid
   {
      get { return _modelState.IsValid; }
   }

   #endregion
}

答案 1 :(得分:1)

它们不是互斥的,您可以使用“静态”规则的属性,以及“动态”规则的服务层验证(例如检查唯一性)。

引用您所引用的教程:

  

在本教程中,您将学习如何移出验证逻辑   你的控制器和一个单独的服务层。

嗯,用数据注释属性修饰的模型不必在控制器旁边的Web项目中,它可以在服务旁边的服务层中,这意味着所有验证逻辑都在一个地方。