CHAPTER 5 Working with Razor
Razor是ASP.NET Core MVC application默认的View Engine,用来渲染页面给用户。 这一章只是大概讲述Razor的主要语法,详细的介绍在之后的章节会有。
内容:
- 强类型视图
1.1 View import
1.2 使用Layout - Razor语法
1. 强类型View
//View中开头指定 @model
@model Razor.Models.Product
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
@Model.Name //引用model的内容
</body>
</html>
controller中传递model:
Product myProduct = new Product {
ProductID = 1,
Name = "Kayak",
Description = "A boat for one person",
Category = "Watersports",
Price = 275M
};
return View(myProduct);
1.1 使用View Import
在上面的定义model代码中, @model Razor.Models.Product
指明了完整的namespace, 可以通过添加view import
文件来告诉项目,去哪里找model的type,从而省去写命名空间。
view import
文件要放在View
文件夹下,取名叫做_ViewImports.cshtml
。
View文件夹下以
_
开头的文件名,将不会当作视图直接发送出去,所以 import 和 layout都使用_
开头。
在该文件中添加
@using Razor.Models // @using 加上命名空间
只有在View中就可以省略掉namespace:
@model Product
You can also add an @using expression to individual view files, which allows types to be used without namespaces in a single view.
1.2 使用Layout
之前视图中这么一句就是指定不使用Layout。
@{
Layout = null;
}
@{ }
是razor code block(razor代码块),其中可以写C#代码,在View被渲染的时候会执行。
创建Layout
layout可以被多个View一起使用,所以要放在 /Views/Shared
文件夹中。
//创建名为 `_BasicLayout.cshtml`的layout
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
</head>
<body>
<div>
@RenderBody() //使用 这个Layout的View,内容默认插在这里
</div>
</body>
</html>
使用Layout
@model Product
@{
Layout = "_BasicLayout";
ViewBag.Title = "Product Name";
}
Product Name: @Model.Name
使用 View Start
为了避免每个View都去设置相同的Layout时,改一次名会对多个文件造成错误的问题,MVC提供了一个默认的模板_ViewStart.cshtml
。
当自己的视图中不设置Layout
属性时,默认采用_ViewStart.cshtml
当作模板。
2. 使用Razor语法
action和view各自的功能:
Component | Does Do | Doesn’t Do |
---|---|---|
Action | method Passes a view model object to the view | Passes formatted data to the view |
View | Uses the view model object to present content to the user | Changes any aspect of the view model object |
Razor代码块
@{
//C#代码
}
使用action传递的内容
@Model.Name //强类型视图使用
@ViewBag.Title //都可以使用,ViewBag是一个dynamic对象
条件判断
@switch (ViewBag.StockLevel) {
case 0:
@:Out of Stock
break;
case 1:
case 2:
case 3:
<b>Low Stock (@ViewBag.StockLevel)</b>
break;
default:
@: @ViewBag.StockLevel in Stock
break;
}
@if (ViewBag.StockLevel == 0) {
@:Out of Stock
} else if (ViewBag.StockLevel > 0 && ViewBag.StockLevel <= 3) {
<b>Low Stock (@ViewBag.StockLevel)</b>
} else {
@: @ViewBag.StockLevel in Stock
}
遍历
@foreach (Product p in Model) {
<tr>
<td>@p.Name</td>
<td>@($"{p.Price:C2}")</td>
</tr>
}
在C#代码块中输出字符串
@: Out of Stock