0

有没有办法覆盖ModelState.IsValid

一些要验证的实体只是附加的实体,因此除了 ID 之外的所有字段都不会被验证,因为实体处于 state 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,我正在寻找一种更通用和更有效的方法。

4

2 回答 2

1

要清除所有错误,请使用 next

ModelState.Clear();

问候

于 2013-08-08T10:47:35.420 回答
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,则忽略(清除)该验证错误。如果它只是idor currentDTO.validateThisField,那么它不会被清除。

于 2016-07-13T13:36:37.483 回答