使用.net代码更新cshtml文件时,为什么不需要编译?

Ami*_*ich 10 c# asp.net compiler-construction asp.net-mvc

我正在使用Asp.net Mvc,我想知道为什么我不需要在cshtml文件中更新.net代码时编译我的项目?现在,如果我们谈论html\css更新,那么我清楚地理解为什么简单的刷新就足够了,但是在这些情况下.net代码如何动态编译?

让我说我有一个视图,我想添加一些c#代码,像Datetime.Now.ToString();
现在我通常可以添加这行代码到我的cshtml文件,保存文件,刷新页面,看到结果而不编译.

如果我通过向我的模型中添加属性来"按书"执行相同的操作,Datetime.Now.ToString()在我的控制器中分配并简单地渲染新的var我将需要编译我的代码以便查看更改.

这个神奇的工作原理如何?如果它如此简单,为什么不能用.cs文件呢?

Ps同样的问题与asp.net应用程序和aspx\ascx页面相关.

Ali*_*eza 10

.cshtml 文件将被及时编译,即当请求到达那些页面时.

但是,控制器已预编译并存储到项目的DLL文件中.

决定使用哪一个取决于您的需求.预编译可以缩短响应时间(因为您之前编译过代码),但即时编译为您提供了灵活性.

  • @AmirPopovich我在这里使用了"及时"这个术语的一般含义.当然,它被编译为IL,但仅在需要时(根据请求).如果性能对您很重要(大部分时间都是如此),您应该避免在cshtml中编写代码 (2认同)
  • @DarthVader如果保持cshtml清洁并将代码移动到控制器中,您将获得更好的结果.愿原力与你同在! (2认同)

Wik*_*hla 8

ASP.NET基础结构的一部分是ASP.NET编译器.它负责将声明性资源(*.aspx,*.ascx,*.cshtml等)编译为可执行代码.

没有魔力,运行时决定何时运行编译器(例如,自上次运行以来资源已被更改)然后调用编译器从声明性代码中创建命令性代码(例如,*.aspx被编译为*的.cs).然后它调用常规语言编译器来获取包含CIL的*.dll.

第一次访问资源需要一些时间,提前预编译所有声明性资源可能很方便.

概述:

http://msdn.microsoft.com/en-us/library/vstudio/ms178466(v=vs.100).aspx

预编译:

http://msdn.microsoft.com/en-us/library/aa983464(v=vs.110).aspx