【问题标题】:ASP.Net MVC2 Validate two ViewModels of the same class differently using DataAnnotationsASP.Net MVC2 使用 DataAnnotations 以不同方式验证同一类的两个 ViewModel
【发布时间】:2011-01-08 11:05:21
【问题描述】:

我正在使用 DataAnnotations 验证自定义类(LINQ to SQL 自动生成),并使用类顶部的 MetadataType 标记。我喜欢 DataAnnotations,它在简单、常见的场景中运行良好。例如

[MetadataType(typeof(Person_Validation))]
public class Person

但是如果你需要在不同的场景下对类应用两组不同的验证规则呢???

我的情况:有些字段在面向公众的 www 网站上是强制性的,但在内部管理网站上不是强制性的。但是两个站点都有一个“创建新”的相同对象/类的视图。

这就是它变成 DataAnnotations HELL 表面的地方..

我尝试使用两个不同的 ViewModel,每个 ViewModel 都应用了不同的验证,两个类从 Person 继承,每个都应用了不同的验证。但是所有的道路似乎都与 DRY 原则相冲突,你最终会在某个地方完全重新指定底层类结构的所有属性。当您只有一个验证规则集时,您不必这样做。所以它很快就变成了地狱,对于复杂的对象不实用。

这是否可以使用 DataAnnotations?最好的 DRY 架构是什么?

【问题讨论】:

    标签: asp.net-mvc-2 validation inheritance data-annotations


    【解决方案1】:

    不确定您所说的“在原始基础类中手动复制并手动设置每个属性”是什么意思。我从不喜欢伙伴类的想法,并且会亲自为管理员和公共站点推荐不同的视图模型(每个视图都设置了适当的验证),然后使用 AutoMapper 在模型之间进行映射。

    更新:

    关于Automapper,基本用法是这样的:

    • 首先您必须定义映射。这让 automapper 可以提前弄清楚如何映射对象。您只需在应用程序中执行此操作一次,因此在 ASP.NET 应用程序中执行此操作的好地方是 Global.asax 中的 Application_Start()。对于要在其间映射的每一对类,请致电:Mapper.CreateMap<SourceType, DestinationType>();

    • 然后,在你的应用代码中做你刚才使用的地图:

    var destinationObject = Mapper.Map<SourceType, DestinationType>(sourceOjbect);

    【讨论】:

    • 我得出了同样的结论,即 AutoMapper 需要参与,但我希望我错了。说加载“编辑”视图时会出现问题。您读取 id 参数,然后在将其传递给视图之前获取需要编辑的对象。此时,您需要根据获取的对象以某种方式设置 ViewModel 中的值。这是所有路径都通向地狱的地方,否则 AutoMapper。我可以使用两个不同的验证规则集使整个架构完美地工作,但是设置检索到的对象的值以进行编辑是它吹的地方。
    • 但是你为什么不想使用自动映射器呢? - 它非常适合这种场景,简单易用且性能卓越。你几乎可以忘记它的存在。
    • 我可能会使用它,我很欣赏你的观点,但我非常严格地尽量减少我带入系统的外来/附加组件的数量。根据经验,经过 3 年的努力,突然 ASP.Net MVC10 发布了,您的整个解决方案将无法构建,因为您正在运行一个非常旧版本的 AutoMapper 和任何其他附加 DLL。我的第一偏好始终是在诉诸附加组件之前,首先要努力使用原生工具。作为一般规则,附加组件越多,可靠性越低,未来的维护成本越高。
    • 我理解您的担忧,但现在有一些适用于 .NET 的出色工具,尤其适用于 MVC(例如 ORM、IoC 容器等)。在我看来,您只是在为自己创造更多的工作不违反原则使用它们。像 Automapper 这样的东西具有非常集中的范围,并且不依赖于像 MVC 这样的高级东西。就我个人而言,我更谨慎地使用带有产品锁定和闭源的 MS 东西! (例如您的 Linq-to-SQL;)
    • 不好:试图将 MyProject.Data.Employee 映射到 admin.ViewModels.Employee。引发了“AutoMapper.AutoMapperMappingException”类型的异常。怎么回事?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多