Last time, we saw how basic Razor constructs are translated into C#.
We can see the generated class by adding @{ #error }
to the page source. This creates a compiler error in the Execute
method, and the resulting Yellow Screen of Death contains a Show Complete Compilation Source: link which will show the generated C# class.
Let’s start with a very simple page:
<!DOCTYPE html> <html> <body> 1 + 2 = @(1 + 2)<br /> @{ var source = "<b>bold & fancy</b>"; } <code>@source</code> is rendered as @(new HtmlString(source)) </body> </html> @{ #error }
This page is rendered like this: (after removing @{ #error }
)
<!DOCTYPE html> <html> <body> 1 + 2 = 3<br /> <code><b>bold &amp; fancy</b></code> is rendered as <b>bold & fancy</b> </body> </html>
As expected, the expression @source
is automatically escaped. Also notice that the newline and indentation around the code block (@{ var ... }
) was not rendered – the Razor parser strips all whitespace surrounding code blocks. This is a welcome improvement over the ASPX view engine.
Now let’s look at how this HTML is generated. This page is transformed into the following C# source:
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.WebPages.Html; using WebMatrix.Data; using WebMatrix.WebData; public class _Page_Razor_SimplePage_cshtml : System.Web.WebPages.WebPage { #line hidden public _Page_Razor_WriteTo_cshtml() { } protected ASP.global_asax ApplicationInstance { get { return ((ASP.global_asax)(Context.ApplicationInstance)); } } public override void Execute() { WriteLiteral("<!DOCTYPE html>\r\n<html>\r\n <body>\r\n 1 + 2 = "); #line 4 "...\SimplePage.cshtml" Write(1 + 2); #line default #line hidden WriteLiteral("<br />\r\n"); #line 5 "...\SimplePage.cshtml" var source = "<b>bold & fancy</b>"; #line default #line hidden WriteLiteral(" <code>"); #line 6 "...\SimplePage.cshtml" Write(source); #line default #line hidden WriteLiteral("</code> is rendered as\r\n "); #line 7 "...\SimplePage.cshtml" Write(new HtmlString(source)); #line default #line hidden WriteLiteral("\r\n </body>\r\n</html>\r\n"); #line 10 "...\SimplePage.cshtml" #error #line default #line hidden } } }
The WebPageRazorEngineHost injects the ApplicationInstance
property into the CodeDOM tree; this property allows code in the page to access any custom properties in Global.asax.
As mentioned earlier, the page source is compiled into the Execute()
method.
It uses #line
directives to pretend that its code is actually in the CSHTML page. This means that code or line numbers appearing in error pages come from the original CSHTML source, making the code easier to find when debugging. The #line hidden
directives indicate generated source that did not come from actual code in the CSHTML.
As mentioned last time, literal HTML source is passed to the WriteLiteral
method, which is inherited from the WebPageBase
class. This method writes its argument to the current output stream (which can vary when making sections). These calls are wrapped in #line hidden
because they come from literal text, not code.
The two code blocks (the variable declaration and the #error
directive) are copied straight into Execute()
, wrapped in #line
directives that map them to the actual code lines in the CSHTML.
The code nuggets are passed to the Write
method, and are similarly wrapped in #line
directives.
Here is a more sophisticated Razor page:
<!DOCTYPE html> <html> <body> @{ const int count = 10; } <table> @for (int i = 0; i < count; i++) { <tr> <td>@i</td> <td>@(i * i)</td> </tr> } </table> </body> </html> @{ #error }
The @for
loop is a code block in the form of a control flow statement. Razor’s C# parser is aware of C# control flow structures and parses them as code blocks. (The VB parser does the same thing)
Here is the generated Execute()
method, with #line
directives removed for clarity:
public override void Execute() { WriteLiteral("<!DOCTYPE html>\r\n<html>\r\n <body>\r\n"); const int count = 10; WriteLiteral(" <table>\r\n"); for (int i = 0; i < count; i++) { WriteLiteral(" <tr>\r\n <td>"); Write(i); WriteLiteral("</td>\r\n <td>"); Write(i * i); WriteLiteral("</td>\r\n </tr>\r\n"); } WriteLiteral(" </table>\r\n </body>\r\n</html>\r\n"); #error }
Here too, we see that all contiguous chunks of literal HTML are passed to WriteLiteral
.
This example has two code blocks – the const
declaration and the loop. The for
loop code block has HTML inside of it – any HTML markup inside a code block is parsed as normal HTML and passed to WriteLiteral
.
10 comments:
These tips are nice to read. Dona
Blogs are something that I like to read.
Brunette ladies
You should definitely take a look at these advices if you want to defend your dissertation. It's important to know
What I like the most in your post? Is the way you bring the information into the spciety and especially on this blog, quite interesting manner of giving the lecture, I guess a lot of teachers and writers can borrow smth, one more intetersing site which provide you with all neccessar help and assisstance which I have found recently was college book report writing service where you can buy an essay and all of them will be quite exclusive and intgeresting like the information on this blog
Thanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative.
norton.com/setup
mcafee.com/activate
Thankyou for giving us this imformation.
norton.com/setup
Its really great article..Thanks for sharing this useful information..
شركة شحن عفش من الرياض الى مصر
شركة شحن عفش من الدمام الى مصر
شركة ديكورات بالرياض
شركة دهانات في الرياض
نقل عفش داخل جدة نقل عفش داخل جدة
دينا نقل عفش جدة دينا نقل عفش جدة
افضل نقل عفش من جدة الى الرياض افضل نقل عفش من جدة الى الرياض
mr jatt Mp3 New Punjabi Song,Single Tracks Latest song download also Listen Latest Music Albums Online in High Quality at Mrpendus.in
mr jatt
This is very nice and amazing content and through this, many readers can improve their general knowledge and abilities. I hope, many people will enjoy useful content. Coursework writing services.
Data is stored in variables. Variable names cannot contain whitespace or reserved characters and must start with an alphabetic letter. A variable's type, which describes the type of data it contains, might vary. Date variables hold date values, integer variables store number values (103), string variables store string values ("Welcome to W3Schools"), etc. The var keyword or type (if you want to define the type) are used to declare variables, however ASP.NET often can detect data types automatically. Get Dragon City, where you can breed your dragons and prepare them for battle for free!
Tier List: Punishing Gray Raven
Post a Comment