第5章——使用 Razor(MVC框架视图引擎)
Razor 是MVC框架视图引擎的名称。
本章提供 Razor 语法的快速教程,以使你能够识别 Razor 表达式。
本章不打算提供 Razor 的完整参考,而将其视为一个语法速成教程。在本书的后续内容中,将随着 MVC 框架的其他特性深入考察 Razor 。
5.1 准备示例项目
使用 “ASP.NET MVC Web Application” 模板创建一个名称为 “Razor” 的新项目。(这里选择 “空” 选项,勾选 “MVC” 复选框)
5.1.1 定义模型
本小节打算从一个名称为 Product 的简单域模型开始,其定义(略)放在名称为 Product.cs 的类文件中。
5.1.2 定义控制器
本小节打算遵循 MVC 框架的约定,并定义一个名称为 Home 的控制器作为项目的起始点。
(该控制器中创建了一个 Product 对象,并对其属性进行填充,同时还定义了一个叫做 Index 的动作方法,在其中将 Product 对象传递给了 View 方法,以便在渲染视图时使用它)
(在调用 View 方法时,并未指定视图文件的名称,因此,这将会使用该动作的默认视图)
5.1.3 创建视图
右击 Index 方法,选择“添加视图”,确保名称为 “Index”,将“模板”设置为 “空”,模型类选择 “Product”。(如果没有找到“Product”选项,请编译该项目并重复上述步骤)
去掉已勾选的 “试图选项” 复选框,单击 “添加” 按钮。
以下小节将概览 Razor 视图的各个方面,并演示可以在其中所做的一些不同操作。
在学习 Razor 时要意识到,视图的目标是将模型的一个或多个部分表现给用户。
记住这一点是有好处的,而且这也意味着,视图会生成显示数据的 HTML,这些数据来自于视图所接收的一个或多个对象。
如果你总能记住 “这是在建立一个能够发送给客户端的 HTML 页面”,那么,Razor 所做的一切事情就变得有意义了。
5.2 使用模型对象
Razor 语句以 @ 字符开始。
@model 语句声明了通过动作方法传递给该视图模型对象的类型,这让我们能够通过 @Model 来引用视图模型对象的方法、字段和属性。
(声明视图模型对象的类型使用了小写的 m,而引用数据时使用的是大写的 M)
通过使用 @model 表达式,便是在告诉 MVC 将在视图中使用的是哪种类型的对象。
5.3 使用布局
Razor 代码块允许在视图中包含 C# 语句。(这种代码块以 “@{” 开始,以 “}” 结束,而其中的语句会在视图被渲染时执行)
正如第 20 章将要解释的那样,在一个 MVC 应用程序中,Razor 视图会被编译成 C# 类,而所用的基类定义了 Layout 属性。
将 Layout 属性设置为 null 的效果是告诉 MVC 框架,该视图是自包含的,并且会渲染客户端所需要的全部内容。
自包含视图十分适用于简单示例应用程序,但一个实际项目可能会有数十个视图。布局是十分有效的模板,它含有用以创建应用程序一致性的标记 —— 这能够确保在结果中包含适当的 JavaScrit 库。
5.3.1 创建布局
右击 Views 文件夹,选择 “添加”、“新建项”,选择 “MVC 5 布局页(Razor)”模板
将文件名设置为 _BasicLayout.cshtml,并单击 “添加” 按钮。
注:Views 文件夹中以画线 “_” 打头的文件是不会被返回给用户的,它允许通过文件名来区分要进行渲染的视图和对视图进行支持的文件。布局是支持文件,故以下划线为前缀。
布局是特殊形式的视图。
对 @RenderBody 方法的调用会将动作方法所指定的视图内容插入到布局标记之中。
布局中的另一个 Razor 表达式会在 ViewBag 中查找一个叫做 Title 的属性,目的是设置 title 元素的内容。
布局中的元素会被运用于使用此布局的任何视图,而这正是使用布局为基本模板的原因。
5.3.2 运用布局
为了将布局运用于视图,只需要设置 Layout 属性的值即可。
布局中包含了一些 HTML 元素,这些元素定义了对浏览器进行相应时的 HTML 页面的结构。(因此可以将视图中原来的这些元素去掉)
简化后的 Index.cshtml 文件:
@model Razor(项目名称).Model.Product
@{
ViewBag.Title = "产品名称";
Layout = "~/ Views / _BasicLayout.cshtml";
}
产品名称:@Model.Name
这种转换不仅让笔者简化了标记,还意味着不必在每一个创建的视图中重复那些通用元素。
5.3.3 使用视图起始文件
笔者还有一个小问题要解决,就是必须在每一个视图都要指定布局文件。—— 这意味着,如果需要重命名布局文件,那么必须找出引用该布局的每一个视图,并进行修改。(这将是一个易错的过程,而且这与贯穿于 MVC 框架的易维护主题是相悖的)
通过使用视图起始文件可以解决这个问题。—— 在渲染一个视图时,MVC 框架会查找一个叫做 _ViewStart.cshtml 的文件。框架会将此文件的内容视为视图文件的一部分,于是笔者可以使用这一特性为 Layout 属性自动第设置一个值。
为了创建一个视图起始文件,可以对 Views 文件夹添加一个新的布局文件,并将该文件的名称设置为 _ViewStart.cshtml(再次注意前面的下画线)。编辑文件内容为:
@{
Layout = "~/ Views / _BasicLayout.cshtml";
}
此视图起始文件含有 Layout 属性的值,这意味着可以去除 Index.cshtml 文件中的相应语句。
笔者不必以任何方式指定希望使用的视图起始文件,MVC 框架会对此文件进行定位,并自动第使用其内容。
在视图文件中对 Layout 属性值所做的定义具有更高的优先级,这便于对视图起始文件进行覆盖。—— 意即,若在视图中重新定义了 Layout 的值,会覆盖视图起始文件中所指定的布局。
要理解忽略视图文件的 Layout 属性与将其设置为 null 两者之间的差别。—— 如果视图是自包含的,并且不想使用布局,那么将 Layout 属性设置为 null。如果忽略 Layout 属性,那么 MVC 框架将假设你确实想用一个布局,而且它应该使用视图起始文件中所找到的那个值。
5.3.4 使用共享布局
添加动作方法并创建视图。—— 将“模板”设置为 “空”,选择 “模型类”,并确保勾选了 “使用布局页面” 复选框。
如果你希望使用在视图起始文件中指定的视图,则应让文本框为空。
如果打算明确地指定布局视图,可以单击文本框右侧的省略号按钮。
第5章——使用 Razor(MVC框架视图引擎)的更多相关文章
- 2014-07-29 浅谈MVC框架中Razor与ASPX视图引擎
今天是在吾索实习的第15天.随着准备工作的完善,我们小组将逐步开始手机端BBS的开发,而且我们将计划使用MVC框架进行该系统的开发.虽然我们对MVC框架并不是非常熟悉,或许这会降低我们开发该系统的效率 ...
- MVC ViewEngine视图引擎解读及autofac的IOC运用实践
MVC 三大特色 Model.View.Control ,这次咱们讲视图引擎ViewEngine 1.首先看看IViewEngine接口的定义 namespace System.Web.Mvc { ...
- ASP.NET MVC 对于视图引擎的优化
我经常使用asp.net MVC框架来做网站.总的来说,MVC框架是一个非常优秀的框架.相对于曾经的web form模式,我个人感觉分工更加合理思路也更加清晰,但是交给开发人员的工作也相对变多了. 当 ...
- ASP.NET MVC自定义视图引擎ViewEngine 创建Model的专属视图
MVC内置的视图引擎有WebForm view engine和Razor view engine,当然也可以自定义视图引擎ViewEngine. 本文想针对某个Model,自定义该Model的专属视图 ...
- MVC自定义视图引擎地址
先看结构 1.RouteConfig 文件(注意顺序) public static void RegisterRoutes(RouteCollection routes) { routes.Ignor ...
- ASP.NET MVC——Razor视图引擎
Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...
- ASP.NET MVC 5 Web编程4 -- Razor视图引擎
Razor简介 Razor是ASP.NET新增的一个视图引擎,由微软全球最年轻的副总裁,有着"ASP.NET之父"称呼的Scott Guthrie主导的团队开发. 主导Razor开 ...
- Pro ASP.NET MVC –第二章 第一个MVC程序
学习一个软件开发框架的最有效的方式就是了解并使用它.在本章,你将会创建一个简单基于ASP.NET MVC Framework的数据-实体应用程序.我们会该程序划分成若干小块,每次介绍一个部分,以便你能 ...
- Razor视图引擎 语法学习(一)
ASP.NET MVC是一种构建web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架: ASP.NET约定优于配置:基本分为模型(对实体数据 ...
随机推荐
- label语句、break语句和continue语句
label语句 可以在代码中添加标签,以便使用.以下是label语句的语法: label:statement 示例: start: for (var i = 0; i < count; i++) ...
- C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder
part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...
- 02: python3使用email和smtplib库发送邮件
1.1 发送qq邮箱 注:python代理登录qq邮箱发邮件,是需要更改自己qq邮箱设置的.在这里大家需要做两件事情:邮箱开启SMTP功能 .获得授权码 教程链接 1.给单个人发邮件 参考 from ...
- 前端开发环境全面配置 --- mac OS
Mac 开发配置 brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...
- C#中的基本类型理解
1.C#把所有基本类型都封装成自己的类型了,如下图,int被封装成了一个struct结构体.如果定义一个int对象,是可以调用int结构体里的函数的 2.和C\C++不同,C#的char就是单纯的代表 ...
- Wireshark 捕捉本地数据 --WinPcap切换NPcap
Wireshark默认匹配安装的是WinPcap,但是WinPcap有个缺点,不能抓取本地回环数据 NPcap是在WinPcap的基础上进行优化开发的,可以抓取本地数据 如果已安装WinPcap的请卸 ...
- 启动Sql server的服务CMD命令
启动:net start mssqlserver 停止:net stop mssqlserver
- [Java] - MySQL数据库的时间设置问题.
之前有朋友做的项目时间格式设置为String,我感觉很不好,随后自己试了试. 首先在设置数据库类型时,选择的是timestamp, 而Java的实体中设置时间的属性类型为Date, (java.uti ...
- 【Coursera】Fourth Week(1)
1994: year of the web (1)网景(Netscape)成立. (2)www conference 在CERN 举办. (3)www conference 在芝加哥举办. (4)十月 ...
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...