Отредактируйте запрос.Заполните форму перед привязкой
-
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)
{
...
}