MVC3模型类的条件验证

时间:2011-08-21 05:11:50

标签: entity-framework asp.net-mvc-3 validation entity-framework-4.1

我正在使用Entity Framework和一个Model类DonationForm,它由视图模型类“CreateDonationForm”包装。

为了与DRY原则保持一致,我在Model类(而不仅仅是视图模型)上添加了验证注释,以便它们可以重用。但是,并非所有类中的属性都将被使用(有些属性实际上是互斥的)。例如特定的电话号码属性相关时,我想使其符合Regex注释并且是必需的。但在不同的情况下,我希望能够通过提交(并持久化到数据库)空值来逃避。

关注此帖:How do I use IValidatableObject?

我使模型类实现了IValidatableObject并实现了自定义验证,以便从ValidationResult对象中选择性地删除验证错误(当字段是一组字段的一部分时,根据用户在表单上的其他选择而不相关) 。它工作正常,我能够找回那些错误已被清除的ValidationResults列表。

然而,当我调用SaveChanges()时,我得到验证错误,这会阻止保存。验证仍在数据库/模型类级别进行。 (数据库是使用EF 4.1 Code First从Model类生成的。)

如何实现条件格式规则并仍然在Model类上使用Annotations?这基本上是说 - 应用这些验证规则,否则不应用这些验证规则。请指教我我是MVC的新手,我正在尝试以正确的方式做事。似乎将验证放在视图模型上,然后将值映射到底层模型类可能会起作用;但是,感觉不对。我认为在Model类本身上具有验证属性具有很大的价值,并且在创建和更新视图模型上放置相同的注释时会浪费大量的重复性工作。感觉就像我在MVC Fw这里应该更容易的事情。您可以提供的任何见解将不胜感激。

1 个答案:

答案 0 :(得分:4)

有许多很酷的原则,但有时候小违规会让你的生活更轻松。从EF模型中删除数据注释并将它们放在它们所属的视图模型上。您仍然可以在视图模型中使用IValidatableObject,并使用多个视图模型使用的多个可重用辅助方法进行验证(因此您仍然可以实现DRY原则)。

如果你顽固并且真的想在EF模型中进行验证,请关闭EF中的验证并在上层处理它:

dbContext.Configuration.ValidateOnSaveEnabled = false; 

EF级别验证适用于验证规则不会在操作之间更改的简单方案。