首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Asp.NET MVC - DataAnnotations和ModelState.IsValid太侵入领域模型了吗?

Asp.NET MVC - DataAnnotations和ModelState.IsValid太侵入领域模型了吗?
EN

Stack Overflow用户
提问于 2013-12-28 08:16:08
回答 3查看 3.1K关注 0票数 5

我正在从“ASP.NET”(顺便说一句)一书中学习Pro ASP.NET MVC 4 MVC (顺便说一句,我很喜欢它)。

我仍然处于开头的章节中,它将向我展示System.ComponentModel.DataAnnotations名称空间属性,如何在我的模型类中洒上这些注释,然后如何使用它们来检查模型是否有效(ModelState.IsValidController中)。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
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);

    }

}

有几件事让我感到不安。

  1. 为什么我想要一堆属性散落在我的域模型中?我喜欢我的领域模型是纯的,没有任何特定于实现的东西,任何真实世界的模型都太复杂了,不能像这样使用声明式验证。
  2. 验证属性的ErrorMessage参数不是与View有关吗?这样的东西不属于UI层吗?对于example...what,如果由于空间限制,我希望移动版本不要说“请输入您的名字”,比如“需要的名称”?但它就在我的模型里!
  3. 为什么我要使用ModelState.IsValid来确定模型的状态?模特不应该告诉我吗?我知道ModelState正在使用我的模型中的DataAnnotations属性,但这似乎只适用于非常简单的模型。一个更复杂的模型甚至可能没有有效/无效的状态,它可能只是有不同的阶段和状态。我在这里有点杂乱无章,但我不喜欢以声明的方式说出什么使我的模型有效或无效。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-28 09:00:39

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

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

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

2)验证属性的ErrorMessage参数不是与视图有关吗?这样的东西不属于UI层吗?对于example...what,如果由于空间限制,我希望移动版本不要说“请输入您的名字”,比如“需要的名称”?但它就在我的模型里!

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

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

我再一次同意你的看法。声明式验证(比如您在数据注释中得到的信息)对于Hello类型的应用程序非常有用,但是一旦您开始用复杂的验证规则编写真实的应用程序,您很快就会意识到,声明式方法根本不会减少芥末。正是因为这个原因,我才使用FluentValidation.NET。它为您提供了一个非常好的、流畅的语法来表达任意复杂的验证规则,它是integrates easily with ASP.NET MVC,并且允许完全隔离的unit test your validation rules

票数 8
EN

Stack Overflow用户

发布于 2013-12-28 08:51:36

数据注释只是实现它的一种方式。您还可以使用Fluent API来定义数据库的模式和映射ER。注释与前端jQuery验证代码紧密耦合,因此方便且容易。的确,如果您不希望在业务逻辑中使用注释,则可以在UI层中使用视图模型。这将完全取决于应用程序的范围和大小,以及最终使用的视图模型的范围。

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

http://msdn.microsoft.com/en-us/data/jj591620.aspx

希望这能让你走。

票数 1
EN

Stack Overflow用户

发布于 2013-12-28 09:06:36

这个问题的答案很大程度上取决于你想要解决的问题。例如,您的域包含复杂的业务逻辑还是基于CRUD的应用程序。你应该试着为你想要解决的问题挑出最好的。

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

是的,是的,但是对于你的“便条”应用程序来说,这有什么关系呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20812448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档