Asp.net mvc MVC验证:服务层或数据注释

Asp.net mvc MVC验证:服务层或数据注释,asp.net-mvc,asp.net-mvc-3,model-view-controller,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,我希望这不是非常主观,但当涉及到验证业务逻辑时,我看到了两条路径,除非我弄错了,否则它们提供了几乎相同的结果: 使用对模型执行所有验证的服务层(参考:) 用数据注释装饰模型 在第一种情况下,模型是数据的哑容器,在第二种情况下,模型知道其有效状态。除此之外,这两者之间是否存在我所遗漏的细微差别?在某些情况下,是否应该使用其中一种 谢谢 Chris在我看来,您可以在模型(InputModel)上保留基本验证(必填字段、正则表达式字段、比较字段等),并在服务层进行业务验证。我认为注释更多的是创建一

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

  • 使用对模型执行所有验证的服务层(参考:)

  • 用数据注释装饰模型

在第一种情况下,模型是数据的哑容器,在第二种情况下,模型知道其有效状态。除此之外,这两者之间是否存在我所遗漏的细微差别?在某些情况下,是否应该使用其中一种

谢谢


Chris

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

看看ModelState包装器的samepl:

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
}

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

引用您提到的教程:

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


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

有意义,验证可以与数据注释隔离检查的属性,并验证通过服务层与其他组件集成的其他规则。一旦有人指出这一点就很容易:)