有没有办法覆盖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 :(得分: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
,则忽略(清除)该验证错误。如果它只是id
或currentDTO.validateThisField
,那么它就不会被清除。