Pergunta

Existe uma maneira de editar o Request.Form antes dos vínculos método de ação para os parâmetros? Eu já tenho uma chamada de reflexão para permitir a edição de Request.Form. Eu simplesmente não consigo encontrar um ponto de extensibilidade onde posso alterá-lo antes de ligação ocorre.

UPDATE: Portanto, parece que eu estava editando o Request.Form e não percebem isso. Eu estava verificando olhando os parâmetros vinculados. Isso está incorreta b / c pelo tempo que você chegar ao ActionFilter os valores do formulário já foram copiados / set para / na ValueProvider. Que, creio, é o lugar onde os valores são puxados para a ligação.

Portanto, a questão torna-se qual é a melhor maneira de aplicar alguns filtros para os valores do formulário antes de serem ligados. Eu ainda quero a ligação para ocorrer. Eu só quero editar os valores que ele usa para bind.

Foi útil?

Solução 2

acabei estendendo o método SetProperty no DefaultModelBinder para verificar o valor antes de prosseguir com o comportamento base. Se o valor for uma string eu executar o meu filtragem.

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

Outras dicas

Criar filtro personalizado e OnActionExecuting() substituição:

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

Ou simplesmente OnActionExecuting() override em seu controlador

ATUALIZADO:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top