0

编辑:

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

原来我需要添加System.Web.Helpers,所以我可以Unvalidated()在 Request 对象上使用扩展方法。这为您提供了一个不会在看起来不安全的输入上引发异常的请求。

--

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

  • 我有一个模型类,其中包含一组子对象
  • 我编写了一个构造函数,它将解析 FORM 输入,以便我可以将模型发布到操作方法
  • 我已经设置了一个活页夹,它从发布的请求中获取 Form 对象并将其传递给我的模型的构造函数

由于某些子对象可以接受可能包含 HTML 的字符串输入,因此我需要禁用 MVC 的输入验证。我已经[ValidateInput(false)]在 action 方法上设置了一个属性,但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; }
}
4

1 回答 1

1

尝试[ValidationInput(false)][AcceptVerbs(HttpVerbs.Post)]. 但是,如果这将成为一个公共网站,那么您就是在向 XXS 敞开心扉,这是不明智的。

于 2012-08-02T18:27:27.113 回答