ASP .NET MVC 5 过滤器获取 View.ViewBag 数据
ASP .NET MVC 5 Filter get View.ViewBag data
我需要记录所有 GET 请求 url + page.Title。 _Layout.cshtml 中的页面标题设置为
<title>@ViewBag.Title - @S.AppName</title>
ViewBag.Title 设置在 View.cshtml
ViewBag.Title = S.MemberDayReports;
我尝试使用自定义 ActionFilterAttribute。在 OnResultExecuted(..) 中 ViewBag.Title 为空。
我尝试在控制器 OnResultExecuted 中覆盖,但 ViewBag.Title 为空。
如何拦截查看输出和日志ViewBag.Title?
Viewbag主要用途是controller来查看通信。 redirection.TempData 保留 HTTP 请求时间的信息后,值设置为空。这意味着只能从一页到 another.Tye 使用临时数据。
或者您也可以在每个 post/get 中更新标题的静态变量。为此,您可以使用过滤器来跟踪当前和最后的数据。 ViewBag 无法满足您的要求。
MSDN 中的 ViewBag
描述描述了 ViewBag 的用途:
The ViewBag property enables you to dynamically share values from the
controller to the view. It is a dynamic object which means it has no
pre-defined properties. You define the properties you want the ViewBag
to have by simply adding them to the property. In the view, you
retrieve those values by using same name for the property.
如果您在视图中更改 ViewBag
的 属性,则不会返回到管道,并且在过滤器或控制器中都不可见。
作为解决方法,您可以在视图中设置 Title
属性 - 在这种情况下,它将在过滤器和控制器中都可见:
public ActionResult Index()
{
ViewBag.Title = "Your title";
return View();
}
覆盖 WebViewPage
public abstract class WebViewPageAdv<T> : WebViewPage<T>
{
public string Title
{
get
{
var title = String.Format("{0} - {1}", ViewBag.Title, S.AppName);
//Because Title get in _Layout.cshtml its full page load
//and can log user GET request
return title;
}
}
}
Views\web.config
<pages pageBaseType="WebViewPageAdv">
_Layout.cshtml
<title>@this.Title</title>
我没有检查控制器中设置的值是否可以通过这种方式读取,但您可以像这样设置 viewbag
public class FilterNameHere : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewBag.propertyNameHere = "value here";
}
}
然后通过GlobalAsax将过滤器注册为GlobalFilter如
GlobalFilters.Filters.Add(new FilterNameHere());
我需要记录所有 GET 请求 url + page.Title。 _Layout.cshtml 中的页面标题设置为
<title>@ViewBag.Title - @S.AppName</title>
ViewBag.Title 设置在 View.cshtml
ViewBag.Title = S.MemberDayReports;
我尝试使用自定义 ActionFilterAttribute。在 OnResultExecuted(..) 中 ViewBag.Title 为空。
我尝试在控制器 OnResultExecuted 中覆盖,但 ViewBag.Title 为空。
如何拦截查看输出和日志ViewBag.Title?
Viewbag主要用途是controller来查看通信。 redirection.TempData 保留 HTTP 请求时间的信息后,值设置为空。这意味着只能从一页到 another.Tye 使用临时数据。
或者您也可以在每个 post/get 中更新标题的静态变量。为此,您可以使用过滤器来跟踪当前和最后的数据。 ViewBag 无法满足您的要求。
MSDN 中的 ViewBag
描述描述了 ViewBag 的用途:
The ViewBag property enables you to dynamically share values from the controller to the view. It is a dynamic object which means it has no pre-defined properties. You define the properties you want the ViewBag to have by simply adding them to the property. In the view, you retrieve those values by using same name for the property.
如果您在视图中更改 ViewBag
的 属性,则不会返回到管道,并且在过滤器或控制器中都不可见。
作为解决方法,您可以在视图中设置 Title
属性 - 在这种情况下,它将在过滤器和控制器中都可见:
public ActionResult Index()
{
ViewBag.Title = "Your title";
return View();
}
覆盖 WebViewPage
public abstract class WebViewPageAdv<T> : WebViewPage<T>
{
public string Title
{
get
{
var title = String.Format("{0} - {1}", ViewBag.Title, S.AppName);
//Because Title get in _Layout.cshtml its full page load
//and can log user GET request
return title;
}
}
}
Views\web.config
<pages pageBaseType="WebViewPageAdv">
_Layout.cshtml
<title>@this.Title</title>
我没有检查控制器中设置的值是否可以通过这种方式读取,但您可以像这样设置 viewbag
public class FilterNameHere : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewBag.propertyNameHere = "value here";
}
}
然后通过GlobalAsax将过滤器注册为GlobalFilter如
GlobalFilters.Filters.Add(new FilterNameHere());