0

有没有办法覆盖ModelState.IsValid阻止ModelState.IsValid验证附加实体吗?

有些要验证的实体只是附属实体,因此除ID之外的所有字段都不会被验证,因为实体处于Unchanged状态。

有没有办法做到这一点?
有没有人遇到过这个问题?

更新

说我有以下作用:

[HttpPost] 
public ActionResult SaveEntity(MyEntity entity) 
{ 
    var isValid = ModelState.IsValid; //false 
} 

由于模型验证所有属性和entity所有后代的特性,必须有来检查的每个实体的方式那些后代,无论它是否与上下文相关,并且如果是,则从ModelState中删除错误,如下所示:

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来手动硬编码,我正在寻找更通用和更高效的方法。

+0

为什么你绑定到EF对象,而不是指定的视图模型? – LukLed

+0

我使用POCO实体,所以它没有区别。 – Shimmy

+0

显然它有所不同,因为在专用视图模型中你不会有这个问题。 – LukLed

回答

1

要清除所有错误,下次使用

ModelState.Clear();

问候

0

这是我做什么,以确保验证仅适用于当前实体:

 foreach (var key in ModelState.Keys) 
      if (key.Split('.').Length > 2) 
       ModelState[key].Errors.Clear(); 

     if (!ModelState.IsValid) 
      return BadRequest(ModelState); 

的支票.的出现意味着:如果模型状态键类似于currentDTO.relatedDTO.field之类,那么验证错误r被忽略(清除)。如果它只是idcurrentDTO.validateThisField,那么它不会被清除。