2009-07-29 6 views
1

Existe-t-il un moyen d'éditer la Request.Form avant que la méthode d'action ne se lie aux paramètres? J'ai déjà un appel de réflexion pour permettre l'édition de Request.Form. Je ne peux pas trouver un point d'extensibilité où je peux le modifier avant que la liaison se produise. MISE À JOUR: Il semble donc que je modifiais Request.Form et que je ne m'en suis pas rendu compte. Je vérifiais en regardant les paramètres liés. Cela est incorrect b/c au moment où vous arrivez à l'ActionFilter les valeurs de formulaire ont déjà été copiées/définies sur/dans le ValueProvider. Ce que je crois est où les valeurs sont tirées pour la liaison. Donc, la question devient quelle est la meilleure façon d'appliquer un filtrage aux valeurs de formulaire avant qu'ils ne soient liés. Je veux toujours que la liaison se produise. Je veux juste éditer les valeurs qu'il utilise pour lier.Modifier une demande avant la liaison

Répondre

0

J'ai fini par étendre la méthode SetProperty sur la DefaultModelBinder pour vérifier la valeur avant de poursuivre le 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); 
    } 
} 
0

Créer un filtre personnalisé et passer outre OnActionExecuting():

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

Ou tout simplement passer outre 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) 
{ 
    ... 
} 
Questions connexes