ASP .NET MVC 5 Filter获取View.ViewBag数据

时间:2015-01-01 10:41:23

标签: asp.net-mvc c#-4.0

我需要记录所有GET请求url + page.Title。页面标题在_Layout.cshtml中设置为

<title>@ViewBag.Title - @S.AppName</title>

View.cag.Title在View.cshtml中设置

ViewBag.Title = S.MemberDayReports;

我尝试使用自定义ActionFilterAttribute。在OnResultExecuted(..)ViewBag.Title为空。

我在控制器OnResultExecuted中尝试覆盖,但ViewBag.Title为空。

拦截视图输出和日志ViewBag.Title如何?

4 个答案:

答案 0 :(得分:1)

Viewbag主要用途是控制器查看通信。重定向后,值设置为null .TempData保留HTTP请求时间的信息。这仅表示从一页到另一页。使用临时数据。

或者您也可以在每个帖子/ get中更新标题的静态变量。为此,您可以使用过滤器来跟踪当前和最后的数据。 ViewBag不会满足您的要求。

答案 1 :(得分:1)

MSDN中的ViewBag说明描述了ViewBag的用途:

  

ViewBag属性使您可以动态共享值   控制器到视图。它是一个动态对象,意味着它没有   预定义的属性。您可以定义ViewBag所需的属性   只需将它们添加到属性即可。在视图中,你   通过使用属性的相同名称来检索这些值。

如果更改视图中的ViewBag的属性,则不会将其返回到管道,并且在过滤器或控制器中都不可见。

作为一种解决方法,您可以在视图中设置Title属性 - 在这种情况下,它在过滤器和控制器中都可见:

public ActionResult Index()
{
    ViewBag.Title = "Your title";
    return View();
}

答案 2 :(得分:1)

覆盖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;
        }
    }
}

视图\ web.config中

<pages pageBaseType="WebViewPageAdv">

_Layout.cshtml

<title>@this.Title</title>

答案 3 :(得分:0)

我没有检查控制器中设置的值是否可以这种方式读取,但是您可以像这样设置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());