AllowHtml不起作用

本文关键字:不起作用 AllowHtml | 更新日期: 2023-09-27 18:00:23

我正在构建一个内容管理系统,允许除我之外的其他人更新网站上的内容。

我有一个面向前台的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"]; // <-- ERROR HAPPENS HERE!!!!!!
            // sanitation and validation
            String Select = String.Format("UPDATE Car Set HTML_Stuff = {0} WHERE id = {1}", HTML_Stuff, id);
            // Execute DB Command
        }
    }
}

如代码所示,当我试图将一个成员设置为具有HTML的请求变量时,我遇到了一个错误。

编辑:错误为"潜在危险的请求。检测到表单值"

以下是我尝试过的:

  • 更改web.config中的验证模式,但我不想更改整个网站的验证,因为只有一个变量具有HTML。

  • 模型中的[AllowHtml],但是我仍然得到相同的错误——就好像[AllowHtml]什么都没做一样。

  • 控制器中的[ValidateInput(false)],类似于AllowHtml,似乎没有任何影响。

我是不是遗漏了什么?

AllowHtml不起作用

我也遇到了同样的问题"requestValidationMode="2.0"是在web.config中设置的,[AllowHtml]也是在正确的属性上设置的,但我仍然收到错误"检测到潜在危险的Request.Form值…"。

但我观察到控制器方法实际上被调用了(我能够调试该方法),所以这意味着验证实际上被关闭了。在调用堆栈中,我注意到缓存周围的类重复出现,如"System.Web.Caching.OutputCacheModule",这让我产生了一种想法,认为这与缓存有关我关闭了整个控制器,如"[OutputCache(NoStore=true,Duration=0)]"

基于此,我还尝试将缓存的Location设置为OutputCacheLocation。None,这就成功了。因此,我最终得到了[OutputCache(NoStore=true,Duration=0,Location=OutputCacheLocation.None)]工作,最终没有验证和失败我的请求

试试这个:

// CONTROLLER
[HttpPost]
public ActionResult CarAJAX(CarAdmin model)
{
    model.UpdateCar();
}
// MODEL
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将模型绑定到控制器。请看这个例子。我不确定您的代码的范围,但我认为您还需要ActionResult在控制器内返回。有一些很好的例子说明了从ActionResult返回什么。

只需在控制器上设置[ValidateInput(false)]

您应该将其作为-

创建一个具有所需实体的单独类-

public class EntityDto {
        public String id { get; set; }
        [AllowHtml]
        public String HTML_Stuff { get; set; }
}

然后在你的控制器方法中使用它-

[ValidateInput(false)]
public void UpdateCar(EntityDto model)
{
    var html_stuff = model.HTML_Stuff; 
    // sanitation and validation
    String Select = String.Format("UPDATE Car Set HTML_Stuff = {0} WHERE id = {1}", html_stuff , id);
    // Execute DB Command
}

如果有帮助,请告诉我。