AllowHtml 不起作用

28 浏览
0 Comments

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,它似乎根本没有影响。

我是否遗漏了什么?

0
0 Comments

AllowHtml not working这个问题的出现的原因是没有正确使用[ValidateInput(false)]标签。解决方法是在控制器上添加[ValidateInput(false)]标签。

0
0 Comments

问题的原因是在代码中的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的示例。

0
0 Comments

问题出现的原因是在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""的情况下也起作用...很好地解决了那个问题 🙂

0