Asp.net mvc 4 Asp.NET MVC-DataAnnotations和ModelState.IsValid是否太侵入域模型?

Asp.net mvc 4 Asp.NET MVC-DataAnnotations和ModelState.IsValid是否太侵入域模型?,asp.net-mvc-4,entity-framework-5,data-annotations,separation-of-concerns,Asp.net Mvc 4,Entity Framework 5,Data Annotations,Separation Of Concerns,我正在从这本书中学习ASP.NETMVC(顺便说一句,到目前为止我很喜欢这本书) 我还在开始的章节中,它向我展示了System.ComponentModel.DataAnnotations名称空间属性,如何向我的模型类中添加这些注释,然后如何使用它们检查模型是否有效(Controller中的ModelState.IsValid) 例如: public class GuestResponse { [Required(ErrorMessage = "Please enter your nam

我正在从这本书中学习ASP.NETMVC(顺便说一句,到目前为止我很喜欢这本书)

我还在开始的章节中,它向我展示了
System.ComponentModel.DataAnnotations
名称空间属性,如何向我的模型类中添加这些注释,然后如何使用它们检查模型是否有效(
Controller
中的
ModelState.IsValid

例如:

public class GuestResponse
{
    [Required(ErrorMessage = "Please enter your name"]
    public string Name { get; set; }
}

...

public ViewResult RsvpForm(GuestResponse guestResponse)
{
    if(ModelState.IsValid)
    {
        return View("Thanks", guestResponse);

    }

}
有几件事让我感到不安

  • 为什么我希望在我的领域模型中散落一堆属性?我喜欢我的域模型纯粹,没有任何特定于实现的东西,任何现实世界的模型都太复杂,不能像这样使用声明性验证
  • 验证属性的
    ErrorMessage
    参数是否与视图
    相关?这样的东西不属于
    UI
    层吗?例如…如果由于空间限制,我希望移动版本不要说“请输入您的姓名”,而是说“需要姓名”,该怎么办?但它在我的模型中
  • 为什么要使用
    ModelState.IsValid
    来确定模型的状态?模特不应该告诉我吗?我知道
    ModelState
    正在使用我的模型中的
    DataAnnotations
    属性,但这似乎只适用于非常简单的模型。更复杂的模型甚至可能没有有效/无效状态,它可能只有不同的阶段和状态。我在这里有点漫无边际,但我不喜欢声明性地说出是什么使我的模型有效或无效

  • 对于这些想法的任何建议、保证或验证,我们都将不胜感激。

    数据注释只是一种方法。您还可以使用fluentapi来定义数据库和映射器的模式。注释与前端jQuery验证代码紧密耦合,因此非常方便。 的确,如果您不想在业务逻辑中添加注释,那么可以在UI层中使用视图模型。这完全取决于应用程序的范围和大小以及最终使用的视图模型的范围

    这里有一些你可以参考的博客来澄清你对EF的疑虑


    希望这能让你成功。

    以下是我对你问题的回答:

    1) 为什么我希望在我的领域模型中散落一堆属性?我喜欢我的域模型,它是纯的,没有任何东西 特定于实现,任何真实世界的模型都太复杂 只需像这样使用声明性验证

    你绝对不想要这个。您想要的是有一个视图模型,它是专为您的视图而设计的。这个视图模型将包含数据注释,而不是域模型。然后,控制器将在域模型和视图模型之间映射,并将视图模型传递给视图。将视图模型视为一个或多个域模型的投影。为了简化域模型和视图模型之间的映射,您可以签出。基本的经验法则是视图不应该知道您的域模型

    2) 验证属性的ErrorMessage参数是否与视图相关?这样的东西不属于UI吗 层?例如…如果由于空间限制,我想要 手机版改为说“请输入您的姓名”而不是说“姓名” 必需的“?但它在我的模型中

    完全同意你的意见。这就是为什么您应该有一个视图模型类,它是专门为视图而设计的

    3) 为什么要使用ModelState.IsValid来确定 模型模特不应该告诉我吗?我知道ModelState是 使用模型中的DataAnnotations属性,但是 这似乎只适用于非常简单的模型。更多 复杂模型甚至可能没有有效/无效状态,它可能只是 有不同的阶段和状态。我在这里闲聊,但我不知道 比如说声明性地说出是什么使我的模型有效或者 无效


    我再次同意你的看法。声明性验证(例如,您从数据注释中获得的内容)对于Hello World类型的应用程序非常有用,但一旦您开始编写具有复杂验证规则的真实应用程序,您很快就会意识到声明性方法根本无法解决问题。正是因为这个原因,我才使用。它为您提供了一个非常好且流畅的语法来表达任意复杂的验证规则,并允许完全隔离。

    这一问题的答案取决于您试图解决的问题。例如,您的域是否包含复杂的业务逻辑,或者应用程序是否基于CRUD。你应该试着为你要解决的问题挑选最好的

  • 我猜在考虑这些“域模型”时有两个极端,它们可以是数据库和UI之间的数据传输对象,也可以是对业务问题建模的复杂DDD类型的对象。如果它们是前者,那么为什么不让它们尽可能简单呢。另一方面,使用视图和数据库之间共享的“单一”模型很难很好地实现复杂的业务领域。事实上,你可能在某个中间。

  • 二,三。是的,但这对你的“note”应用程序来说重要吗?对你的shipping应用程序来说怎么样?

    个人不会说绝对,你需要能够在需要更复杂的解决方案时进行挑选。再说一次,虽然FluentValidation.NET非常好,但它也在验证ViewModels或简单域模型方面占有一席之地。复杂领域模型的验证是领域本身的责任