ASP.NET MVC に関して非常に厄介であることがわかったのは、ModelState 値が、POST 要求中に @Html.* 拡張メソッドで非常に永続的であることです。ユーザーが入力した無効な値を保持できるようにするために ModelState があることは理解していますが、MVC の ModelState の処理は、ユーザーが入力した値が有効なプロパティに対しても継続します。場合によっては、これは望ましくない動作です。
たとえば、URL に ID があり、ビュー モデルの ID プロパティを別の値に設定した場合 (これは、ID 名をより具体的にする必要があることを示す良い兆候ですが、ご容赦ください)、その値はあなたが設定したものは、GET リクエスト中に作成されますが、POST 中には、ルートから取得された ModelState の値が使用されます。
これは、転記された値でも発生します。何らかの理由で、クライアントから取得した値を変更する必要がある場合、モデル内の新しい値は無視されます。ModelState も (または代わりに) 更新する必要があります。
この矛盾を解決するために、このアクション フィルターをグローバル フィルターとして MVC プロジェクトに追加しました。
public class RemoveValidModelStateFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var modelState = filterContext.Controller.ViewData.ModelState;
var keys = modelState.Keys.ToArray();
foreach (var key in keys)
{
var entry = modelState[key];
if (entry.Errors.Count == 0)
modelState.Remove(key);
}
}
}
これまでのところうまく機能していますが、意図せずに問題を引き起こしたり、機能を失ったりしていないか気になります. これは、私が完全に制御できる新しいプロジェクトとプロジェクトでのみ使用するため、価値が伝達されないという隠れた問題が発生することはありません。
私のプロジェクトで作業しているときに、他の開発者が混乱する可能性があるのを見ることができますが、他の副作用については知りません。