当我创建一个 Web 窗体项目时,我的代码被编译成一个 DLL,由 IIS 服务器处理。当我使用 Javascript 时,它由浏览器解释,我可以使用 Chrome 开发人员工具或通过检查源代码来找到它。
但是,当我使用 Razor 语法创建 ASP.NET 网页时,我无法在任何地方找到代码。由于它不需要编译,因此它没有放入 DLL 中,我无法使用 Chrome 的检查工具找到它的任何痕迹。
那么,Razor 代码去哪里了?
当我创建一个 Web 窗体项目时,我的代码被编译成一个 DLL,由 IIS 服务器处理。当我使用 Javascript 时,它由浏览器解释,我可以使用 Chrome 开发人员工具或通过检查源代码来找到它。
但是,当我使用 Razor 语法创建 ASP.NET 网页时,我无法在任何地方找到代码。由于它不需要编译,因此它没有放入 DLL 中,我无法使用 Chrome 的检查工具找到它的任何痕迹。
那么,Razor 代码去哪里了?
它们确实是在运行时编译的。您可以在放置已编译 Web 表单的相同位置找到生成的代码文件和临时 DLL:
C:\Windows\Microsoft.NET\Framework64\<version>\Temporary ASP.NET Files\<app>\
您还可以与项目的其余部分一起启用编译,以检测视图中的错误。请参阅:可以编译 Razor 视图吗?. 这将增加解决方案的编译时间(根据我的经验),但它非常适合检测直到运行时才会被注意到的错误。我在需要时打开它。
Razor 解析器/生成器代码包含在 System.Web.Razor 项目/程序集中(作为 MVC 源代码的一部分提供)。由于最终结果是 ac# 类,因此 c# 编译器可能会像处理任何其他类一样从那里处理它。
为视图生成的代码类似于(摘自我的一个项目中的“重置密码”页面)。
namespace ASP {
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Helpers;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
public class _Page_Areas_Anonymous_Views_Home_ResetPassword_cshtml : System.Web.Mvc.WebViewPage<Web.UI.Areas.Anonymous.ResetPasswordViewModel> {
#line hidden
public _Page_Areas_Anonymous_Views_Home_ResetPassword_cshtml() {
}
protected ASP.global_asax ApplicationInstance {
get {
return ((ASP.global_asax)(Context.ApplicationInstance));
}
}
public override void Execute() {
const string title = "Reset Password";
ViewBag.Title = title;
BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 302, 63, true);
WriteLiteral("</h1>\r\n </div>\r\n </div>\r\n </div>\r\n <div");
EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 302, 63, true);
BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 365, 12, true);
WriteLiteral(" class=\"two\"");
EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 365, 12, true);
BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 377, 15, true);
WriteLiteral(">\r\n <div");
EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 377, 15, true);
BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 392, 19, true);
WriteLiteral(" class=\"banner-box\"");
EndContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 392, 19, true);
BeginContext("~/Areas/Anonymous/Views/Home/ResetPassword.cshtml", 411, 5, true);
WriteLiteral(">\r\n\r\n");
#line default
#line hidden
using( @Html.BeginForm( "ResetPassword", "Home", FormMethod.Post, new { id = "main-form" } ) )
{
Write(Html.ValidationSummary());
// etc. etc. Even simple views result in a large code file
无论您使用 Razor、传统的代码隐藏(单独的文件),还是使用内联 HTML 和 C# 的 .aspx,或多或少都会发生相同的事情。这一切都被转换为服务器端代码,并在服务器端执行,在运行时发出 HTML(以及您在源页面中从未见过的注入的 javascript)。源页面中的 HTML 成为服务器端代码在生成要发送到客户端的页面时使用的文本块。
服务器通常会编译您的页面,并运行编译后的代码;看似“解释”的内容实际上是在第一页加载时即时编译并缓存在内存中以利于后续页面加载。
如果您在站点上的任何地方都找不到任何页面的编译输出的证据,这可能是因为该页面是即时编译的,并且从未实际写入 dll。