Domanda

Esiste un modo per modificare Request.Form prima che il metodo di azione si associ ai parametri? Ho già una chiamata di riflessione per abilitare la modifica di Request.Form. Non riesco proprio a trovare un punto di estensibilità in cui posso modificarlo prima che si verifichi l'associazione.

AGGIORNAMENTO: Quindi sembra che stavo modificando il Request.Form e non me ne sono reso conto. Stavo verificando guardando i parametri associati. Questo è b / c errato quando si arriva ad ActionFilter i valori del modulo sono già stati copiati / impostati su / in ValueProvider. Il che credo sia il punto in cui i valori vengono estratti per l'associazione.

Quindi la domanda diventa qual è il modo migliore per applicare alcuni filtri ai valori del modulo prima che vengano associati. Voglio ancora che si verifichi l'associazione. Voglio solo modificare i valori che usa per associare.

È stato utile?

Soluzione 2

Ho finito per estendere il metodo SetProperty su DefaultModelBinder per verificare il valore prima di procedere con il comportamento di base. Se il valore è una stringa, eseguo il mio filtro.

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

Altri suggerimenti

Crea filtro personalizzato e sovrascrivi OnActionExecuting () :

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

O semplicemente sovrascrivi OnActionExecuting () nel tuo controller

AGGIORNAMENTO:

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)
{
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top