Razor Code在哪里?

时间:2013-09-28 01:40:29

标签: html asp.net html5 razor asp.net-webpages

当我创建Web窗体项目时,我的代码被编译成DLL,由IIS服务器处理。当我使用Javascript时,它由浏览器解释,我可以使用Chrome开发者工具或检查源代码来找到它。

但是,当我使用Razor语法创建ASP.NET网页时,我无法在任何地方找到代码。因为它不需要编译,所以它不会被放入DLL中,我无法使用Chrome的检查工具找到它的任何痕迹。

那么,Razor代码在哪里?

2 个答案:

答案 0 :(得分:8)

它们确实是在运行时编译的。您可以在编译的Web表单放置的相同位置找到生成的代码文件和临时DLL:

C:\Windows\Microsoft.NET\Framework64\<version>\Temporary ASP.NET Files\<app>\

您还可以启用编译以及项目的其余部分来检测视图中的错误。见:Can Razor views be compiled?。这将增加解决方案的编译时间(根据我的经验),但它非常适合检测在运行时之前不会被注意到的错误。我需要时打开它。

Razor解析器/生成器代码包含在System.Web.Razor项目/程序集中(作为MVC源的一部分提供)。由于最终结果是c#类,因此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

答案 1 :(得分:2)

无论您使用Razor,传统的代码隐藏(单独的文件),还是.aspx与内联HTML和C#,或多或少都会发生相同的事情。这一切都被转换为服务器端代码,并在服务器端执行,在运行时发出HTML(以及在源页面中从未见过的注入的javascript)。源页面中的HTML在生成要发送给客户端的页面时,将成为服务器端代码使用的文本块。

服务器通常会编译您的页面,并运行已编译的代码;看似“解释”的内容实际上是在第一页加载时及时编译并缓存在内存中,以便后续页面加载。

如果您在网站的任何位置找不到编辑输出的证据,可能是因为该页面是实时编译的,并且从未实际写入dll。