在Razor中执行C#的顺序是什么

时间:2012-03-03 21:38:39

标签: asp.net-mvc asp.net-mvc-3 razor

我想了解Razor引擎如何执行以@开头的c#代码的顺序。

我试图查看执行Controller并执行视图的不同时间。所以,我创建了这个非常简单的ASP.NET MVC应用程序。我将时间存储在Controller中的ViewBag变量中,并将其显示为View,我还在视图中显示当前时间。

控制器有这个:

public ActionResult Index()
{
    ViewBag.ProcessingTime = DateTime.Now;
    return View();
}

视图有这个:

Processing time: @ViewBag.ProcessingTime<br />

    @{
        int i = 0;
        do
        {
            i++;
            <text>@i<br /></text>
        }
        while (i < 1000000);
        }

Render time: @DateTime.Now 

结果是这样的:

Processing time: 03/03/2012 04:16:48 p.m.
1
2
3
4
[...]
999998
999999
1000000
Render time: 03/03/2012 04:16:48 p.m.

为什么当它在Controller中执行if ProcessingTime并且视图中的RenderTime相同时,显然需要花时间向我显示网页?

1 个答案:

答案 0 :(得分:4)

请记住,该页面在服务器上呈现 。所以,即使它在视觉上对你而言在客户端上显得非常缓慢(因为你发送了一个巨大的HTML),实际渲染发生在服务器上,这可能在不到一秒的时间内发生,因为你所做的就是循环超过100万元素。

尝试显示处理器滴答,你应该注意到一个区别(如果你不这样做,必须有一些根本性的错误):

Processing time: @ViewBag.ProcessingTime.Ticks

... your loops and stuff

Render time: @DateTime.Now.Ticks

所以实际执行如下:

  1. 客户请求/home/index
  2. 执行控制器操作,将当前时间存储在ViewBag中并开始执行视图。
  3. 视图的执行只是循环并将1M元素转储到响应流,这种情况发生得非常快,可能不到一秒钟。因此,当它在不到一秒左右的时间内到达视图的最后一行时,最后一行将发送给客户端。
  4. 此流(与服务器上的执行相比)需要很多时间才能到达客户端。
  5. 很多时候(与服务器上的执行相比)需要客户端构建一个DOM树并显示它。
  6. 最后,客户端显示服务器上生成的内容的状态非常快。
  7. 在您的浏览器中,您会观察非常接近的时间,但在此浏览器中此页面渲染之间会发生很多时间。