Razor语法
- Razor语法非常简单,@启动的区域为标准的C#代码,其他部分是普通的html代码。
- 用法:
- {string a=“abc”;}@a @{C#代码块}。有标签就是html代码
- @Model
- @Model.dog.Name
- @if(),@foreach()等C#语句
- 下面的代码是不行的,因为纯文字被视为C#代码:
if(Model.IsOK)
{
启用
}
要使用“@:”前缀(不推荐),如下:
if(Model.IsOK)
{
@:启用
}
如果要在代码区块中输出大量文字,只要在代码前后加上Html标签即可
if(Model.IsOK)
{
<span>启用</span>
}
razor会智能识别哪块是C#,哪块是HTML,HTML中想运行C#代码就用@,想在C#中代码中输入HTML就写“HTML标签”。
但是如果由于样式等原因不详加上额外的标签,那么可以用<text></text>标记,特殊的<text>不会输出到Html中。 - 不要习惯性在@item后写分号
- Razor理解HTML标记语言的结构,当<li>标签关闭的时候他也可以自动转回代码@foreach(var item in strs)
{<li>yes @item</li>
} - Razor语法 :razor会自动识别哪块是普通字符,哪块是表达式,主要就是根据特殊符号来分辨(“识别到这里是否能被当成一个合法的C#语句”)。不能这样写
<a href="Course@CourseId.ashx">
否则razor会认为ashx是CourseId的一个属性,应该加上()强制让引擎把CourseId识别成一个单独的语法<a href="Course(@CourseId).ashx">
,不确定的地方就加个括号。通过VS中编辑器的代码着色也可以分辨出来。 - 如果不能自动提示,把页面关掉再打开就行了。如果还不能自动提示,只要运行没问题就行。cshtml文件中如果有警告甚至错误,只要运行没问题就没关系。
<span>333@qq.com</span>
,razor会自动识别出来是邮箱,所以razor不会把 @qq.com当成qq对象的com属性。但是对于特殊的邮箱或者就是要显示@,那么可以使用@转义@,也就是“@@”<li>item_@item.Length</span>
会把@item.Length识别成邮箱,因此用上()成为:<li>item_@(item.Length)</span>
- 易错,要区分C#代码和html代码,下面是对的:style=‘display: @(message.IsHide ? “none” : “block”)’ 下面是错误的: style=“display: (@message.IsHide) ? none : block” 为了避免C#中的字符串的"“和html的属性值的”"冲突,建议如果html属性中嵌入了C#代码,那么html的属性的值用单引号。
- Razor的@会自动把内容进行htmlencode输出,避免了XSS攻击,如果不想编码输出,那么用@Html.Raw()
- razor注释使用@注释内容@,不过谁会在cshtml中写注释???
- (*)razor中调用泛型方法的时候,由于<>会被认为是html转回标记模式,因此要用圆括号括起来,比如@(Html.Test
<String>
),()永远是很强大的。不过View中一般不会调用复杂的方法。 - 如果cshtml中任何html标签的属性中以"~/"开头,则会自动进行虚拟路径的处理,当然一般是给
<script>
的src属性、<link>
的href属性、<a>
标签的href属性、<img>
的src属性用的。 - html标签的任何属性的值如果是C#的值,那么如果是bool类型的值,那么如果值是false,则不会渲染这个属性,如果值是true,则会渲染成“属性名=属性名”,比如:@{bool b1 = true; bool b2 = false;}
<aaa aa="/1.html" checked="@b1" ac="@b2">aaa</aaa>
- 这个特性是为
<input type="radio/checkbox">
的checked属性和<select>
的<option>
的selected属性使用的,这样避免了进行三元运算符判断。 - cshtml是编译生成一个动态的程序集;在cshtml中写@this.GetType().Assembly.Location可以拿到编译生成的程序集的dll文件的路径,反编译可以看到cshtml最终生成一个类,类中就是在拼接html;类是继承自 WebViewPage,后续用的@Model、@Html等都是WebViewPage类的成员。
- 尽可能维持View的简单,不要在View中写业务逻辑以及过去复杂的代码
总结:
- @就是C#,
<aaa></aaa>
就是html - 如果想让被识别成html的当成C#那就用@()
- 如果想让被识别成C#的当成html,用
<span>
等标签,如果不想生成额外的标签,就用<text></text>
- 如果不想对内容htmlencode显示就用@Html.Raw
- 属性的值如果以"~/"开头会进行虚拟路径处理
- 属性值如果是bool类型,如果是false就不输出这个属性,如果true就输出“属性名=属性名”
<input type="checkbox" checked="@b1"/>
知识点补充
dynamic是C#中提供的一个语法,可以实现像JavaScript一样的动态语言,可以到运行的时候再去发现属性的值或者调用方法。
dynamic p = new Person();
p.Name = “InLett.com”;
p.Hello();
这样即使没有成员:p.Age=3;编译也不报错,只有运行的时候才报错。
dynamic的好处是灵活,坏处是不容易在开发时候发现错误、而且性能低(反射看看)。
如果dynamic指向System.Dynamic.ExpandoObject()对象,这样可以给对象动态赋值属性(不能指向方法):
dynamic p = new System.Dynamic.ExpandoObject();
p.Name = “InLett.com”;
p.Age = 10;
Console.WriteLine(p.Name+","+p.Age);
var类型推断
var i=3;
var s=“abc”;
编译器会根据右边的类型推断出来var是什么类型,反编译一下。
var和dynamic的区别:var是在编译的时候确定,dynamic是运行的时候动态确定的;var变量不能指向其他类型的,dynamic可以。
匿名类型
匿名类型是C#中提供的一个新语法:var p = new{Age=15,Name=“InLett.com”};这是创建一个匿名类的对象,这个类没有名字。反编译看一下(IL模式下看)编译器生成了一个类,这个类是internal(IL中是private)、属性是只读的、初始值是通过构造函数传递。
因为匿名类型的属性是只读的,所以匿名类型的属性是无法赋值;因为匿名类型是internal,所以无法跨程序集访问其成员。