2012-02-09 19 views
9

Ho il seguente:OnActionExecuting aggiungere a modello prima di arrivare all'azione

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     var model = filterContext.Controller.ViewData.Model as BaseViewModel; 

     if (model == null) 
     { 
      model = new BaseViewModel(); 
      filterContext.Controller.ViewData.Model = model; 
     } 

     model.User = (UserPrincipal)filterContext.HttpContext.User; 
     model.Scheme = GetScheme(); 
    } 

Ora passando attraverso che posso vedere l'utente e lo schema del modello vengono popolati.

Quando arrivo all'azione, tuttavia, sono entrambi nulli?

Cosa sto facendo di sbagliato qui?

E aggiungendo a questo, è questo il modo corretto di aggiungere al modello?

Ecco il codice del controller:

[InjectStandardReportInputModel] 
public ActionResult Header(BaseViewModel model) 
{ 
    //by this point model.Scheme is null!! 

} 
+0

potrebbe anche pubblicare il tuo codice di 'Controller'? Sei sicuro di aver aggiunto l'attributo 'alla definizione' class' o all'appropriato 'action'/s? – xandercoded

+0

aggiunto codice azione - stai dicendo che dovrebbe funzionare? ... – iwayneo

+0

Lo stesso problema è discusso qui http://stackoverflow.com/questions/4766156/all-viewmodels-inherit-from-baseviewmodel-can-i-set -questo-up-in-onactionexecut –

risposta

7

Controller.ViewData.Model non è popolando parametri di azione in asp.net MVC. Quella proprietà viene utilizzata per passare i dati dall'azione alla vista.

Se per qualche ragione non si desidera utilizzare personalizzato modello Binder (che è lo standard, così che luccica di popolamento parametri di azione in asp.net-MVC), si potrebbe si ActionExecutingContext.ActionParameters Property

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.ActionParameters["model"] = new BaseViewModel(); 
     // etc 
    } 
+1

odio davvero ammetterlo ma per gli altri fare lo stesso errore: in realtà ho iniziato a utilizzare questo metodo, e quando ho aggiunto l'attributo ad un'altra azione ha smesso di funzionare. la ragione? Ho chiamato il mio modello "input" su questa azione! ora ho un controllo e lancio se l'attributo è aggiunto a un'azione con un modello con nome errato :) – iwayneo

+0

@iwayneo perché non dovresti usare Model Binder personalizzato? – archil

2

Bit ritardo per la risposta, ma sarà utile per gli altri. possiamo ottenere il valore del modello in OnActionExecuting semplicemente decorando il nostro attributo un po 'di più.

QUESTO E 'il nostro filtro CLASSE

public sealed class TEST: ActionFilterAttribute 
{ 

    /// <summary> 
    /// Model variable getting passed into action method 
    /// </summary> 
    public string ModelName { get; set; } 

    /// <summary> 
    /// Empty Contructor 
    /// </summary> 
    public TEST() 
    { 
    } 

    /// <summary> 
    /// This is to get the model value by variable name passsed in Action method 
    /// </summary> 
    /// <param name="modelName">Model variable getting passed into action method</param> 
    public TEST(string modelName) 
    { 
     this.ModelName = modelName; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var result = filterContext.ActionParameters.SingleOrDefault(ap => ap.Key.ToLower() == ModelName.ToString()).Value; 
    } 

} 

    THIS IS OUR ACTION METHOD PLEASE NOTE model variable has to be same 
    [HttpPost] 
    [TEST(ModelName = "model")] 
    public ActionResult TESTACTION(TESTMODEL model) 
    { 
    } 

E questo è tutto ..... SI PREGA DI VOTO SE TI PIACE LA RISPOSTA

Problemi correlati