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 ...
随机推荐
- 教你如何用Nginx搭建一个安全的、快速的微服务架构
今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.最后,我们将向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo. 在我们探讨Fabric模式之前,我 ...
- pyDay2
内容来自廖雪峰的官方网站 1.dict 为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的.假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想 ...
- Tomcat分windows版和linux版
Tomcat分windows版和linux版 官方下载链接:http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.37/bin/ windows下载e ...
- 堆(Heap)
两种简单实现 第一种 链表 第一种实现利用链表存储数据,每次在表头插入元素:getMin 时,遍历一遍线性表找到最小的元素,然后将之删除.值返回.(getMax 同理). 链表的在头节点的插入和删除时 ...
- C_Learning(3)
/ 结构体 / 声明结构体类型的一般形式: struct 结构体名[--表示的是这个结构体的类型] { 成员列表 }; [不要漏掉这个";"] / 声明结构可以放在main函 ...
- 特征提取的综合实验(多种角度比较SIFT、SURF、BRISK、ORB算法)
代码:https://files.cnblogs.com/files/jsxyhelu/main.zip 一.基本概念: 特征点提取在“目标识别.图像拼接.运动跟踪.图像检索.自动定位”等研究中起着重 ...
- 20162311 Hash 补分博客
20162311 Hash 补分博客 一.任务详情 二.解题过程 除留余数法和拉链法都懂了,也都会做,主要是开放寻址法.课下查了一些资料,也问了老师才彻底理解 引用例子 引用网上的一个例子来理解 参考 ...
- BZOJ 3529 数表(莫比乌斯+树状数组)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3529 题意:有一张n×m的数表,其第i行第j列的数值为能同时整除i和j的所有自然数 ...
- Python3基础 if elif 示例 判断一个数在哪个区间内
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...