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中的一些帖子后:
- AllowHtml属性不工作
- AllowHtml属性不工作
- AllowHtml不工作
我知道必须做以下工作,以确保AllowHtml
属性的工作:
- 在web.config 中使用
- 清空模型传递和使用的控制器缓存
[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
<httpRuntime requestValidationMode="2.0" />
因此,我在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。
显示在页面上。为什么会这样呢?
抛出异常,因为您在Edit()
方法中包含了一个额外的参数FormCollection collection
。
当您应用[AllowHtml]
属性时,它将属性ModelMetadata
的RequestValidationEnabled
属性设置为false
。在模型绑定过程中,DefaultModelBinder
检查这个值,因为它是false
,所以绑定到模型时不会抛出异常。
但是,FormCollection
只是一个NameValueCollection
,通过读取Request.Form
的值来填充。没有模型和关联的元数据,因此抛出异常。如果您要使用
var barField= Request["BarField"];
虽然使用Request
的Unvalidated
属性也可以
var barField = Request.Unvalidated.Form["BarField"];
您也可以通过将[ValidateInput(false)]
属性应用于方法来使其工作,但这将适用于整个模型,并且是禁用请求验证的最不安全的方法。
删除Edit()
方法中的FormCollection collection
参数将解决问题,并且在任何情况下,确实没有理由在MVC中使用FormCollection
(您应该始终绑定到模型)。