MVC4禁用一个操作的验证

时间:2013-10-22 19:35:38

标签: c# validation asp.net-mvc-4

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

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

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

2 个答案:

答案 0 :(得分:1)

经过大量研究后,我得出结论,验证已深度集成到默认模型绑定器中,并且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中删除了这些项目。

答案 1 :(得分:0)

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

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

或者你也可以迭代所有属性来取消它们。您可能需要在客户模型绑定器中执行此操作。