【发布时间】:2013-07-12 05:37:37
【问题描述】:
有没有办法覆盖ModelState.IsValid?
某些要验证的实体只是附加实体,因此除了 ID 之外的所有字段都不会验证,因为实体处于状态 Unchanged。
有没有办法做到这一点?
以前有人遇到过这个问题吗?
更新
假设我有以下操作:
[HttpPost]
public ActionResult SaveEntity(MyEntity entity)
{
var isValid = ModelState.IsValid; //false
}
由于模型验证了 entity 的所有属性和所有后代属性,因此必须有一种方法来检查这些后代的每个实体,它是否附加到上下文中,如果是,则从 @987654325 中删除错误@,类似于以下内容:
public ActionResult TryValidateDetachedModel(MyEntity entity, DbContext context)
{
foreach (var ms in ModelState.Where(ms => ms.Value.Errors.Any()).ToArray())
// should iterate over something like GetAllEntityTypesMetadata()
{
var entity = GetEntityFromMetadata(ms);
if (context.Entry(entity).State == EntityState.Unchanged)
{
ms.Value.Errors.Clear();
}
}
}
我在上面的伪代码中试图做的是检查验证链中的实体,如果其中一个被附加为Unchanged,跳过验证/删除它的错误。
现在我必须通过检查ModelState.Key 手动进行硬编码,我正在寻找一种更通用和更有效的方法。
【问题讨论】:
-
为什么绑定到 EF 对象,而不是指定的视图模型?
-
我使用的是 POCO 实体,所以没有区别。
-
显然它会有所不同,因为使用专用视图模型您不会遇到这个问题。
-
好吧,假设你是对的。目前我无法为我的域中的所有模型重新创建视图模型。您能想出一个解决方案,将与提供的
DbContext进行交互以查看哪些实体附加为Unchanged并跳过验证/删除它们的错误? -
好的。我不太确定你在问什么。实体如何在绑定后附加到 DbContext?也许您可以编写一些
ModelBinder之王,当实体未更改时检查状态并忽略验证,但我不确定您要的是什么。
标签: asp.net-mvc entity-framework controller modelstate modelstatedictionary