在OnResultExecuted过滤器上获取ViewBag

时间:2012-11-14 14:06:05

标签: asp.net-mvc razor asp.net-mvc-4

我想ViewBag过滤OnResultExecuted。两者

((ViewResultBase)filterContext.Result).ViewBag.Get

filterContext.Controller.ViewBag.Get

返回在操作时分配的ViewBag。但是我希望在“view.cshtml”中分配ViewBag 我想要的是获得ViewBag。来自剃刀的标题

@{
ViewBag.Title = "My Title";
}

然后,将其作为javascript写入响应文本的末尾。这在@Ajax.ActionLink()情况下很有用。我的OnActionExecuted过滤器代码必须如此:

string scriptText = "<script type='text/javascript'>document.title = '" + ViewBag.Title + "';</script>";
filterContext.HttpContext.Response.Write(scriptText);

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您无法将值从视图传递到控制器。它基本上是针对MVC模式的。执行视图时,它会获得ViewDataViewBag)的副本,因此对它的任何更改仅在视图范围内有效。

来自Scott Guthrie的博客:

  

视图不应包含任何应用程序逻辑或数据库检索   代码,而不是所有的应用程序/数据逻辑应该只由   控制器类。这种分区背后的动机是帮助   强制清楚地将您的应用程序/数据逻辑与UI分离   代码。这样可以更轻松地进行单元测试   应用程序/数据逻辑与UI呈现逻辑隔离开来。

     

视图应仅使用特定于视图的数据呈现其输出   由Controller类传递给它。在我们的ASP.NET MVC框架中   将此视图特定数据称为“ViewData”。本博文的其余部分   将介绍一些您可以使用的不同方法   这个“ViewData”从Controller到View渲染。

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx

类似的问题和解释也在这里:Setting ViewData item in a Partial to be read in a View

如此接近你的问题。您无法将Title的值传递给您的操作执行过滤器,您必须在控制器的范围内解决它。