2009-08-28 6 views
0

J'ai créé un filtre OnActionExecuted pour remplir certains attributs viewmodel avec des données de db (je n'utilise pas ViewData ["somekey"], préférant plusieurs ViewModels descendant de un ancêtre commun).ASP.NET MVC: Ne pas exécuter les filtres d'action sur la redirection et lancer HttpException

public class BaseController : Controller 
{ 
    protected DataClassesDataContext context = new DataClassesDataContext(); 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     ViewModel model = (ViewModel) ViewData.Model; 
     model.IsUserAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated; 
     if (model.IsUserAuthenticated) 
     { 
      model.UserName = filterContext.HttpContext.User.Identity.Name; 
     } 
     model.CommonAttribute = from c in context.Something select new SomethingElse() {...}; 
    } 
} 

Le problème est que lorsqu'un action se traduit par une redirection ou une erreur 404, OnActionExecuted tente d'accéder à ViewModel, qui n'a pas été initialisé. En outre, il est complètement inutile de remplir ces valeurs, car elles ne seront pas utilisées, puisqu'une autre action va être appelée.

Comment puis-je éviter de remplir le viewodel en cas de redirection?

Répondre

2

Une solution triviale serait de ne pas remplir le modèle quand il n'existe pas:

ViewModel model = ViewData.Model as ViewModel; 
if (model != null) 
{  
    model.IsUserAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated; 
    if (model.IsUserAuthenticated) 
    { 
     model.UserName = filterContext.HttpContext.User.Identity.Name; 
    } 
    model.CommonAttribute = from c in context.Something select new SomethingElse() {...}; 
} 
+0

pourquoi pas? Merci – giorgian

Questions connexes