MVC4 禁用一个操作的验证

本文关键字:一个 操作 验证 MVC4 | 更新日期: 2023-09-27 18:36:37

我正在处理一个 MVC4 项目,我有一个操作,我希望禁用验证,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult AddNewItems(AddNewItemsModel model, string postType)
{ ... }

即使我设置了"ValidateInput(false)",应用程序也坚持验证数据等。 我已经逐步浏览了代码,并确认正在调用此操作,但似乎忽略了该属性。 有没有一些简单的替代方法来完成这项工作(尤其是不需要另一层模型等的方法)?

MVC4 禁用一个操作的验证

经过大量研究,我得出结论,验证已深度集成到默认模型绑定器中,并且 MVC 基本上忽略了 ValidateInput 属性。 我会注意到在 web.config 中使用以下内容

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>

有时会纠正这种情况,但有时不会。 我注意到此设置与"ValidateInput"属性相结合,仅间歇性地得到遵守,这使得它对 IMO 毫无用处。 最后,我想出了一个动作过滤器,定义如下:

public class ClearModelErrorsAttribute : ActionFilterAttribute
{
  // ---------------------------------------------------------------------------------------
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    ModelStateDictionary msd = filterContext.Controller.ViewData.ModelState;
    foreach (var item in msd.Values)
    {
      item.Errors.Clear();
    }
  }
}

您可以看到它正在对所有错误进行暴力删除(由于无法关闭验证),这适用于我的特定场景。 显然,这不是最强大的解决方案(和黑客),但它可以很容易地修改以适用于更具体的场景。

我的动作的新签名是这样的:

[HttpPost]
[ValidateAntiForgeryToken]
[ClearModelErrors]
public ActionResult AddNewItems(AddNewItemsModel model, string postType)
{ ... }

我已经从web.config中删除了上面提到的项目。

如果您知道哪个字段未被验证,则可以像这样绕过验证:

var myForbiddenValue = System.Web.Helpers.Validation.Unvalidated(Request).Form["MyForbiddenField"]

或者,您也可以循环访问所有属性以取消验证它们。您可能需要在客户模型活页夹中执行这项工作。