AllowHtml 不起作用
AllowHtml 不起作用
我正在构建一个内容管理系统,允许其他人更新网站上的内容。
我有一个前端的HTML表单,通过AJAX将数据发送到一个控制器:
// CONTROLLER [ValidateInput(false)] public void CarAJAX() { CarAdmin CA = new CarAdmin(); CA.UpdateCar(System.Web.HttpContext.Current.Request); }
这些数据会包含HTML,所以我在我的模型中一直得到一个错误:
// MODEL using System; using System.Web; using System.Web.Mvc; namespace Site.Models { public class CarAdmin { public String id { get; set; } [AllowHtml] public String HTML_Stuff { get; set; } public CarAdmin(){} public void UpdateCar(HttpRequest Request) { HTML_Stuff = Request.Form["HTML_Stuff"]; // <-- 错误发生在这里!!!!!! // 清理和验证 String Select = String.Format("UPDATE Car Set HTML_Stuff = {0} WHERE id = {1}", HTML_Stuff, id); // 执行数据库命令 } } }
正如代码所示,当我尝试将一个成员设置为具有HTML的请求变量时,我会得到一个错误。
编辑:错误是“检测到一个潜在的危险的Request.Form值”
我尝试过以下方法:
- 更改web.config中的验证模式,但我不想改变整个网站的验证,只有一个变量会有HTML。
- 在模型中使用
[AllowHtml]
,然而我仍然得到相同的错误,好像[AllowHtml]
根本没有起作用。 - 在控制器中使用
[ValidateInput(false)]
,类似于AllowHtml
,它似乎根本没有影响。
我是否遗漏了什么?
问题的原因是在代码中的CarAdmin类中,HTML_Stuff属性没有使用[AllowHtml]属性标记,导致该属性的值无法在控制器中接收到。
解决方法是在CarAdmin类的HTML_Stuff属性上添加[AllowHtml]属性标记,以允许接收HTML内容。修改后的代码如下:
using System; using System.Web; using System.Web.Mvc; namespace Site.Models { public class CarAdmin { private string html; public String id { get; set; } [AllowHtml] public String HTML_Stuff { get { return html; } set { // sanitation and validation on "value" html = value; } } public CarAdmin(){} public void UpdateCar() { String Select = String.Format("UPDATE Car Set HTML_Stuff = {0} WHERE id = {1}", HTML_Stuff, id); // Execute DB Command } } }
此外,还有一个额外的提示是在方法内部进行验证可能不够好,最好在设置属性值时进行验证。
另外,根据研究,还需要使用AJAX将模型绑定到控制器。可以参考这个[示例](https://stackoverflow.com/questions/19121458)。根据您的代码范围,您可能还需要在控制器中返回一个ActionResult。可以参考[这里](https://msdn.microsoft.com/en-us/library/system.web.mvc.actionresult(v=vs.118).aspx)中返回ActionResult的示例。
问题出现的原因是在web.config中设置了requestValidationMode="2.0",并且在适当的属性上也设置了[AllowHtml],但是仍然出现了"检测到潜在危险的Request.Form值..."的错误。但是我观察到控制器方法实际上是被调用的(我能够调试该方法),这意味着验证实际上是关闭的。在调用堆栈中,我注意到了与缓存相关的类的重复出现,比如"System.Web.Caching.OutputCacheModule",这让我想到这可能与我在整个控制器上关闭的缓存有关,像这样"[OutputCache(NoStore = true, Duration = 0)]"。
基于此,我尝试将缓存的位置设置为OutputCacheLocation.None,这解决了问题。所以我最终设置了[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)],它可以正常工作,不再验证和拒绝我的请求。
对我来说,将OutputCache属性添加到控制器中也起作用了,这真是奇怪。
不知道为什么这样做会起作用,但是对我来说,这解决了问题-谢谢!
太奇怪了。给我来一杯啤酒。 (我们来创建一个名为BeerExchange的新的StackExchange分支吧。为解决方案奖励啤酒。可能会大获成功。)
这个方法在没有"requestValidationMode="2.0""的情况下也起作用...很好地解决了那个问题 🙂