使用MVC2进行DRY验证

时间:2010-04-19 06:26:39

标签: asp.net-mvc validation dry

我正在试图弄清楚如何在我的应用程序中的一个位置定义我的域对象的验证规则,但是已经陷入困境......

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

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

为避免必须手动编写客户端验证,我们将结合Html.TextBoxFor和Html.ValidationMessageFor HTML帮助程序实现强类型视图,如步骤3 here所示。我们还为每个表单创建自定义模型,其中一个表单为多个域对象输入。

这就是问题开始的地方,HTML帮助程序从模型中读取数据注释验证属性。在大多数情况下,我们的表单处理多个域对象,并且您不能在<%@ Page ... Inherits =“System.Web.Mvc.ViewPage< MvcApplication.Models.SomeModel>”中指定多个类型。 %GT;页面指​​令。因此我们被迫创建一个自定义模型类,这意味着将域对象的验证属性复制到模型类。

我花了很多时间为此寻找变通方法,例如从域类和自定义MVC模型引用相同的MetadataType,但由于以下几个原因,这不起作用:

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

  2. 如果模型类不包含在引用的MetadataType中指定的属性,那么数据注释验证代码会抛出异常,该属性是模型的问题,只处理给定域的属性的子集对象

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

    提前致谢,

    马修

2 个答案:

答案 0 :(得分:0)

如何在action方法中返回具有嵌套类型的容器类?

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

答案 1 :(得分:0)

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

因此,如果您的模型创建了Product UserCategory等类,并且您的视图模型需要使用其某些属性,请创建如下的视图模型:

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

在您的页面中,您可以将它们与

一起使用
<%: Html.EditorFor(m => m.Product.ProductName) %>

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