我想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);
任何帮助都将不胜感激。
答案 0 :(得分:1)
您无法将值从视图传递到控制器。它基本上是针对MVC模式的。执行视图时,它会获得ViewData
(ViewBag
)的副本,因此对它的任何更改仅在视图范围内有效。
来自Scott Guthrie的博客:
视图不应包含任何应用程序逻辑或数据库检索 代码,而不是所有的应用程序/数据逻辑应该只由 控制器类。这种分区背后的动机是帮助 强制清楚地将您的应用程序/数据逻辑与UI分离 代码。这样可以更轻松地进行单元测试 应用程序/数据逻辑与UI呈现逻辑隔离开来。
视图应仅使用特定于视图的数据呈现其输出 由Controller类传递给它。在我们的ASP.NET MVC框架中 将此视图特定数据称为“ViewData”。本博文的其余部分 将介绍一些您可以使用的不同方法 这个“ViewData”从Controller到View渲染。
类似的问题和解释也在这里:Setting ViewData item in a Partial to be read in a View
如此接近你的问题。您无法将Title的值传递给您的操作执行过滤器,您必须在控制器的范围内解决它。