1

我想进入ViewBag过滤OnResultExecuted器。两个都

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

filterContext.Controller.ViewBag.Get

返回ViewBag在操作中分配。但我想ViewBag在“view.cshtml”获得分配。
我想要实现的是ViewBag从 razor 获得 .Title

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

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

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

任何帮助,将不胜感激。

4

1 回答 1

1

您不能将值从视图传递到控制器。它基本上是违反 MVC 模式的。当视图被执行时,它会获得自己的ViewData( ViewBag) 副本,因此对它的任何更改仅在视图范围内有效。

来自 Scott Guthrie 的博客:

视图不应包含任何应用程序逻辑或数据库检索代码,而是所有应用程序/数据逻辑应仅由控制器类处理。这种分区背后的动机是帮助强制将应用程序/数据逻辑与 UI 生成代码明确分离。这使得在与 UI 呈现逻辑隔离的情况下对应用程序/数据逻辑进行单元测试变得更加容易。

视图应该只使用控制器类传递给它的视图特定数据来呈现它们的输出。在 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 的值传递给您的操作执行过滤器,您必须在控制器范围内解决它。

于 2012-11-15T10:28:01.500 回答