2010-04-19 78 views
1

我试图找出我怎么能在一个单一的位置定义的验证规则为我的域对象我的应用程序中,但已经到了阻碍跑......DRY验证与MVC2

一些背景:我的应用程序有几个部分: - 数据库 - DAL - 业务逻辑层 - SOAP API层 - MVC网站

的MVC网站访问通过SOAP API数据库,就像第三方会。我们在MVC网站以及SOAP API层中使用服务器和客户端验证。

为了避免必须手动编写客户端验证我们正在执行结合Html.TextBoxFor强类型视图和Html.ValidationMessageFor HTML辅助,如图步骤3 here。我们还为每个表单创建自定义模型,其中一个表单为多个域对象提供输入。

这是问题开始的地方,HTML助手从模型读取数据注释验证属性。在大多数情况下,我们的表单处理多个域对象,并且您无法在页面中指定多个类型... Inherits =“System.Web.Mvc.ViewPage <MvcApplication.Models.SomeModel>”%> page指示。所以我们不得不创建一个自定义模型类,这意味着将验证属性从域对象复制到模型类。

我花了相当长的一段时间寻找解决方法,此,这样的引用了来自域类和自定义MVC模式相同MetadataType,但不会有以下几个原因工作:

  1. 您只能为每个类指定一个MetadataType属性,因此如果模型引用多个域对象(每个域对象都有其自己的元数据类型),就会出现问题。

  2. 如果模型类不包含在引用的MetadataType中指定的属性,那么该模型只处理给定域对象的属性的子集。

我看过其他解决方案,但也无济于事。如果任何人有关于如何实现验证逻辑的单一来源的任何想法,可以跨MVC客户端和服务器端验证功能和其他位置(如我的SOAP API)工作,我很乐意听到它!

由于提前,

马修

回答

0

你应该做的是什么,而不是试图复制在视图模型的结构,使用现有的模型在数据模型类。 将表单数据绑定回视图模型时,可以使用参数[Bind]属性限制将绑定哪些列。或者使用任何其他方法来做到这一点。

所以,如果你的模型创建类,如ProductUserCategory,并且您的视图模型需要使用它们的一些性质,创建这样的视图模型:

public class PageViewModel 
{ 
    public Product Product { get; set; } 
    public Category Category { get; set; } 
    public User User { get; set; } 
} 

在你的页面,你就可以与它们一起使用

<%: Html.EditorFor(m => m.Product.ProductName) %> 

在这种情况下,将根据需要使用来自实际类的验证属性。
这是否给你一个可接受的解决方案?

+0

这样做,谢谢! 在你的头像上有草莓面膜吗? :) – Matthew 2010-04-24 06:31:32

+0

事实上它是!这是J!NX XD眼镜的草莓面膜 – 2010-04-24 08:26:53

0

如何返回具有嵌套类型的动作方法的容器类?

http://weblogs.asp.net/blogs/rajbk/image_63B7D5D4.png

+0

我不确定我是否了解您的解决方案,请您再解释一下吗? 如果我返回一个容器类,那么我将不得不装饰具有数据注释验证属性的容器的属性。 如果我有多个容器适用于引用相同域对象的不同场景,那么我不必在每个容器上复制验证属性? 谢谢! – Matthew 2010-04-19 07:15:02