我发现 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);
}
}
}
到目前为止,它对我来说一直运行良好,但我很好奇我是否无意中制造了任何问题或失去了功能。我只在新项目和我可以完全控制的项目上使用它,所以它不会产生价值不被传达的隐藏问题。
我可以看到其他开发人员在处理我的项目时可能会感到困惑,但我不知道任何其他副作用。