为什么ASP.NET页面(包括表单和MVC)都是动态编译的?

时间:2011-02-17 14:29:54

标签: asp.net

ASP.NET中有一种模式 - 只要有一个标记生成代码(如WebForms中的.aspx / .ascx文件或MVC3中的.cshtml文件,这些文件在运行时动态编译。 aspnet_compiler将为它们生成另一个程序集,它引用了代码隐藏程序集。

这种做法对我来说似乎很尴尬,我不明白为什么它还没有停止。一个更好的方法(在我看来)就像在Winforms或资源文件中 - 你有.whatever文件,然后有.whatever.desginer.cs文件。在您键入时,将在运行时创建此设计器文件。编译时,编译器不关心您的.whatever文件,它只需要.whatever.designer.cs文件并生成一个实体程序集。

这提供了几个好处:

  • 您可以相互继承表单,类似于Windows表单;
  • 您始终可以看到正在生成的代码,可能会调整您的标记以生成更好的代码;
  • 您可以轻松地实例化表单的强类型实例;

我从动态编译中看到的唯一好处是

  • 您可以随时更改标记文件,而无需重新编译应用程序。

说实话,我经常想要获得前三个好处中的一个,但从来没有用过最后一个好处。重新编译应用程序以查看您的更改并不是什么大不了的事。特别是因为在使用代码隐藏时,无论如何都必须这样做,大部分时间都在这里。当您将应用程序交付给客户端时,您将其作为单片预编译块提供。更新时,您需要更新所有内容,而不仅仅是单个.aspx个文件 - 没有任何意义。

所以...为什么会这样?我错过了什么?

2 个答案:

答案 0 :(得分:2)

听起来你指的是一个ASP.Net网站。 ASP.Net Web应用程序就像一个ASP.Net网站,但使用.designer.cs文件并生成一个程序集。

请参阅ASP.NET Web Site or ASP.NET Web Application?

答案 1 :(得分:1)

想到的一个想法是winforms和webforms之间的主要区别与共同的开发模型有关。

即,有一大类开发人员和设计人员严格使用html / css / javascript。他们使用从记事本到竞争开发产品的大量工具来构建这些页面。

此外,在WinForms的情况下,MS可以完全控制构成表单的内容。可以在其上删除的任何控件都必须从其指定的代码下降。

然而,对于HTML,他们没有相同级别的控制。规范更改与VS版本不同步,添加了特定于浏览器的其他功能等。简而言之,它们无法保证HTML文件中的特定元素完全是有效元素。他们所能希望的是,无论发送的是什么都是故意这样做的,浏览器知道如何处理它。

现在他们已经尝试实现一个提供可视继承的模型。它被称为“母版页”。但是,我相信正确使用母版页的唯一工具是VS和Expression。让其他供应商沿着这条路走下去几乎是不可能的。此外,他们还添加了“嵌套母版页”的概念,以便您可以从中获得多级继承。

模型背后的代码有助于实现非可视继承,允许人们完全修改页面处理(因此MVCx如何工作)。

这让我们了解了MS确实知道的部分。显然,他们确实有.designer文件支持.aspx页面。此设计器文件维护可由后面的代码访问的服务器控制列表。您可以将runat="server"添加到html页面中的每个常规元素(不包括css等工件),但这会增加页面所需的处理量。

总而言之,我认为他们已经选择了最适合网络开发的模式,因为他们对网络的运作方式缺乏控制。其他供应商尝试过类似的路径(例如Adobe Contribute,之前由Macromedia提供)。我相信其中一些甚至早于MS的模型。