2009-07-29 2 views
1

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

UPDATE: Похоже, я редактировал Request.Form и не осознавал этого. Я проверял, посмотрев на связанные параметры. Это неверно b/c к моменту поступления в ActionFilter значения формы уже были скопированы/установлены в/в ValueProvider. Я считаю, что значения привязаны для привязки.

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

ответ

0

я в конечном итоге расширения метод 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); 
    } 
} 
0

Создание пользовательского фильтра и переопределить 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) 
{ 
    ... 
}