2009-06-08 12 views
7

Uso visualizzazioni fortemente tipizzate in cui tutti i ViewModels ereditano una classe BaseViewModel.Come impostare i dati del modello in ActionFilterAttribute quando si utilizza una vista digitata

In un filtro di azione che decora tutti i controller, desidero utilizzare il modello.

In questo momento posso accedere solo in questo modo:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     ViewModelBase model = (ViewModelBase)filterContext.ActionParameters["viewModel"]; 
     base.OnActionExecuting(filterContext); 
    } 

Il problema è, che devo conoscere la chiave "ViewModel". La chiave è ViewModel, perché nel mio controller ho usato:

ritorno View ("MyView", ViewModel)

C'è un modo più sicuro per accedere alle modello?

risposta

14

OnActionExecuting funziona immediatamente prima dell'esecuzione dell'azione, pertanto il modello è impostato su null. Si potrebbe accedere al tuo Viewdata (o ViewData.Model) in OnActionExecuted:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    var model = filterContext.Controller.ViewData.Model as YourModel; 

    ... 
} 

Spero che questo aiuti

+0

Questo ha senso. Parte del mio filtro può accedere ai valori dalla rotta e deve essere conosciuta prima dell'esecuzione dell'azione. Ho ancora questa parte in OnActionExecuting. Il resto è ora in OnActionExecuted. –

4

Puoi utente questo anche in OnActionExecuting:

BaseModel model = filterContext.ActionParameters.SingleOrDefault(m => m.Value is BaseModel).Value as BaseModel; 

Spero che questo aiuti

1

Questa è una vecchia domanda, ma ora sono in grado di accedere al modello durante OnActionExecuting:

var model = filterContext.ActionParameters["model"] as CustomerModel; 
Problemi correlati