2

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

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

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

4

2 回答 2

1

经过大量研究,我得出的结论是validation被深度集成到默认模型绑定器中,而ValidateInput属性基本上被MVC忽略了。我会注意到在 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();
    }
  }
}

您可以看到它正在强力删除所有错误(由于无法关闭验证),这适用于我的特定场景。显然,这不是最强大的解决方案(也是一种 hack),但可以轻松修改它以适用于更具体的场景。

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

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

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

于 2013-10-24T14:52:33.993 回答
0

如果你知道哪个字段没有被验证,你可以像这样绕过验证:

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

或者您也可以遍历所有属性以取消验证它们。您可能需要在客户模型绑定器中完成这项工作。

于 2013-10-22T20:29:00.933 回答