如何在自定义绑定器中阻止MVC3输入验证?

时间:2012-08-02 18:20:34

标签: c# asp.net-mvc-3

编辑:

在这里找到答案:ASP.NET MVC 3 ValidateRequest(false) not working with FormCollection

原来我需要添加System.Web.Helpers所以我可以在Request对象上使用Unvalidated()扩展方法。这会给你一个请求,不会在不安全的输入上抛出异常。

-

所以这是我的问题发生的背景:

  • 我有一个包含子对象集合的模型类
  • 我编写了一个构造函数来解析FORM输入,以便我可以将模型发布到一个动作方法
  • 我已经设置了一个绑定器,它从发布的Request中获取Form对象并将其传递给我的模型的构造函数

由于某些子对象可以接受可能包含HTML的字符串输入,因此我需要禁用MVC的输入验证。我在action方法上设置了[ValidateInput(false)]属性,但HttpRequestValidationException仍在模型的构造函数中抛出。一时兴起,我甚至尝试在模型的活页夹和模型本身上添加[ValidateInput]属性,但这也没有解决问题。

我在这里不知所措。我如何处理这些异常,以至于我仍然可以从表单中提取信息?或者,在这种情况下,禁用MVC输入验证的适当方法是什么?

类草图如下:

public class FooController : ControllerBase {
  [HttpPost]
  [ValidateInput(false)]
  public ActionResult FooAction(FooModel model) { //do stuff; }
}

//tried [ValidateInput(false)] here as well, to no avail
public class FooBinder : BinderBase {
  public override object BindModel(...) {
    return new FooModel(controllerContext.HttpContext.Request.Form);
  }
}

//tried [ValidateInput(false)] here, too....again, no success
public class FooModel {
  public FooModel(NameValueCollection formData) {
    //do some initialization stuff

    var keys = formData.AllKeys;  //exception thrown here when inputs contain '<' or '>'

    //do some object construction stuff
  }

  public IEnumerable<FooChid> ChildCollection { get; set; }
}

1 个答案:

答案 0 :(得分:1)

尝试将[ValidationInput(false)]放在Post方法(抛出异常的位置)上,并另外添加[AcceptVerbs(HttpVerbs.Post)]。但如果这将成为一个公共网站,那么你就是打开XXS,这是不明智的。