为什么ValidateInput(False)不起作用?

时间:2009-04-30 15:58:33

标签: asp.net-mvc vb.net tinymce request.form

我正在使用vb.net将我使用webforms创建的应用程序转换为asp.net mvc框架。我的一个观点有问题。当我提交表单时,我得到了死亡的黄色屏幕,上面写着“从客户端检测到有潜在危险的Request.Form值”。我使用tinymce作为我的RTE。我已经设置了视图本身

  

ValidateRequest = “假”

我知道在MVC中,从我到目前为止所阅读的内容来看,它并不尊重它。所以我也把它放在控制器动作上。我尝试了不同的设置:

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

...和...

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

......还有这样......

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

只是为了看看它是否有所作为,但我仍然得到死亡的黄色屏幕。我只想为此视图设置它以及我的帖子所属的控制器中的特定操作。我错过了什么吗?

7 个答案:

答案 0 :(得分:130)

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

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

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

Asp.Net 4默认将requestValidationMode设置为4.0,告诉系统在HTTP请求的BeginRequst阶段之前执行请求验证。验证将在系统到达action属性之前发生,告诉它不验证请求,从而使属性无效。设置requestValidationMode =“2.0”将恢复为asp.net 2.0请求验证行为,允许ValidateInput属性按预期工作。

答案 1 :(得分:17)

您确定要发布的控制器操作是否具有属性?

答案 2 :(得分:3)

当您使用自己的模型绑定器实现 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 :(得分:1)

请注意,这些建议无法解决因必须将[ValidateInput(false)]与FormCollection结合使用而导致的错误所导致的问题。

请参阅:ASP.NET MVC 3 ValidateRequest(false) not working with FormCollection

答案 4 :(得分:1)

您可以尝试访问该字段 HttpContext.Request.Unvalidated.Form [&#34;字段名&#34;]

答案 5 :(得分:0)

如果您使用输入模型并在所需的属性上使用AllowHtml,您将被取消阻止。

public class InputModel
{
    [AllowHtml]
    public string HtmlInput { get; set; }
}

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

答案 6 :(得分:-1)

添加以下代码行:

GlobalFilters.Filters.Add(new ValidateInputAttribute(false));

到Application_Start()方法。