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());