Editar Request.Form antes Encadernação
-
05-07-2019 - |
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.
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)
{
...
}