我尝试从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}}属性,它始终为空。
答案 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;
}
答案 2 :(得分:1)
也许这对你有用:
filterContext.Result = new ViewResult { ViewName = "Exception", ViewData = new ViewDataDictionary(new CmsExceptionViewData(filterContext.Exception, action, controllerName, errorMessage)) };
因此ViewData是使用ViewDataDictionary创建的,它接受字典或模型。