是否可以覆盖页面的ValidateRequest设置?

Dar*_*ter 31 asp.net-mvc

我有一个ASP.NET MVC表单,可能(通常会)提交一个响应,触发"从客户端检测到一个潜在危险的Request.Form值"错误.

为了解决这个问题,我在页面指令中放置了一个ValidateRequest ="false".

唯一的问题:我仍然得到错误!

现在,一切都很好,直到我今天早上更新到ASP.NET MVC RC,并且(根据自述文件),将以下内容放在Views web.config中:

<pages validateRequest="false" 
       pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <controls>
        <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
    </controls>
</pages>
Run Code Online (Sandbox Code Playgroud)

因此,对于所有页面,validateRequest都应为false,对吧?我错过了什么?

Lev*_*evi 62

在MVC中,验证发生在控制器级别,而不是页面级别.要知道这是为什么,请考虑在执行控制器操作时,我们不知道将选择哪个视图进行渲染.(实际上,控制器操作甚至可能根本不呈现视图!它可能会在客户端上打开文件下载提示.)此外,如果用户向服务器提交恶意输入,则在呈现视图时它是为时已晚,无所事事.控制器已经将危险的输入提交给数据库.

相反,请使用属性[ValidateInput(false)]装饰控制器或操作.这将导致我们取消对该控制器或操作的请求验证.


Jua*_*lez 17

它需要使用属性[ValidateInput(false)]来装饰控制器或动作,并将requestValidationMode ="2.0"添加到web.config文件中:示例:

控制器:

    [ValidateInput(false)]
    public class MensajesController : Controller
    {
        //or in an action
        [ValidateInput(false)]
        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

配置文件:

    <configuration>
        <system.web>
           <httpRuntime requestValidationMode="2.0"/>
        </system.web>
    </configuration>
Run Code Online (Sandbox Code Playgroud)

  • 是的,需要为.NET 4设置requestValidationMode.感谢您的更新. (3认同)