Pregunta

¿Hay alguna manera de editar el Request.Form antes de que el método de acción se una a los parámetros? Ya tengo una llamada de reflexión para habilitar la edición de Request.Form. Simplemente no puedo encontrar un punto de extensibilidad donde pueda alterarlo antes de que se produzca el enlace.

ACTUALIZACIÓN: Parece que estaba editando el Request.Form y no me di cuenta. Estaba comprobando mirando los parámetros enlazados. Eso es incorrecto b / c cuando llega a ActionFilter los valores del formulario ya se han copiado / establecido en / en el ValueProvider. Que creo que es donde se extraen los valores para el enlace.

Entonces, la pregunta es cuál es la mejor manera de aplicar un filtro a los valores del formulario antes de que se unan. Todavía quiero que se produzca la unión. Solo quiero editar los valores que utiliza para vincular.

¿Fue útil?

Solución 2

Terminé extendiendo el método SetProperty en DefaultModelBinder para verificar el valor antes de continuar con el comportamiento base. Si el valor es una cadena, realizo mi filtrado.

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);
    }
}

Otros consejos

Cree un filtro personalizado y anule OnActionExecuting () :

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

O simplemente invalide OnActionExecuting () en su controlador

ACTUALIZADO:

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)
{
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top