mvc - request.params的第一个“get”结果获得异常,第二个“get”就可以了。 我有一个页面,其中包含一个包含xml文本的字段。 我正在使用validation = false。 但是,在控制器中的post方法我试图得到requset.params,我得到一个错误 “从客户端检测到一个潜在危险的Request.Form值”。经过一些挖掘和调试后,我看到第一次尝试获取request.params我得到一个异常,但是当我第二次尝试得到它时一切正常。
这是我用来避免xml问题的过滤器(我将其转换为二进制数据并清空xml字符串字段):
public class RestAPIAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
((SimulationModel)filterContext.ActionParameters["model"]).Data = CommonConverters.StringToByteArray(((SimulationModel)filterContext.ActionParameters["model"]).StringData);
((SimulationModel)filterContext.ActionParameters["model"]).StringData = string.Empty;
base.OnActionExecuting(filterContext);
}
}
这是post方法:
[HttpPost]
[ValidateInput(false)]
[RestAPIAttribute]
public ActionResult EditSimulation(Guid id, SimulationModel model)
{
try
{
model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
}
catch (Exception ex)
{
Logger.LogException(ex);
}
/* more code here*/
return View(newModel);
}
现在,你可以看到RelationModel的一个constuctor有一个request.param参数给了我这个问题。
我目前解决此问题的方法只是调用它两次(但我正在寻找更好的解决方案或至少是解释):
[HttpPost]
[ValidateInput(false)]
[RestAPIAttribute]
public ActionResult EditSimulation(Guid id, SimulationModel model)
{
try
{
try
{
model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
}
catch
{
model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
}
}
catch (Exception ex)
{
Logger.LogException(ex);
}
/* more code here*/
return View(newModel);
}
答案 0 :(得分:1)
如果这是ASP.NET MVC 3+,您可以在包含XML的模型属性上使用[AllowHtml]
属性。这将仅禁用此属性的请求验证,而不是整个请求:
public class SimulationModel
{
[AllowHtml]
public string StringData { get; set; }
}
然后:
[HttpPost]
public ActionResult EditSimulation(Guid id, SimulationModel model)
{
// you could directly use model.StringData here without any
// encoding needed
return View(newModel);
}
如果这是在ASP.NET 4.0中运行的ASP.NET MVC 2应用程序,除了使用[ValidateInput(false)]
属性修改控制器操作外,您可能需要将以下内容放在web.config中:
<httpRuntime requestValidationMode="2.0"/>
如果是ASP.NET MVC 3应用程序,则无需将此行放在web.config中以使用[ValidateInput(false)]
属性。