ASP.NET MVC返回ViewResult

时间:2010-08-25 23:02:38

标签: c# asp.net-mvc

我尝试从ViewResult

中的OnActionExecuted方法覆盖中返回ActionFilterAttribute

如下所示......

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

返回到名为“Login”的视图很好,但我需要将模型对象传递给此视图(在这种情况下,模型对象是用户的类型),我不知道如何使用{传递它{1}}直接上课。

有什么想法吗?

更新: 我已将问题设置ViewResult解决为TRUE,但主要问题未解决,我无法设置filterContext.ExceptionHandled的{​​{1}}属性,它始终为空。

3 个答案:

答案 0 :(得分:10)

我遇到了同样的问题,我传递给View的Model总是为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;

}

答案 1 :(得分: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

答案 2 :(得分:1)

也许这对你有用:

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

因此ViewData是使用ViewDataDictionary创建的,它接受字典或模型。