|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着!我们看一下之前例子中的代码:<li>@p.Name ($@p.Price)</li>是怎样剖析的。 当碰到"<li>"字符序列的时分,剖析器晓得正在剖析一个以"</li>"为停止标记的标志。然后标志剖析器在剖析到停止标记之前发明了一个"@"字符,就像"@foreach"一样,再次切换到代码剖析器。这时候和之前的剖析有些分歧,C#代码剖析器发明第一个标识符"p"时,它会反省这个标识符是否是C#的关头字;固然"p"并非C#关头字,以是代码剖析器进进"隐式表达式"形式。剖析隐式表达式的算法看起来是如许的:
起首读取一个标识符,
下一个字符是"("大概"["?
是则读到婚配的")"大概"]",然后跳到2
不是则持续3
下一个字符是"."?
是则持续4
不是则停止表达式
"."前面的字符是正当的C#标识符的入手下手?
是则读取"."并跳到1
不是则不读"."并停止表达式
整体来讲就是:一个隐式表达式就是一个标识符,以后能够跟恣意数目的办法挪用("()")、索引表达式("[]")及成员会见表达式(".")。可是,除在"()"大概"[]"内里,是不同意空格存在的。比方,上面是一些正当的Razor隐式表达式:
@p.Name
@p.Name.ToString()
@p.Name.ToString()[6 - 2]
@p.Name.Replace("ASPX", "Razor")[i++]
上面是一些不法的表达式,这些表达式只要部分("==>"以后的部分)会被Razor以为是表达式。
@1 + 1 ==> @
@p++ ==> @p
@p . Name ==> @p
@p.Name.Length C 1 ==> @p.Name.Length
这是我们为何必要另外一个表达式语法:"@(...)"的缘故原由,经由过程这个语法我们能够把任何想要的器材放到"()"内里,下面的例子用这个语法来暗示就是:
@(1 + 1)
@(p++)
@(p . Name)
@(p.Name.Length - 1)
一旦我们考证了表达式,我们会把它传送到代码天生器中。当为"@foreach(){…}"天生代码的时分,会把代码写到天生的C#类文件中。关于表达式(不管是显现的大概是隐式的)来讲,这个历程有一点分歧,不像ASPX,这里只要一个把持布局"@",并没有"@="来辨别运转代码和要输入值的表达式,但这也是Razor的魅力地点。比方,当发明"@foreach"的时分,我们晓得"foreach"是C#中的一个关头字,以是这个块会被作为声明来实行;而发明"@p.Name"大概"@(1+1)"的时分,我们晓得它们是表达式,以是在实行这些语句以后输入了实行了局。
总之:
@if,@switch,@try,@foreach,@for,等是和"<%%>"一样的
@p.Name,@(p++),@(1+1),等是和"<%:%>"一样的
另外一个必要注重的中央就是表达式同等于"<%:"而不是"<%=""。在Razor中默许应当举行HTMLEncode处置,假如不想举行HTMLEncode处置,可使用IHtmlString接口。
晓得剖析道理以后,上面我们再回到之前的代码:
<li>@p.Name ($@p.Price)</li> 当发明"@p.Name"以后,能够辨认出这是一个表达式,经由过程"("字符之前的空格剖析出这不是一个办法挪用,以后是文本标志""($",然后再次发明"@"以后将"@p.Price"剖析为表达式,最初以")"停止。
前天傍晚我发表了《Java的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。 |
|