我正在从“ASP.NET”(顺便说一句)一书中学习Pro ASP.NET MVC 4 MVC (顺便说一句,我很喜欢它)。
我仍然处于开头的章节中,它将向我展示System.ComponentModel.DataAnnotations
名称空间属性,如何在我的模型类中洒上这些注释,然后如何使用它们来检查模型是否有效(ModelState.IsValid
在Controller
中)。
例如:
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
参数不是与View
有关吗?这样的东西不属于UI
层吗?对于example...what,如果由于空间限制,我希望移动版本不要说“请输入您的名字”,比如“需要的名称”?但它就在我的模型里!ModelState.IsValid
来确定模型的状态?模特不应该告诉我吗?我知道ModelState
正在使用我的模型中的DataAnnotations
属性,但这似乎只适用于非常简单的模型。一个更复杂的模型甚至可能没有有效/无效的状态,它可能只是有不同的阶段和状态。我在这里有点杂乱无章,但我不喜欢以声明的方式说出什么使我的模型有效或无效。对这些想法的任何建议、保证或验证都将不胜感激。
发布于 2013-12-28 01: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
。
发布于 2013-12-28 00:51:36
数据注释只是实现它的一种方式。您还可以使用Fluent API来定义数据库的模式和映射ER。注释与前端jQuery验证代码紧密耦合,因此方便且容易。的确,如果您不希望在业务逻辑中使用注释,则可以在UI层中使用视图模型。这将完全取决于应用程序的范围和大小,以及最终使用的视图模型的范围。
这里有一些你可以参考的博客来澄清你对EF的疑虑
http://msdn.microsoft.com/en-us/data/jj591620.aspx
希望这能让你走。
发布于 2013-12-28 01:06:36
这个问题的答案很大程度上取决于你想要解决的问题。例如,您的域包含复杂的业务逻辑还是基于CRUD的应用程序。你应该试着为你想要解决的问题挑出最好的。
是的,是的,但是对于你的“便条”应用程序来说,这有什么关系呢?
https://stackoverflow.com/questions/20812448
复制