Razor代码应该放在哪里?

19 浏览
0 Comments

Razor代码应该放在哪里?

当我创建一个Web Forms项目时,我的代码后台被编译成一个DLL文件,然后由IIS服务器处理。当我使用Javascript时,它由浏览器解释,并且我可以通过Chrome开发者工具或检查源代码来找到它。然而,当我使用Razor语法创建一个ASP.NET Web页面时,我无法找到任何代码。因为它不需要编译,所以它不会被放入DLL文件中,我也无法使用Chrome的检查工具找到它的任何痕迹。

那么,Razor代码去哪里了?

0
0 Comments

问题的出现原因是:无论是使用Razor、传统的代码后台(独立文件)还是带有内联HTML和C#的.aspx,大体上都发生了相同的事情。所有的代码都会被转换为服务器端代码,并在服务器端执行,运行时生成HTML(以及您在源页面中看不到的注入的javascript)。源页面中的HTML成为服务器端代码在生成要发送给客户端的页面时使用的文本块。

服务器通常会编译您的页面,并运行编译后的代码;看起来像是“解释”的实际上在第一次页面加载时是即时编译的,并且为了后续的页面加载而在内存中缓存。

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

实际上,dll是JIT编译过程的结果。没有任何内容被缓存在内存中。

解决方法是:查找页面的编译输出,或者确认页面是通过即时编译生成的。

0
0 Comments

Razor代码是在运行时编译的,生成的代码文件和临时DLL文件存放在和编译的Web表单相同的位置。可以通过启用编译来检测视图中的错误,这将增加解决方案的编译时间,但有助于检测运行时可能忽略的错误。

Razor解析器/生成器代码包含在System.Web.Razor项目/程序集中。由于最终结果是一个C#类,所以C#编译器会处理它,就像处理任何其他类一样。

生成的视图代码类似于以下示例中的“重置密码”页面的代码。这个例子展示了一个较大的代码文件。

根据以上内容,我们可以得出结论:Razor代码被编译为C#类,编译后的文件存放在临时文件夹中,并且可以通过启用编译来检测错误。

解决方法:

1. 通过启用编译来检测视图中的错误,增加了解决方案的编译时间,但有助于检测运行时可能忽略的错误。

2. 可以找到生成的代码文件和临时DLL文件,它们存放在与编译的Web表单相同的位置。

代码示例:

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 {
        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("\r\n            
\r\n
\r\n
\r\n \r\n \r\n\r\n"); #line default #line hidden using( .BeginForm( "ResetPassword", "Home", FormMethod.Post, new { id = "main-form" } ) ) { Write(Html.ValidationSummary()); // etc. etc. Even simple views result in a large code file } } } }

Razor代码存放的位置和编译后的文件存放的位置相同,可以通过启用编译来检测错误。生成的代码是C#类,由C#编译器处理。

0