2010-08-25 124 views
7

我試圖從ActionFilterAttributeASP.NET MVC返回的ViewResult

像下面返回ViewResultOnActionExecuted方法重寫......

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

它工作正常,返回到一個名爲「登錄」的看法,但我需要將模型對象傳遞給此視圖(在這種情況下,模型對象是用戶類型),我不知道如何直接使用ViewResult類來傳遞它。

任何想法?

更新: 我解決我的問題設置filterContext.ExceptionHandled爲TRUE,但沒有解決的主要問題,我無法設置的ViewModel財產,它始終是零。

+0

請顯示*不*工作的代碼。 – bzlm 2010-08-26 15:51:23

+0

代碼在上面。當我在上面的代碼中返回ViewResult Login時,我需要將模型傳遞給View,否則視圖拋出異常原因模型爲null。問題是我無法將模型設置爲此視圖。 – ozsenegal 2010-08-26 17:37:58

回答

2

我可能會誤解,但我相信視圖數據是控制器基礎的一部分,實際上並不是視圖本身的一部分。所以你應該可以通過這樣設置視圖數據:

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

我剛剛測試過,這對我有用。我看不出有任何理由不應該爲你工作:

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

     viewModel.FirstName = "TestFilter"; 

     filterContext.Controller.ViewData.Model = viewModel; 
    } 

Referencing documentation

+0

哇,我認爲它的工作原理,但不是,模型在視圖中始終爲空 – ozsenegal 2010-08-25 23:39:39

+0

@ozsenegal在您的示例中,您處於OnActionExecuted事件中,但是您確定自己在實際代碼中?您的viewdata應該可以在此處訪問。 – joshlrogers 2010-08-26 00:09:54

+0

是的,即時通訊。查看數據是不可見的,但在視圖中,模型屬性爲空 – ozsenegal 2010-08-26 00:13:02

1

也許這會爲你工作:

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

所以ViewData的用的ViewDataDictionary創建它接受字典或模型。

9

我遇到了同樣的問題,我的模型被傳遞給視圖始終爲NULL。我能夠通過以下模型傳遞給我的觀點:

創建您的viewModel並設置屬性。創建一個新的ViewResult,爲其提供View的名稱,然後將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; 

}