2010-02-16 4 views
1

J'essaie de renvoyer une vue différente si une condition est remplie. Je veux préserver le modèle passé dans la vue depuis l'action.Comment retourner une vue différente, mais conserver ViewModel dans OnActionExecuting

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var subAction = filterContext.RequestContext.RouteData.Values["subaction"].ToString(); 
     var action = filterContext.RequestContext.RouteData.Values["action"].ToString(); 

     if (!string.IsNullOrEmpty(subAction)) 
     { 
      var view = (ViewResultBase) (filterContext.Result); 
      filterContext.Result = View(action + subAction, view.ViewData.Model); 
     } 

     base.OnActionExecuting(filterContext); 
    } 

Quand vous faites cette façon, je reçois un "Object reference not set to an instance of an object.". De toute évidence, le modèle n'a pas été défini?

La raison pour laquelle je le fais de cette façon, c'est que je veux garder le nom de la vue aussi simple que possible. Et mon URL ressemble à ceci: /Global/Modules/Admin/Users/Create. Cela retournerait la vue "UsersCreate". Ce qui fonctionne Mais le modèle est vide ou nul!

MISE À JOUR

fait. Ça m'a juste frappé. Le comportement est correct. Parce que je ne fais que retourner une vue. L'action n'est jamais exécutée. L'action Users est exécutée, mais renvoie la vue UsersCreate. Comment puis-je faire un peu une chose RedirectToAction, sans réellement rediriger.

Répondre

1

OnActionExecuting est exécuté avant l'action, donc aucun modèle n'existe encore. Vous pouvez essayer avec OnActionExecuted qui est appelée une fois que l'action renvoie un ActionResult.

+0

Mais alors il est trop tard pour changer la vue. Je reçois un 'L'élément de modèle passé dans le dictionnaire est de type [..]'. Les données transmises sont une liste d'utilisateurs. Je passe une classe viewmodel 'UsersCreate'. La liste des utilisateurs est le modèle de la vue 'Users'. – Kordonme

+0

En fait. Ça m'a juste frappé. Le comportement est correct. Parce que je ne fais que retourner une vue. L'action n'est jamais exécutée. L'action 'Users' est exécutée, mais renvoie la vue' UsersCreate'. Comment puis-je faire une chose de type RedirectToAction, sans réellement rediriger. – Kordonme

0
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ... 
    if (needToRedirect) 
    { 
     ... 
     filterContext.Result = new RedirectResult(url); 
     return; 
    } 
    ... 
} 
Questions connexes