0

オーバーライドする方法はあります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();                
        }
    }
}

上記の疑似コードで私がやろうとしているのは、検証チェーン内のエンティティをチェックすることです。そのうちの 1 つが として添付されている場合は、Unchanged検証をスキップしてエラーを削除します。

現在、チェックして手動でハードコーディングする必要がModelState.Keyあります。より一般的で効率的な方法を探しています。

4

2 に答える 2

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、クリアされません。

于 2016-07-13T13:36:37.483 に答える