Къде отива Razor Code?

Когато създавам проект за уеб формуляри, моят код зад него се компилира в DLL, който се обработва от IIS сървър. Когато използвам Javascript, той се интерпретира от браузъра и мога да го намеря с помощта на неща като инструментите за разработчици на Chrome или като проверя източника.

Въпреки това, когато създавам уеб страница на ASP.NET, използвайки синтаксиса на Razor, не мога да намеря кода никъде. Тъй като не е необходимо да се компилира, той не е поставен в DLL и не мога да намеря никакви следи от него с помощта на инструментите за проверка на Chrome.

И така, къде отива Razor кодът?


person Dragonseer    schedule 28.09.2013    source източник


Отговори (2)


Те наистина се компилират по време на изпълнение. Можете да намерите генериран кодов файл и временни DLL файлове на същото място, където са поставени компилираните уеб формуляри:

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

Можете също така да активирате компилация заедно с останалата част от проекта, за да откриете грешки във вашите изгледи. Вижте: Могат ли да се компилират изгледи на Razor?. Това ще увеличи времето за компилиране на решението (според моя опит), но е чудесно за откриване на грешки, които биха останали незабелязани до момента на изпълнение. Включвам го при нужда.

Кодът на анализатора/генератора на 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
person Tim Medora    schedule 28.09.2013

Независимо дали използвате Razor, конвенционален код зад (отделни файлове) или .aspx с вграден HTML и C#, повече или по-малко се случват едни и същи неща. Всичко се преобразува в код от страна на сървъра и се изпълнява от страна на сървъра, излъчвайки HTML (и инжектиран javascript, който никога не виждате в страниците си с източник) по време на изпълнение. HTML във вашите изходни страници се превръща в части от текст, използвани от кода от страната на сървъра, когато той генерира страниците за изпращане на клиента.

Сървърът обикновено компилира вашите страници и изпълнява компилирания код; това, което изглежда като "интерпретирано", всъщност се компилира точно навреме при зареждане на първата страница и се кешира в паметта в полза на следващите зареждания на страници.

Ако не можете да намерите доказателство за компилиран изход за страница където и да е във вашия сайт, това вероятно е защото страницата е компилирана точно навреме и никога всъщност не е записана в dll.

person Zenilogix    schedule 28.09.2013
comment
Всъщност dll са генерирани в резултат на процеса на JIT компилация. Нищо не се кешира в паметта. - person Mike Brind; 29.09.2013