我想通过母版页向我的所有ASP.NET MVC页面添加一个输出,该母版页显示当前页面的渲染时间.我怎么能这样做?
wom*_*omp 10
这很棘手,因为在您可以渲染页面之前,您必须将所有ViewData添加到其中.
您可以通过编写自定义ActionFilterAttribute和覆盖OnActionExecuting来启动计时器OnActionExecuted来获取执行控制器操作所花费的总时间,并获取已用时间并将其存储到ViewData.执行ActionResult时,可能需要花费时间并将其渲染到View中.
这可能足以满足您的需求?不幸的是,为了获得Action和Result执行的总时间,你需要覆盖OnActionExecuting和OnResultExecuted在你的Controller中,但是在那时为View添加信息为时已晚,因为它已经被渲染了.您可以将其记录到文件中,但请参阅此链接以获取示例.
好的,这是一个示例计时器动作过滤器.将此类作为类添加到项目中,然后您可以使用标记任何控制器方法[ActionTimer],并将经过的时间添加到名为" _ElapsedTime" 的ViewData存储桶中,您可以在视图中打印出来.
using System.Web.Mvc;
using System.Diagnostics;
namespace MvcApplication1 {
public class ActionTimerAttribute : ActionFilterAttribute
{
public ActionTimerAttribute()
{
// Make sure this attribute executes after every other one!
this.Order = int.MaxValue;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.Controller;
if (controller != null)
{
var timer = new Stopwatch();
controller.ViewData["_ActionTimer"] = timer;
timer.Start();
}
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var controller = filterContext.Controller;
if (controller != null)
{
var timer = (Stopwatch)controller.ViewData["_ActionTimer"];
if (timer != null)
{
timer.Stop();
controller.ViewData["_ElapsedTime"] = timer.ElapsedMilliseconds;
}
}
}
} }
Run Code Online (Sandbox Code Playgroud)
正如我之前提到的,这将不包括实际渲染时间ActionResult.如果您看一下我链接的示例,它会向您展示如何对日志文件执行此操作,并且还可以让您了解如何使用这四个操作过滤器事件.
| 归档时间: |
|
| 查看次数: |
4798 次 |
| 最近记录: |