Question

Existe-t-il un moyen de modifier Request.Form avant que la méthode d'action ne soit liée aux paramètres? J'ai déjà un appel de réflexion pour activer l'édition de Request.Form. Je n'arrive pas à trouver un point d'extensibilité où je puisse le modifier avant que la liaison ne se produise.

UPDATE: Il semble donc que je modifiais Request.Form sans le savoir. Je vérifiais en regardant les paramètres liés. Cela est incorrect b / c au moment où vous arrivez à ActionFilter, les valeurs de formulaire ont déjà été copiées / définies dans / dans le fournisseur de valeur. Ce qui, à mon avis, est le lieu où sont tirées les valeurs pour la liaison.

La question est donc de savoir quel est le meilleur moyen d'appliquer un filtrage aux valeurs de formulaire avant qu'elles ne soient liées. Je veux toujours que la liaison se produise. Je veux juste éditer les valeurs qu'il utilise pour se lier.

Était-ce utile?

La solution 2

J'ai fini par étendre la méthode SetProperty sur le DefaultModelBinder afin de vérifier la valeur avant de passer au comportement de base. Si la valeur est une chaîne, j'effectue mon filtrage.

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

Autres conseils

Créez un filtre personnalisé et remplacez OnActionExecuting () :

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

Ou simplement remplacer OnActionExecuting () dans votre contrôleur

MISE À JOUR:

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)
{
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top