[asp.net
mvc 小牛之路]03 - razor语法
razor是mvc3中才有的新的视图引擎。我们知道,在asp.net中,aspx的视图引擎依靠e4a7fbc82c514fa16c9678a282299263来调用c#指令。而mvc3以后有了一套新的使用@标记的razor语法,使用起来更灵活更简洁。下面通过一些简单示例让大家快速撑握razor语法的使用。
本文目录
准备工作
在演示razor语法的使用之前,我们需要做一些准备工作。
1.打开vs创建一个asp.net mvc空项目,很简单,就不具体演示了。
2.添加一个model。在项目的models文件夹中添加一个名为product的类。在这我们把前一篇c#知识点提要用到的product类搬过来用。代码如下:
namespace mvcapplication1.models {
public class product {
public int productid { get; set; }
public string name { get; set; }
public string description { get; set; }
public decimal price { get; set; }
public string category { set; get; }
}
}
3.添加一个controller。右击项目中的controllers文件夹,选择添加控制器,命名如下图所示:
点添加后,对prodcutcontroller中的代码进行如下编辑:
using system.web.mvc;
using mvcapplication1.models;
namespace mvcapplication1.controllers
{
public class productcontroller : controller
{
public actionresult index()
{
product myproduct = new product {
productid = 1,
name = "苹果",
description = "又大又红的苹果",
category = "水果",
price = 5.9m
};
return view(myproduct);
}
}
}
4.添加一个view。右击index方法,选择添加视图,在弹出的窗口进行如下配置:
点添加后,系统自动帮我们创建一个product文件夹和一个index.cshtml文件,index.cshtml内容如下:
@model mvcapplication1.models.product
@{
viewbag.title = "index";
}
<h2>index</h2>
5.修改默认路由。为了方便,我们应该让应用程序启动时直接导向我们需要的请求处理(此处是product/index)。打开global.asax文件,找到注册路由registerroutes方法下的routes.maproute方法,把controller的值改为“product”,如下所示:
routes.maproute(
"default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 url
new { controller = "product", action = "index", id = urlparameter.optional } // 参数默认值
);
先不管这些是什么意思,我会在后面的文章中专门介绍路由。到这,我们可以按f5,程序能正常运行,准备工作就做好了。
使用model对象
介绍razor语法,让我们从index.cshtml文件的第一行开始:
@model mvcapplication1.models.product
razor语句都是以@符号开始的。每个视图都有自己的model属性(通过@model调用)。上面这句代码的意思是将本视图的model属性的类型指向mvcapplication1.models.product类型,这就实现了强类型。强类型的好处之一是类型安全,如果写错了model对象的某个成员名,编译器会报错;另一个好处是在vs中可以使用vs中的代码智能提示自动完成类型成员调用的代码编写。 当然这句代码不要程序也可以正常运行,只是给编写代码造成了一定的困难。
视图中的model属性用于存放控制器(controller)传递过来的model实例对象(本示例中productcontroller通过“return view(myproduct)”传递给index视图),下面的代码演示了如何调用该model对象:
@model mvcapplication1.models.product
@{
viewbag.title = "index";
}
<!-- 调用product实例的name属性 -->
<h2>名称:@model.name</h2>
注意,第一行代码用于声名model属性类型用的是@model <model类型名>(小写m),而调用控制器传递过来的model对象用的是@model.<属性名>(大写m)。按f5运行效果如下:
使用表达式
上面讲的使用model对象是很常用的一种razor代码。其实上面示例中的@model.name就是一个简单的表达式,表示向web页面呈现model.name的文本值。razor语法中的表达式除了可以使用model对象,也可以使用几乎任何一个其他可访问权限范围内的对象,来向web面面输出该对象成员的文本值。如下代码所示:
@model mvcapplication1.models.product
@{
viewbag.title = "index";
}
现在的时间是: @datetime.now.toshorttimestring()
运行效果如下:
这种使用对象的简单表达式(@datetime.now.toshorttimestring()和@model.name),在这我们不防称之为对象表达式。
除了对象表达式,还可以是其他任意的有返回值的表达式,如条件表达式。如下面代码所示:
@model mvcapplication1.models.product
@{
viewbag.title = "index";
}
现在的时间是: @datetime.now.toshorttimestring()
<br/>@(datetime.now.hour>22 ? "还早,再写一会吧!" : "该睡觉咯!")
运行效果如下:
注意,一般使用非对象表达式时都需要用小括号括起来。
使用代码块
和表达式的使用方式一样,razor语法中也可以使用由{}括起来的单个c#过程控制代码块(如if、switch、for等)。使用方式如下:
@model mvcapplication1.models.product
@{
viewbag.title = "index";
}
@if (model.price > 5m) {
string test = "买不起!";
<p>@model.name <b>太贵了!</b> @test </p>
}
效果如下:
由{}括起来的代码块内可以写任何c#代码,也可以使用任何html标签。但需注意的是,当控制语句内只有一句代码时不能像写c#后台代码一样省略大括号。
还有一种更常用的使用代码块的方式。你也可以通过以@{开始,以}闭合的方式来使用代码块,它可以把多个代码块放在一起,开成一个更大的代码块。如下代码所示:
@model mvcapplication1.models.product
@{
viewbag.title = "index";
}
@{
if(model.category=="水果"){
string test="是一种水果。";
@model.name @test
}
if (model.price > 5m) {
string test = "买不起!";
<p>@model.name <b>太贵了!</b> @test </p>
}
}
运行结果如下:
使用@:和text标签
我们注意到,在代码块中,要么是c#代码,要么是html标签,不能直接写纯文字,纯文字须包裹在html标签内。但如果需要在代码块中直接输出纯文字而不带html标签,则可以使用@:标签,在代码块中输出纯文本文字非常有用。如下代码所示:
...
@if (model.price > 5m) {
@model.name@:太贵了 。
<br />
@: @@:后面可以是一行除@字符以外的任意文本,包括<、>和空格,怎么写的就怎么输出。
<br />
@: 如果要输出@符号,当@符号前后都有非敏感字符(如<、{、和空格等)时,可以直接使用@符号,否则需要使用两个@符号。
}
注意@符号的使用。上面代码运行效果如下:
使用@:标签在代码块中输出一行不带html标签的文本非常方便,但如果需要在代码块中输出续或不连续的多行纯文本,则使用text标签较为方便,如下代码所示:
...
@if (model.price > 5m) {
<text>
名称:<b>@model.name</b><br />
分类:<b>@model.description</b><br />
价钱:<b>@model.price</b><br />
<pre>
测试行一: <a>aaaa</a>
测试行二: @@ fda@aaa
</pre>
</text>
}
运行结果:
使用viewbag
上面讲了通过model对象来从controller传递数据到view。和model对象一样,viewbag对象也可以用来从controller传递数据到view。下面代码演示了如何在productcontroller中使用viewbag:
public actionresult index()
{
product myproduct = new product {
productid = 1,
name = "苹果",
description = "又大又红的苹果",
category = "水果",
price = 5.9m
};
viewbag.teststring = "这是一行测试文字!";
return view(myproduct);
}
不一样的是,viewbag是动态类型,其中teststring是自己定义的。viewbag在view中的使用方式是和model一样,如下:
...
动态表达式解析的时间是:@viewbag.teststring
运行结果就不贴图了。
使用layuot
前面我们创建一个视图的时候,我们勾选了使用布局和母版页,但没有告诉vs使用哪一个。请仔细看下图:
这个对话框告诉我们“如果在razor _viewstart中设置了此选项,则留空”。在项目的views文件夹中,我们可以看到一个_viewstart.cshtml文件,里面的内容是:
@{
layout = "~/views/shared/_layout.cshtml";
}
mvc呈现视图的时候,默认情况下会自动查找_viewstart.cshtml文件,以它作为母版来呈现用户请求的视图。母版的呈现是mvc内部处理的,这种以下划线(_)开头的视图文件,一般是不能直接返回给用户。
使用布局或母版页的好处是,我们不需要在每个视图中都设置一份相同的内容。按照_viewstart.cshtml文件内容指示的路径,我们找到_layout.cshtml文件,打开它会发现我们在index视图中定义的 viewbag.title = "index" 就是在这里调用的:
<!doctype html>
<html>
<head>
<title>@viewbag.title</title>
<link href="@url.content("~/content/site.css")" rel="stylesheet" type="text/css" />
<script src="@url.content("~/scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
</head>
<body>
@renderbody()
</body>
</html>
类似于asp.net母版页中的contentplaceholder服务器控件,在mvc中使用@renderbody()来呈现子web页面的内容,它可以省去我们在每个视图文件中写相同的html元素、js和样式等的工作。
如果创建一个视图不想使用layout,则可以在创建视图的对话框取消“使用布局和母版页”选项,创建后会生成如下代码:
@{
layout = null;
}
<!doctype html>
<html>
<head>
<title>about</title>
</head>
<body>
<div>
</div>
</body>
</html>
由于没有使用layout,视图中必须包含用于呈现html页面每个基本元素,而且必须指定layout=null。
以上就是[asp.net mvc 小牛之路]03 - razor语法的内容。