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)] приписывать.

Другие вопросы по тегам