ASP.NET MVC 3中的ValidateRequest(false)与FormCollection无法正常工作

18

补充一下,我正在使用.NET 4.0 / MVC 3。

在我的控制器中,以下是我的代码:

[HttpPost]
[ValidateInput(false)]
public ViewResult Edit(ContentTemplateView contentTemplateView, FormCollection collection)

如果我没有输入HTML,一切都正常运作,所以我知道正确的控制器正在被触发。此外,我的web.config文件中已经正确设置了以下内容:

<httpRuntime requestValidationMode="2.0"/>

只有在包含FormCollection时我才会遇到这个问题(这是特定控制器所需的)。那么我到底做错了什么?

[我已经按照以下问题提出的建议去做了,只要没有FormCollection,它们就有效。但是其中没有一个提供包含FormCollection的解决方案]

3个回答

22

通过这个论坛的帮助,我认为我已经解决了自己的难题:http://forums.asp.net/p/1621677/4163625.aspx

我只是修改了我的控制器以便它不接受控制器,并且使用System.Web.Helpers从请求中获取未验证的表单集合。

using System.Web.Helpers;

[HttpPost]
[ValidateInput(false)]
public ViewResult Edit(ContentTemplateView contentTemplateView)
{
    FormCollection collection = new FormCollection(Request.Unvalidated.Form);

1
顺便说一句,我相信这个 bug 在 ASP.NET MVC 3 的下一个版本中已经修复了,所以当你升级到那个版本时就不需要这个解决方法了。 - Eilon
我尝试添加对System.Web.Helpers dll的引用,并在我的控制器中添加了using System.Web.Helpers,但它不接受Request下的Unvalidated()方法。我正在使用.NET 4和MVC 3 RC。 - Martin at Mennt
@Martin刚刚回答了你的问题:https://dev59.com/aVLTa4cB1Zd3GeqPbIMG - marcind
这个帮助解决了我的问题!我遇到了一个名为"Preventing CSRF With Ajax"的问题(http://haacked.com/archive/2011/10/10/preventing-csrf-with-ajax.aspx),但是在执行ValidateInput(false)之前就被触发了,所以我用 _form = new NameValueCollection(request.Unvalidated().Form); 替换了 _form = new NameValueCollection(request.Form); - Vackup
是的,它有效。您还应将以下内容添加到web.config文件中:<httpRuntime requestValidationMode="2.0" />。 - Maksym Kozlenko

7

我刚刚安装了ASP.NET MVC 3 RC2,这个错误已经被修复了。现在以下代码的工作符合预期。

[HttpPost]
[ValidateInput(false)]
public ViewResult Edit(FormCollection form)
{
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接