【问题标题】:DRY Validation with MVC2使用 MVC2 进行 DRY 验证
【发布时间】:2010-04-19 06:26:39
【问题描述】:

我正试图弄清楚如何在我的应用程序中的一个位置为我的域对象定义验证规则,但遇到了障碍......

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

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

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

这就是问题开始的地方,HTML 助手从模型中读取数据注释验证属性。在大多数情况下,我们的表单处理多个域对象,您不能在 " %> 页面中指定多个类型指示。所以我们不得不创建一个自定义模型类,这意味着将域对象中的验证属性复制到模型类中。

我花了相当长的时间寻找解决方法,例如从域类和自定义 MVC 模型中引用相同的 MetadataType,但由于以下几个原因这不起作用:

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

  2. 如果模型类不包含在引用的 MetadataType 中指定的属性,则数据注释验证代码将引发异常,这是模型仅处理给定域的属性子集的问题对象。

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

提前致谢,

马修

【问题讨论】:

    标签: asp.net-mvc validation dry


    【解决方案1】:

    您应该做的不是尝试在视图模型中复制结构,而是在数据模型类中使用现有模型。 当您将表单数据绑定回视图模型时,您可以使用参数上的[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) %>
    

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

    【讨论】:

    • 成功了,谢谢!你头像上的一护面具? :)
    • 事实上就是这样!这是来自 J!NX XD 的戴眼镜的 Ichigo 面具
    【解决方案2】:

    在您的操作方法中返回一个具有嵌套类型的容器类怎么样?

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

    【讨论】:

    • 我不确定我是否理解您的解决方案,您能否再解释一下?如果我返回一个容器类,那么我将不得不使用数据注释验证属性来装饰容器的属性。如果我有多个容器用于引用相同域对象的不同场景,那么我是否不必在每个容器中复制验证属性?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多