2010-08-25 113 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; 

}