AllowHtml适用于创建,但不适用于编辑ASP.asp.net MVC 5

本文关键字:适用于 asp net ASP MVC 不适用 创建 AllowHtml 编辑 | 更新日期: 2023-09-27 18:05:37

这是ASP.Net MVC 5项目

我有一个简单的模型,它的一个属性允许HTML输入:

public class FooModel {
    //other properties
    [AllowHtml]
    public string BarField { get; set; }
}

和一个使用模型的控制器,如下所示:

[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
public class FooController : Controller {
    //some other codes...
    // GET: Foo/Create
    public ActionResult Create(int? id, int number = 0) {
      //some code
    }
    // POST: Foo/Create
    [HttpPost]
    public ActionResult Create(FooModel fooModel) {
        //some code
    }
    // GET: Foo/Edit/5
    public ActionResult Edit(int? id, int number = 0) {
        //some code
    }
    // POST: Foo/Edit/5
    [HttpPost]
    public ActionResult Edit(FooModel model, FormCollection collection) {
        //some code
    }
}

在阅读了SO中的一些帖子后:

  1. AllowHtml属性不工作
  2. AllowHtml属性不工作
  3. AllowHtml不工作

我知道必须做以下工作,以确保AllowHtml属性的工作:

  1. 在web.config
  2. 中使用<httpRuntime requestValidationMode="2.0" />
  3. 清空模型传递和使用的控制器缓存[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]

因此,我在web.config中有以下完整的<system.web>元素:

  <system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>

并且,正如你所看到的,我还把OutputCache属性放在了控制器的顶部:

[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]

现在,这对于Create Action工作得很好(也就是说,我可以在BarField中插入HTML元素,并且可以接受该帖子,并且可以毫无问题地调用该Action)。

但是当我做Edit动作时,该动作甚至没有被调用,错误:

有潜在危险的请求。从客户端检测到表单值(BarField="…"话说这里& lt;我>,也here & lt;……")。

描述:ASP。. NET检测到请求中的数据有潜在的危险,因为它可能包含HTML标记或脚本。这些数据可能表示有人企图破坏应用程序的安全性,例如跨站点脚本攻击。如果这种类型的输入在您的应用程序中是合适的,您可以在web页面中包含代码以显式地允许它。欲了解更多信息,请访问http://go.microsoft.com/fwlink/?LinkID=212874。

显示在页面上。为什么会这样呢?

AllowHtml适用于创建,但不适用于编辑ASP.asp.net MVC 5

抛出异常,因为您在Edit()方法中包含了一个额外的参数FormCollection collection

当您应用[AllowHtml]属性时,它将属性ModelMetadataRequestValidationEnabled属性设置为false。在模型绑定过程中,DefaultModelBinder检查这个值,因为它是false,所以绑定到模型时不会抛出异常。

但是,FormCollection只是一个NameValueCollection,通过读取Request.Form的值来填充。没有模型和关联的元数据,因此抛出异常。如果您要使用

,则会发生完全相同的情况
var barField= Request["BarField"];

虽然使用RequestUnvalidated属性也可以

var barField = Request.Unvalidated.Form["BarField"];

您也可以通过将[ValidateInput(false)]属性应用于方法来使其工作,但这将适用于整个模型,并且是禁用请求验证的最不安全的方法。

删除Edit()方法中的FormCollection collection参数将解决问题,并且在任何情况下,确实没有理由在MVC中使用FormCollection(您应该始终绑定到模型)。