ValidateRequest = False,但实际操作中仍为True并被忽略了?

8

我希望在ASP.NET MVC 2.0 RTM中的特定视图上禁用RequestValidation。因此,我在视图页面指令部分添加了以下必要内容:

<%@ Page ValidateRequest="false" Language="C#" MasterPageFile="Path" Inherits="System.Web.Mvc.ViewPage<Path>" %>

但是RequestValidation并没有被禁用!我还在控制器的相关操作中添加了RequestValidation Attribute,如下所示:

[System.Web.Mvc.ValidateInput(false)]
public System.Web.Mvc.ActionResult Create(Model instance)
{
    //Do here something
}

:') 但是 RequestValidation 也没有被禁用!

在上一次尝试中,我按照以下方式在 Web.config 文件中将 RequestValidation 设置为 false:

<pages validateRequest="false" />

RequestValidation仍未关闭!

为什么?谢谢提前;)


您如何确定ValidateRequest未关闭?同时,请提供您的.NET Framework版本、ASP.NET和MVC版本。 - Branislav Abadjimarinov
因为当我提交一个表单时,其中一个字段具有HTML标记,我会收到一个ValidationRequest异常。我正在使用ASP.NET 4.0和MVC 2.0。 - Sadegh
谢谢你提供的链接。但如果我按照提供的方式进行操作,这个程序的所有新特性都将丢失!有没有办法忽略特定视图/控制器的验证? - Sadegh
同样的问题,这里有一些有趣的替代方案没有被涵盖:https://dev59.com/lHE85IYBdhLWcg3wqVT4 - demp
2个回答

13

如果您正在使用asp.net 4.0,那么与2.0版本相比,验证请求功能的行为已经发生了变化。请查看此处的更改文档。如果是这种情况,您可以通过在web.config中将请求验证行为设置回2.0来解决问题,操作如下:

<httpRuntime requestValidationMode="2.0" />

2
今天这个救了我一命。谢谢 :) - SirDemon
2
这对我也解决了问题。但是我不明白为什么会这样。破坏性变更提到了将验证扩展到非aspx请求,但我只在普通的aspx页面中使用它。现在,对我来说,似乎validateRequest在4.0中根本就无法工作。如果不是这样,有没有任何适当的方法可以在4.0中完成它,而不必基本上回到2.0? - Nicolas78
2
FYI: "第一个更改是将httpRuntime元素的requestValidationMode属性设置为“2.0”。此设置使请求验证发生在请求处理事件序列的较后阶段。该设置适用于使用ASP.NET 4及更高版本的应用程序,因为从ASP.NET 4开始,请求验证比之前的ASP.NET版本更早地发生在请求生命周期中。" 来自 https://msdn.microsoft.com/zh-cn/library/hh882339.aspx - Gusman

0

只需在您的控制器函数中添加

[ValidateInput(false)]

但不要忘记对值进行编码以防止有害代码

    [ValidateInput(false)]
    public string Browse(string test)
    {
        string message = HttpUtility.HtmlEncode("Value = " + test);
        return message;
    }

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