5.4 使用 Razor 表达式
以下内容主要展示 Razor 所支持的各种表达式,以及如何用它们来创建视图的内容。
在一个好的 MVC 框架应用程序中,动作方法与视图的作用是清晰、分离的。其规则很简单,如表所示:
| 组件 | 要做的事 | 不做的事 |
| 动作方法 | 向视图传递一个视图模型 | 向视图传递格式化数据 |
| 视图 | 用视图模型对象向用户表现内容 | 修改视图模型对象的任何方面 |
为了发挥 MVC 框架的最大优势,你需要注重并强迫应用程序各个部分之间的分离。
正如你将看到的,利用 Razor 可做的事很多,包括使用 C# 语句 —— 但你应该不用 Razor 执行业务逻辑或以任何方式(使用 Razor)对域模型做任何修改。
同样,也不应该对动作方法传递给视图的数据进行格式化,而是让视图 “猜出” 它需要显示的数据。—— 即使笔者知道要显示的是哪些属性,也应该传递完整的 Product 对象给视图模型(return View(myProduct); )
然后可以在视图中使用 Razor 的 @Model 表达式,以得到要插入的属性的值。
笔者可以在动作方法中创建要显示的字符串,并把它们作为视图模型传递给视图,但采用这种办法破坏了 MVC 模式的好处,且降低了对未来修改进行相应的能力。
处理与格式化数据:
重要的是要区分 “数据处理” 和 “数据格式化”。
视图会对数据进行格式化。(在前面几个小节中,只是将 Product 对象传递给视图,但并未将对象的属性格式化成显示字符串,正是处于这一原因)
数据处理(包括选择要显示的数据对象)是控制器的责任,它会调用模型以获取和修改所需的数据。
有时候很难指出数据处理和数据格式化的界限,但作为一般规则,笔者建议还是谨慎一些好。—— 将除最简单的表达式外的所有内容都从视图移到控制器中。
5.4.1 插入数据值
用 Razor 表达式能做的最简单的事情就是将数据值插入到标记中。—— 你可以用 @Model 表达式来做这件事,以引用视图模型对象所定义的属性与方法,或者使用 @ViewBag 表达式,以引用通过视图包特性动态定义的属性。如下所示:
在控制器类文件中:
Product myProduct = new Product { …… };
public ActionResult 动作方法名()
{
ViewBag.ProductCount = 1;
ViewBag.Supplier = null;
return View(myProduct);
}
在对应的强类型视图文件中使用这两种方式:
……<td>@Model.Name</td>
……<td>@ViewBag.ProductCount</td>
5.4.2 设置标签属性的值
到此为止的所有例子都是设置元素内容的,但你也可以使用 Razor 表达式来设置元素的标签属性的值。—— 可以将视图包属性用于设置标签属性的值。(直接在属性后的引号里使用@ViewBag.***就可以了)(问题是像颜色要怎么弄)
Razor 会将值为 null 的视图包属性或模型属性渲染成空字符串。(对于 checked 标签属性,在值为 False 或 null 时,Razor 会完全删除该标签属性 —— 根本不渲染 checked 标签属性)
5.4.3 使用条件语句
Razor 能够利用条件语句,根据视图数据的值,对视图的输出进行剪辑。—— 这种技术是 Razor 的核心功能,它们让你能够创建复杂而流畅的视图,使视图仍易于阅读和维护。
为了开始一个条件语句,你要在 C# 的条件关键字前放一个 @ 字符。
Razor 中的 switch 表达式必须转换成指定的类型才能够让它知道如何执行比较。(如:@switch ((int)ViewBag.ProductCount))
在 Razor 代码块的内部,只要通过定义 HTML 以及 Razor 表达式,就可以将 HTML 元素和数据值插入到视图输出。
<b>Low Stock @ViewBag.ProductCount </b>
或者像这样:
@ViewBag.ProductCount
不必将元素或表达式放在引号内,或以特殊的方式来表示它们 —— Razor 引擎会处理好这些。
然而,如果你想将未包含在 HTML 元素中的文字文本插入到视图,则需要使用 Razor 的一个辅助工具,并以它作为这一行的前缀,像这样:
@: Out of Stock
@: 字符阻止 Razor 将此行解释为一条 C# 语句。(若一行文本未使用 @: 为前缀,则 Razor 默认将此行视图是一条 C# 语句)
条件语句在 Razor 视图中是重要的,因为它们能够让页面的内容随着视图从动作方法接收的数据值的变化而变化。
笔者只是希望演示如何在 Razor 视图中组织 C# 条件语句。(在 20 章深度考察视图时,笔者会解释所有这些工作机制)
5.4.4 枚举数组和集合
Visual Studio 的支架特性不会让你指定一个数组作为一个模型类型。(换句话说就是选项里面没有这个选择)
为了对传递数组的动作方法创建视图,最好的办法是创建一个不含模型的视图,然后在已创建的文件中手动添加 @model 表达式。
@model Razor.Models.Product[ ]
……
@if (Model.Length > 0)
{
……
@foreach (Razor.Model.Product p in Model)
{
<tr><td>@p.Name</td> <td>@p.Price 元</td></tr>
}
}
这里使用一个 @foreach 表达式来枚举数组的内容,并为每一条数组生成一个 HTML 表格行。(笔者在 foreach 循环中创建了一个局部变量 p,然后用 Razor 表达式引用了它的属性)
5.4.5 处理命名空间
在一个对视图模型和其他类要做很多引用的复杂视图中,使用完整的限定名会令人很厌烦。
对一个视图运用 @using 表达式,可以引入命名空间,这就像规则的 C# 类所做的那样。
@using Razor.Models
@model Product[ ]
……
…… Product p in Model
5.4 使用 Razor 表达式的更多相关文章
- 使用 Razor 表达式
https://blog.csdn.net/github_37410569/article/details/54986136 https://blog.csdn.net/qq_21419015/art ...
- 使用Razor 使用Razor表达式处理命名空间 精通ASP-NET-MVC-5-弗瑞曼
- 使用Razor表达式 举数组和集合 精通ASP-NET-MVC-5-弗瑞曼
- 使用Razor表达式 使用条件语句 来自 精通ASP-NET-MVC-5-弗瑞曼
- ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考
原文:Razor Syntax Reference 作者:Taylor Mullen.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:何镇汐 什么是 Razor? Razor 是一 ...
- Razor基础语法一
目录: 什么是Razor? 渲染HTML Razor语法 隐式 Razor 表达式 显式 Razor 表达式 什么是Razor? Razor是基于服务端代码转换成网页的标记语法.语法主要包括Razor ...
- ASP.NET MVC——Razor视图引擎
Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...
- Razor 视图引擎 – ASP.NET MVC 4 系列
Razor 视图引擎是 ASP.NET MVC 3 开始扩展的内容,并且也是默认视图引擎. Razor 通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换.下面的例子演 ...
- MVC – 7.Razor 语法
7.1 Razor视图引擎语法 Razor通过理解标记的结构来实现代码和标记之间的顺畅切换. @核心转换字符,用来 标记-代码 的转换字符串. 语境A: @{ string rootName=&quo ...
随机推荐
- MySQL数据库----触发器
触发器-trigger 触发器:监视某种情况,并触发某种操作. 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 -- 触发器:某种程序触发了工具的运行 -- 触发器不能主 ...
- mysql8.0无法给用户授权或提示You are not allowed to create a user with GRANT的问题
提示意思是不能用grant创建用户,mysql8.0以前的版本可以使用grant在授权的时候隐式的创建用户,8.0以后已经不支持,所以必须先创建用户,然后再授权,命令如下: mysql> CRE ...
- TED #08# Learn to read Chinese ... with ease!
ShaoLan: Learn to read Chinese ... with ease! Pre-requisites calligraphermy most treasured memoriesw ...
- pyDay7
内容来自廖雪峰的官方网站 1.如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 2.只要是可迭代对象,无论有无下标, ...
- 使用 Vue.js 结合bootstrap 实现的分页控件
原文链接:http://blog.csdn.net/qiuhaotc/article/details/53031884 源码下载: http://pan.baidu.com/s/1i4XgH6H 密码 ...
- Linux slab分配器【转】
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/ 良好的操作系统性能部分依赖于操作系统有效管理资源的能 ...
- JavaScript 各种验证收集
filter或者forEach函数,可能是因为你的浏览器还不够新,暂时不支持新标准的函数,你可以使用如下方式自己定义: if (!Array.prototype.forEach) { Array.pr ...
- 复习_for循环嵌套 及 流程图梳理
原题: 使用for循环输出如下图形: * ** *** **** 分析及做法. 图链接: https://www.processon.com/view/link/5afba745e4b05352c2b ...
- maven 插件在线安装
NO.1 在Eclipse中安装Maven插件安装详解 前言 本来是没打算写博客的,作为一个13年毕业的菜鸟,自认为水平太渣写不出什么好文章,但是前些日子看到一篇鼓励性质的文章说,技术人员的成长靠的就 ...
- Ubuntu 14.04 安装libssh
参考: libssh [CMake] include command Ubuntu 14.04 安装libssh $ git clone https://github.com/substack/lib ...