我需要记录所有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如何?
答案 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());