【问题标题】:How to use Request.Unvalidated with ASP.NET MVC 4?如何在 ASP.NET MVC 4 中使用 Request.Unvalidated?
【发布时间】:2012-10-10 18:08:51
【问题描述】:

根据此链接,现在我们可以使用 Request.Unvalidated 访问表单字段的 原始 值而不触发请求验证(并查看可怕的错误消息 潜在危险的 Request.Form ...)。不幸的是,我无法让它工作。

Web.config

<httpRuntime targetFramework="4.5" requestValidationMode="4.5" />

视图模型中的一个简单字段:

// [AllowHtml] - even I tried this, it still did not work :(
public string Description { get; set; }

和控制器动作:

[HttpPost]
public ActionResult Edit([Bind(Prefix = "Edit")] EditModel model)
{
  string s = Request.Unvalidated.Form["Edit.Description"];
}

我仍然看到错误“有潜在危险的 Request.Form...”,为什么?试过谷歌,但没有 ASP.NET MVC 的例子。

工具箱:我正在处理一个面向 .NET 4.5 和 VS2012 的 ASP.NET MVC 4 项目。

谢谢,

更新:使用带有 Description 属性的 AllowHtml 解决了我的问题,甚至不需要 Request.Unvalidated。正如我在@webdeveloper 的回答中评论的那样,仍然存在一个问题。

【问题讨论】:

    标签: asp.net-mvc-4 validation


    【解决方案1】:

    【讨论】:

    • 我的代码有什么问题吗?在达到编辑操作之前出现错误。
    • @Tiendq 属于绑定,Unvalidated 的想法是可以使用potentially dangerous Request.Form 访问字段,但是这里Edit([Bind(Prefix = "Edit")] EditModel model) binder 可以不使用Unvalidated
    • 谢谢,我用 HtmlAllow 修复了它。但正如你所说,有没有机会同时使用模型绑定和 Request.Unvalidated?
    • @Tiendq 我不确定是否可以,但最简单的测试方法是调试 mvc 框架,如下所示:stackoverflow.com/questions/4651085/…
    【解决方案2】:

    看起来您需要将请求验证模式设置为 2.0,如 webdeveloper 的第一个链接中所述。试试这个:

    <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
    

    【讨论】:

    • 听起来很遗憾,但它似乎仍然是有效管理请求验证的最佳解决方案。自从 4.0 以来,请求验证在 ASP.NET 中一直是一场噩梦,因为配置值是全局的,甚至 Request.Unvalidated 也不能正确解决这个问题。
    【解决方案3】:

    我知道问题已经被 @webdeveloper 解决了。但是,有关requestValidationMode 的更多信息。

    例如:它可以是 2.04.0

    <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
    

    <httpRuntime targetFramework="4.5" requestValidationMode="4.0" />
    

    此请求验证仅对页面启用。以下内容来自MSDN的参考

    • 4.0(默认)。 HttpRequest 对象在内部设置一个标志,指示在访问任何 HTTP 请求数据时都应触发请求验证。这保证了在请求期间访问 cookie 和 URL 等数据之前触发请求验证。配置文件中 pages 元素(如果有)或单个页面中 @Page 指令的请求验证设置将被忽略。

    • 2.0 请求验证仅对页面启用,并非对所有 HTTP 请求启用。此外,配置文件中 pages 元素(如果有)或单个页面中 @Page 指令的请求验证设置用于确定要验证哪些页面请求。

    您分配给此属性的值未经过验证以匹配特定版本的 ASP.NET。任何小于 4.0 的数值(例如,3.7、2.9 或 2.0)都被解释为 2.0。任何大于 4.0 的数字都被解释为 4.0。

    所以最初定义requestValidationMode="4.5" 将被解释为requestValidationMode="4.0"

    【讨论】:

      【解决方案4】:

      由于模型绑定导致的此问题。对于您的代码,您需要从模型绑定中排除属性“描述”。另一种允许在属性中使用 html 的方法,您可以在视图模型中的属性中使用 [AllowHtml] 属性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        相关资源
        最近更新 更多