mvc - первый "get" результат для request.params get исключение, второй "get" в порядке
mvc - первый результат "get" для request.params get исключение, второй "get" - это нормально. у меня есть страница с полем с текстом XML. Я использую валидацию = ложь. но на методе post в контроллере я пытаюсь получить требуемый набор параметров и получаю сообщение об ошибке "Обнаружено потенциально опасное значение 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 имеет параметр 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);
}
1 ответ
Если это ASP.NET MVC 3+, вы можете использовать [AllowHtml]
атрибут в свойстве модели, содержащий XML. Это отключит проверку запроса только для этого свойства, а не для всего запроса:
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 MVC 2, работающее в ASP.NET 4.0 в дополнение к украшению действия вашего контроллера с помощью [ValidateInput(false)]
Атрибут, который вам может понадобиться поместить в ваш файл web.config:
<httpRuntime requestValidationMode="2.0"/>
Если это приложение ASP.NET MVC 3, вам не нужно помещать эту строку в ваш web.config, чтобы использовать [ValidateInput(false)]
приписывать.