阻止ModelState.IsValid验证附加实体?

时间:2013-07-14 02:02:37

标签: asp.net-mvc entity-framework controller modelstate modelstatedictionary

有没有办法覆盖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手动进行硬编码,我正在寻找更通用,更有效的方式。

2 个答案:

答案 0 :(得分:1)

要清除所有错误,请使用下一步

ModelState.Clear();

问候

答案 1 :(得分: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,则忽略(清除)该验证错误。如果它只是idcurrentDTO.validateThisField,那么它就不会被清除。