6

sto usando Operazione filtro in MVC 3.Cambiare il modello in OnActionExecuting evento

La mia domanda è se posso lavorazione il modello prima che sia passato alla ActionResult nell'evento OnActionExecuting?

Ho bisogno di cambiare uno dei valori delle proprietà lì.

Grazie,

+0

Puoi spiegare perché dovresti farlo? Sospetto che ci sia un modo migliore per realizzare ciò di cui hai bisogno. – DMulligan

+0

Una delle proprietà del modello determina come sarà la vista: Editor o Display e voglio impostarlo in base alle autorizzazioni utente –

+0

perché si desidera mantenere qualcosa di simile in base alla proprietà del modello. invece dovresti controllare il permesso dell'utente all'interno della vista e decidere quale modello renderizzare (editor o display) –

risposta

24

Non c'è nessun modello ancora in caso OnActionExecuting. Il modello viene restituito dall'azione del controller. Quindi hai un modello all'interno dell'evento OnActionExecuted. È qui che puoi cambiare i valori. Per esempio, se si assume che la vostra azione di controllo ha restituito un ViewResult e la passò qualche modello ecco come si potrebbe recuperare questo modello e modificare alcune proprietà:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResultBase; 
     if (result == null) 
     { 
      // The controller action didn't return a view result 
      // => no need to continue any further 
      return; 
     } 

     var model = result.Model as MyViewModel; 
     if (model == null) 
     { 
      // there's no model or the model was not of the expected type 
      // => no need to continue any further 
      return; 
     } 

     // modify some property value 
     model.Foo = "bar"; 
    } 
} 

Se si desidera modificare il valore di alcune proprietà del modello vista viene passato come argomento di azione, quindi consiglierei di farlo in un raccoglitore di modelli personalizzato. Ma è anche possibile ottenerlo nell'evento OnActionExecuting:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var model = filterContext.ActionParameters["model"] as MyViewModel; 
     if (model == null) 
     { 
      // The action didn't have an argument called "model" or this argument 
      // wasn't of the expected type => no need to continue any further 
      return; 
     } 

     // modify some property value 
     model.Foo = "bar"; 
    } 
} 
+1

Grazie, davvero utile! –

+0

Ciao, forse sai come posso ottenere i parametri passati dell'azione come ActionDescriptor.ActionParameters nell'evento OnActionExecuting? –

+0

Ecco cosa ho mostrato nella mia risposta: 'filterContext.ActionParameters [" parameterName "]'. –

Problemi correlati