为什么ValidateInput(False)没有生效?

35

我正在使用VB.NET将我创建的WebForms应用程序转换为ASP.NET MVC框架。我的一个视图出现了问题,当我提交表单时,出现“检测到来自客户端的潜在危险的Request.Form值”的黄屏死。 我正在使用Tinymce作为我的RTE,我已经在视图本身中设置了

ValidateRequest="false"

我知道,在MVC中,从我所读的内容来看,它不会在视图上受到尊重。 因此,我也将其放在控制器操作中。 我尝试了不同的设置:

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _

...并且...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
...而且也是这样的...
<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _

只是为了看看是否有所不同,但我仍然遇到了黄色死亡屏幕。我只想为这个视图和我的帖子所涉及的特定操作设置它。我错过了什么吗?

7个回答

137

在asp.net 4中,您还需要在web.config中配置验证模式。

将以下内容设置为 <system.web> 元素的子元素:

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>     

Asp.Net 4默认将requestValidationMode设置为4.0,这意味着系统将在HTTP请求的BeginRequest阶段之前执行请求验证。此验证将在系统到达指示它不验证请求的action属性之前发生,因此使该属性无效。将requestValidationMode设置为"2.0"将恢复到asp.net 2.0的请求验证行为,允许ValidateInput属性按预期工作。


17
这个问题会在MVC 3中被“修复”吗? - Simon_Weaver
9
如果我们将其还原为2.0版本,还需要注意哪些事项? - Josh Kodroff
我花了大约4个小时来解决这个问题。当我在沮丧中看到你的解决方案时,我并没有想到它会起作用。但它确实起作用了。当那行代码没有出现“危险值”错误时,我感到非常的宽慰。非常感谢。 - Steve Gaines
我们可以在不带参数的HttpGet操作方法中使用ValidateInput(false)吗? - Sandeep Pandey

17

你确定被提交的控制器操作是那个拥有属性的操作吗?


你真是救星!昨天我在这个项目上把自己给烧坏了。这件事情一直困扰着我,因为昨晚我认为睡一觉会有所帮助。但是,是的,我的表单动作从我测试该视图中的 jQuery 验证时为空,并且我忘记将 Url.Action 放回去了。我感到很尴尬。 - Dekryptid
在我的情况下,我有一个方法,它接收一个完整的模型和一些额外的参数(例如 Save(SomeModel model, string inputFromMemo))。起初,我只编写了 Save(SomeModel model)。添加另一个参数解决了这个问题。 - Marcus Vinicius Pompeu
在我的情况下,我有一个MVC控制器,其中包含一个仅返回jsonData的索引控制器(httpGet)。我尝试了所有组合,但验证输入对我不起作用。 - Sandeep Pandey

4

当您使用自己实现IModelBinder接口的模型绑定器时,您会注意到这些自定义模型绑定器始终验证数据,而不考虑任何属性。 您可以添加几行代码,使自定义模型绑定器遵守操作的ValidateInput过滤器:

// First check if request validation is required
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

// Get value
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
    var theValue = valueProviderResult.AttemptedValue;

    // etc...
}

这个问题在 Martijn Boland 的文章中有非常好的解释:http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/


3

你可以尝试像这样访问字段: HttpContext.Request.Unvalidated.Form["FieldName"]


HttpContext.Current.Request.Unvalidated.Form["FieldName"] - Bob Quinn

1
添加以下代码行:
GlobalFilters.Filters.Add(new ValidateInputAttribute(false));

将文本翻译为中文:

到Application_Start()方法。 嘿嘿好


6
这将禁用所有控制器操作的验证,这可能不是您想要的。 - Matt Frear
1
尽管如此,我认为知道你可以做到这一点是很有用的。 - Colin

1

0
如果您使用一个输入模型并在要求的属性上使用AllowHtml,那么您就可以解除阻止了。
public class InputModel
{
    [AllowHtml]
    public string HtmlInput { get; set; }
}

...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}

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