C# AllowTM不工作
我正在建立一个内容管理系统,允许我以外的人更新网站上的内容 我有一个面向前端的HTML表单,它通过AJAX将数据发送到控制器:C# AllowTM不工作,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正在建立一个内容管理系统,允许我以外的人更新网站上的内容 我有一个面向前端的HTML表单,它通过AJAX将数据发送到控制器: // CONTROLLER [ValidateInput(false)] public void CarAJAX() { CarAdmin CA = new CarAdmin(); CA.UpdateCar(System.Web.HttpContext.Current.Request); } 此数据将包含HTML,因此我的模型中不断出现错误: // M
// 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
}
}
}
//模型
使用制度;
使用System.Web;
使用System.Web.Mvc;
名称空间站点.Models
{
公营车
{
公共字符串id{get;set;}
[allowtml]
公共字符串HTML_Stuff{get;set;}
公共CarAdmin(){}
public void UpdateCar(HttpRequest请求)
{
HTML_Stuff=Request.Form[“HTML_Stuff”];//您应该按照-
使用所需的实体创建一个单独的类-
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
}
如果有帮助,请告诉我。尝试以下方法:
// 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
返回内容的好例子。我也有同样的问题。g> “requestValidationMode=“2.0”“已在web.config中设置,[AllowHtml]也已在适当的属性上设置,我仍然收到错误“检测到潜在危险的请求。表单值…”
但我观察到控制器方法实际上被调用(我能够调试该方法),因此这意味着验证实际上已关闭。在调用堆栈中,我注意到缓存周围反复出现类,如“System.Web.Caching.OutputCacheModule”这让我想到这与缓存有关我关闭了整个控制器,就像这样“[OutputCache(NoStore=true,Duration=0)]”
基于此,我还尝试将缓存的位置设置为OutputCacheLocation。无,这就成功了。因此,我最终得到了[OutputCache(NoStore=true,Duration=0,Location=OutputCacheLocation.None)]正在工作,最后没有验证我的请求,也没有使我的请求失败只需输入[ValidateInput(false)]在控制器上“不工作”,“我收到一个错误”:请更具体一点。你收到的错误可能重复?@ken2k我添加了错误:一个潜在危险的请求。检测到表单值。你必须在控制器内创建模型对象,并从请求中设置信息,因此从UpdateCar()中删除请求方法参数。然后根据set属性清理输入并将其推送到数据库。如何通过AJAX将模型发送到控制器?该方法将位于何处。我认为没有必要将模型传递给该方法。@TravisHeeter,您不需要!它需要表单元素的名称必须与该模型匹配。添加OutputCache属性控制器也对我有效,相当奇怪不知道为什么会有效,但它对我有效-谢谢!很棒的斯科特!太奇怪了。再加上我的1杯啤酒。(让我们开始一个新的stackexchange fork,名为BeerExchange。将啤酒作为解决方案。可能是一个巨大的赢家。)这在没有“requestValidationMode=”2.0的情况下有效…很好地解决了这个问题:)