2010-08-25 7 views
7

J'essaie de retourner un ViewResult dans OnActionExecuted méthode remplacement de ActionFilterAttribute classeASP.NET MVC retour ViewResult

comme ci-dessous ...

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    if (CreateCookie && filterContext.Exception == null) 
    { 
     LoginCookies lcookie = new LoginCookies(usuDs, usuSenha); 
     lcookie.WriteCookie("SCE", 10); 
    } 
    else 
    { 
     filterContext.Result = new ViewResult() { ViewName = "Login" }; 
     filterContext.Result.ExecuteResult 
       (filterContext.Controller.ControllerContext); 
    } 

Il fonctionne très bien pour revenir à une vue appelée « Connexion » , mais j'ai besoin de passer l'objet modèle à cette vue (dans ce cas, l'objet modèle est le type d'utilisateurs) et je ne sais pas comment le transmettre en utilisant la classe ViewResult directement.

Des idées?

mise à jour: J'ai résolu mon problème à la mise en filterContext.ExceptionHandled vrai, mais le principal problème était pas résolu, je ne peux pas mettre Model propriété de View, il est toujours nul.

+0

Veuillez indiquer le code * ne fonctionne pas. – bzlm

+0

Le code est ci-dessus.Lorsque je renvoie ViewResult Login dans le code ci-dessus, j'ai besoin de passer le modèle à View, sinon la vue renvoie une cause d'exception Model is null.Problem est je ne peux pas définir le modèle à cette vue. – ozsenegal

Répondre

2

Je peux me tromper, mais je crois que les données de vue font partie de la base du contrôleur et ne font pas réellement partie de la vue elle-même. Donc, vous devriez être en mesure de définir les données de vue en faisant tels:

filterContext.Controller.ViewData.Model = <your view model> 

Je viens de tester et cela a fonctionné pour moi. Je ne vois aucune raison pour laquelle il ne devrait pas travailler pour vous:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     TestClass1 viewModel = new TestClass1(); 

     viewModel.FirstName = "TestFilter"; 

     filterContext.Controller.ViewData.Model = viewModel; 
    } 

Referencing documentation

+0

wow, je pensais que cela fonctionne, mais non, ce modèle est toujours nul dans la vue – ozsenegal

+0

@ozsenegal Dans votre exemple, vous êtes dans l'événement OnActionExecuted, mais êtes-vous sûr que vous êtes dans votre code réel? Votre viewdata devrait être accessible à ce stade. – joshlrogers

+0

oui, je suis sûr que les données affichées sont accessibles comme vous le montrez, mais dans la vue la propriété du modèle reste nulle – ozsenegal

1

Peut-être que cela fonctionne pour vous:

filterContext.Result = new ViewResult { ViewName = "Exception", ViewData = new ViewDataDictionary(new CmsExceptionViewData(filterContext.Exception, action, controllerName, errorMessage)) }; 

Ainsi, le ViewData est créé avec un ViewDataDictionary qui accepte soit un dictionnaire ou un modèle.

9

J'ai rencontré le même problème où mon modèle transmis à la vue était toujours NULL. J'ai été en mesure de passer le modèle à mon point de vue avec ce qui suit:

Créez votre viewModel et définir les propriétés. Créez un nouveau ViewResult en lui donnant le nom de votre View, puis passez votre ViewModel à ViewData.

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 

    TestViewModel viewModel = new TestViewModel; 

    //Here set all the properties of your viewModel such as your exception message 

    filterContext.Controller.ViewData.Model = viewModel; 
    filterContext.Result = new ViewResult { ViewName = "Login", ViewData = new ViewDataDictionary(viewModel)}; 
    filterContext.ExceptionHandled = true; 

} 
Questions connexes