Отредактируйте запрос.Заполните форму перед привязкой

StackOverflow https://stackoverflow.com/questions/1202495

  •  05-07-2019
  •  | 
  •  

Вопрос

Есть ли способ отредактировать запрос.Форма до того, как метод действия будет привязан к параметрам?У меня уже есть вызов reflection, чтобы включить редактирование Request.Form.Я просто не могу найти точку расширения, где я мог бы изменить ее до того, как произойдет привязка.

Обновить:Похоже, я редактировал запрос.Форма и не осознавал этого.Я проверял, посмотрев на связанные параметры.Это неверно, потому что к тому времени, когда вы перейдете к ActionFilter, значения формы уже были скопированы / установлены в /в ValueProvider.Который, я полагаю, является местом, где извлекаются значения для привязки.

Таким образом, возникает вопрос, каков наилучший способ применить некоторую фильтрацию к значениям формы до того, как они будут привязаны.Я все еще хочу, чтобы привязка произошла.Я просто хочу отредактировать значения, которые он использует для привязки.

Это было полезно?

Решение 2

Я закончил тем, что расширил метод SetProperty для DefaultModelBinder, чтобы проверить значение, прежде чем продолжить базовое поведение. Если значение является строкой, я выполняю фильтрацию.

public class ScrubbingBinder : DefaultModelBinder
{
    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
    {
        if (value.GetType() == typeof(string))
            value = HtmlScrubber.ScrubHtml(value as string, HtmlScrubber.SimpleFormatTags);
        base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
    }
}

Другие советы

Создайте пользовательский фильтр и переопределите его OnActionExecuting():

public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

Или просто переопределить OnActionExecuting() в вашем контроллере

ОБНОВЛЕННЫЙ:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var actionName = filterContext.ActionDescriptor.ActionName;

    if(String.Compare(actionName, "Some", true) == 0 && Request.HttpMethod == "POST")
    {  
        var form = filterContext.ActionParameters["form"] as FormCollection;

        form.Add("New", "NewValue");
    }
}

public ActionResult SomeAction(FormCollection form)
{
    ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top