ASP.NET MVC--视图
文章目录
- 视图
- Razor语法
- dynamic
- var
- 匿名类型
- 部分视图
- Partial 与 RenderPartial
- RenderPartial 与 RenderAction
- RenderAction 与 Action
视图
Razor语法
1,语法简单:@启动的区域为标准的C#代码,其他部分是普通的html代码
2,用法:
@{string a = "abc";} @a @{C#代码块} //有标签的就是html代码
@Model //控制器传递来的对象
@Model.dog.Name //控制器传递来的dog对象的Name属性的值
@if(),@foreach()等C#语句
3,在代码中输入大段文字
两种方法:
- @:大段文字 //不推荐使用了,
代码:
if(Model.IsOK)
{
@:文字
}
- <html标签>文字</html标签>
代码:
if(Model.IsOK)
{
<span>文字</span>
}
razor会智能识别哪块是C#,哪块是HTML,HTML中想运行C#代码就用@,想在C#中代码中输入HTML就写“HTML标签”。
但是如果由于样式等原因不想加上额外的标签,那么可以用
4,注意:不要在@item后写分号 //分号会被当成html代码,原样输出
5,razor会自动识别哪块是普通字符,哪块是表达式,主要就是根据特殊符号来分辨(“识别到这里是否能被当成一个合法的C#语句”)。
例子:不能这样写 <a href="Course@CourseId.ashx">
,否则ashx会被识别为CourseId的一个属性,
应该加上()强制让引擎把CourseId识别成一个单独的语法,<a href="Course(@CourseId).ashx">
技巧:
不确定的地方就加上(),也可以按照编辑器的代码着色来进行分辨
6,如果不能自动提示,把页面关掉再打开就可以了。如果还是不能自动提示,只要运行没问题就行。
cshtml文件中如果有警告甚至错误,只要运行没问题就没关系
7,<span>333@qq.com</span>
,razor会自动识别出来是邮箱,所以razor不会把 @qq.com当成qq对象的com属性。
但是对于特殊的邮箱或者就是要显示@,那么可以使用@转义@,也就是“@@”
<li>item_@item.Length</span>
//会把@item.Length识别成邮箱,
因此用上()成为:
<li>item_@(item.Length)</span>
8,易错:要区分C#代码和html代码,
正确的:style='display:(@message.IsHide?"none":"block")'
错误的:style="display: (@message.IsHide) ? none : block"
注意:
为了避免C#中的字符串的“”和html的属性值的“”冲突,建议如果html属性中嵌入了C#代码,那么html的属性的值用单引号
9,为了避免XSS攻击(跨站脚本攻击,在输出对象中嵌入script代码等恶意代码),Razor的@会自动把内容进行htmlencode输出,如果不想编码后输出,使用@Html.Raw()方法
10,Razor的注释方法 @要注释的内容@
11,Razor中调用泛型方法的时候,由于<>会被认为是html转回标记模式,因此要用()括起来,比如@(Html.Test)()可以解决大部分问题,在View中一般不会调用复杂的方法
12,如果cshtml中任何html标签的属性中以"~/"开头,则会自动进行虚拟路径的处理,
当然一般是给
13,html标签的任何属性的值如果是C#的值(使用@传递过来的值),
如果是bool类型的值,那么如果值是false,则不会渲染这个属性,如果是true,则会渲染成“属性名=属性名”
代码示例
@{
bool b1 = true;
bool b2 = false;
}
//此时生成的html代码为:
这个特性避免了进行三元运算符的判断
14,总结:
1、@就是C#,就是html
2、如果想让被识别成html的当成C#那就用@()
3、如果想让被识别成C#的当成html,用等标签,如果不想生成额外的标签,就用
4、如果不想对内容htmlencode显示就用@Html.Raw()方法
5、属性的值如果以"~/"开头会进行虚拟路径处理
6、属性值如果是bool类型,如果是false就不输出这个属性,如果true就输出“属性名=属性名”
dynamic
dynamic是C#语法中提供的一个语法,实现像JavaScript一样的动态语言,可以到运行的时候再去发现属性的值或者调用方法 代码示例
dynamic p = new dynamic();
p.Name = "rupeng.com";
p.Hello();
注意:即使没有成员p.Age=3;编译也不会报错,只有运行的时候才会报错
好处是灵活,坏处是不容易在开发的时候发现错误、并且性能低
如果dynamic指向System.Dynamic.ExpandoObject()对象,这样可以给对象动态赋值属性(不能指向方法):
dynamic p = new System.Dynamic.ExpandoObject();
p.Name = "rupeng.com";
p.Age = 10;
Console.WriteLine(p.Name+","+p.Age);
var
var类型推断
var i = 3;
var s ="abc";
编译器会根据右边的类型推断出var是什么类型
var和dynamic的区别:
- var是编译的时候确定的,dynamic是在运行的时候动态确定的
- var变量不能指向其他类型,dynamic可以(因为var在编译的时候已经确定了类型)
匿名类型
匿名类型是C#中提供的一个新语法:
var p = new {Age=5,Name="rupeng.com"};//这样就创建了一个匿名类的对象,这个类没有名字,所以叫匿名类
原理:
编译器生成了这个类,这个类是internal、属性是只读的、初始值是通过构造函数传递的
- 因为匿名类的属性是只读的,所以匿名类型的属性是无法赋值的;
- 因为匿名类型是internal,所以无法跨程序集访问其成员(只能活在自己当前的程序集内)。
部分视图
在Asp.net mvc 的视图里有多种方法可以来加载部分视图,这几种方法是:
Partial()
Action()
RenderPartial()
RenderAction()
RenderPage()
为什么会有这么多方法,且这些方法有什么样的差别?
Partial 与 RenderPartial
-
Razor 语法:@Html.Partial() 与 @{Html.RenderPartial();}
-
区别:
Partial 可以直接输出内容,它内部是将 html 内容转换为 string 字符(MVCHtmlString),然后缓存起来,最后再一次性输出到页面。所以,这个转换的过程会降低效率,建议使用 RenderPartial 这处方法来代替。
RenderPartial 与 RenderAction
-
Razor 语法:@{Html.RenderPartial();} 与 @{Html.RenderAction();}
-
区别:
RenderPartial 方法是不需要创建 Controller 控制器中 的 Action 方法,而 RenderAction 方法则需要在 Controller 创建要加载的 Action。RenderAction 会先去调用 Contorller 的 Action ,最后再呈现视图,所以这里页面会在发起一个链接。
如果这个部分视图只是一些简单 的 html 代码,请使用 RenderPartial。 但如果这个部分视图除了有 html 代码外,还需要通过 读取数据库中的数据来渲染,就必须使用 RenderAction 了,因为它可以在 Action 里调用 Model里的方法读取数据库,渲染到视图后再呈现,而 RenderPartial 没有 Action,所以无法做到。
RenderAction 与 Action
-
Razor 语法:@{Html.RenderAction();} 与 @Html.Action();
-
区别:
Action 也是直接输出,和 Partial 一样,也存在一个转换的过程。但不如 RenderAction 直接输出到当前HttpContext 的效率高。
RenderPage 与 RenderPartial 方法
-
Razor 语法:@{Html.RenderPartial();} 与 @RenderPage()
-
区别:也可以使用 RenderPage 来呈现部分,但它不能使用原来视图的 Model 和 ViewData ,只能通过参数来传递。而 RenderPartial 可以使用原来视图的 Model 和 ViewData。