2010-08-25 14 views
7

ich eine ViewResult in OnActionExecuted Methodenüberschreibung von ActionFilterAttribute KlasseASP.NET MVC Rückkehr Viewresult

Wie unten zurückzukehren versuchen ...

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); 
    } 

Es funktioniert auf eine Ansicht zurückzukehren namens „Login“ , aber ich muss das Modellobjekt an diese Ansicht übergeben (in diesem Fall ist das Modellobjekt eine Art von Benutzern) und ich weiß nicht, wie ich es mit der Klasse übergeben soll.

Irgendwelche Ideen?

AKTUALISIERT: Ich habe mein Problem gelöst filterContext.ExceptionHandled auf TRUE, aber das Hauptproblem nicht gelöst wurde, kann ich nicht Model Eigenschaft View, ist es immer null.

+0

Bitte zeigen Sie den Code an, der * nicht * funktioniert. – bzlm

+0

Der Code ist oben.Wenn ich ViewResult Login im obigen Code zurücksende, muss ich das Modell auch an View übergeben, da sonst die View eine Ausnahme auslöst, weil Model null ist. Problem ist, dass ich das Modell nicht auf diese View setzen kann. – ozsenegal

Antwort

2

Ich kann mich irren, aber ich glaube, dass die Ansicht Daten Teil der Controller-Basis und nicht tatsächlich Teil der Ansicht selbst ist. So sollten Sie in der Lage sein, die View-Daten zu setzen, indem so tun:

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

ich gerade getestet und das funktionierte für mich. Ich sehe keinen Grund, warum es nicht für Sie arbeiten sollten:

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

     viewModel.FirstName = "TestFilter"; 

     filterContext.Controller.ViewData.Model = viewModel; 
    } 

Referencing documentation

+0

wow, ich dachte, es funktioniert, aber nein, das Modell ist immer Null in der Ansicht – ozsenegal

+0

@ozsenegal In Ihrem Beispiel sind Sie in der OnActionExecuted-Ereignis, aber sind Sie sicher, dass Sie in Ihrem tatsächlichen Code drin sind? Ihre Ansichtdaten sollten an dieser Stelle zugänglich sein. – joshlrogers

+0

Ja, ich bin sicher. Die Anzeige von Daten ist so möglich, wie Sie es anzeigen, aber in der Ansicht behält die Modelleigenschaft null – ozsenegal

1

Vielleicht für Sie arbeiten:

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

So ist die Viewdata mit einem Viewdatadictionary erstellt Das akzeptiert entweder ein Wörterbuch oder ein Modell.

9

Ich lief in das gleiche Problem, wo mein Modell, das an die Ansicht übergeben wurde, immer NULL war. Ich war in der Lage, das Modell zu meiner Ansicht mit den folgenden zu übergeben:

Erstellen Sie Ihr ViewModel und legen Sie die Eigenschaften fest. Erstellen Sie ein neues ViewResult, geben Sie ihm den Namen Ihrer View und übergeben Sie dann Ihr viewModel in 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; 

}