以下内容主要展示 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 表达式的更多相关文章

  1. 使用 Razor 表达式

    https://blog.csdn.net/github_37410569/article/details/54986136 https://blog.csdn.net/qq_21419015/art ...

  2. 使用Razor 使用Razor表达式处理命名空间 精通ASP-NET-MVC-5-弗瑞曼

  3. 使用Razor表达式 举数组和集合 精通ASP-NET-MVC-5-弗瑞曼

  4. 使用Razor表达式 使用条件语句 来自 精通ASP-NET-MVC-5-弗瑞曼

  5. ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考

    原文:Razor Syntax Reference 作者:Taylor Mullen.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:何镇汐 什么是 Razor? Razor 是一 ...

  6. Razor基础语法一

    目录: 什么是Razor? 渲染HTML Razor语法 隐式 Razor 表达式 显式 Razor 表达式 什么是Razor? Razor是基于服务端代码转换成网页的标记语法.语法主要包括Razor ...

  7. ASP.NET MVC——Razor视图引擎

    Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...

  8. Razor 视图引擎 – ASP.NET MVC 4 系列

           Razor 视图引擎是 ASP.NET MVC 3 开始扩展的内容,并且也是默认视图引擎.        Razor 通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换.下面的例子演 ...

  9. MVC – 7.Razor 语法

    7.1 Razor视图引擎语法 Razor通过理解标记的结构来实现代码和标记之间的顺畅切换. @核心转换字符,用来 标记-代码 的转换字符串. 语境A: @{ string rootName=&quo ...

随机推荐

  1. sp3485推荐电路(转)

    源: sp3485推荐电路 注意:转自电子发烧友 转:485通信自动收发电路 转: RS485收发的3种典型电路-重点-自动收发电路

  2. Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing 'value'

    Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing ' ...

  3. Android MediaPlayer 操作

  4. Hive-查询结果导入到 MySQL

    step1:add jar /home/chenweidong/lib/hive-contrib-2.1.1-cdh.0.0.jar;add jar /home/chenweidong/lib/mys ...

  5. STM32.定时器

    一.定时器分类 11个定时器: 定时器: 1.8  高级(7路PWM输出) 2.3.4.5 通用(4路) 6.7    基本 2个看门狗 1个sysTick 时钟分布: 二.这里我们主要对定时器中 定 ...

  6. git2

    1,开源的代码管理工具 2,分布式管理工具(更安全,可以脱网操作) 3,git的分支管理更加便捷. 4,代码的传输更新速度更快 利用git可以进入多人配合代码开发.有备份.协同 sudo apt-ge ...

  7. CSS高级布局

    float属性 基本浮动规则 先来了解一下block元素和inline元素在文档流中的排列方式. block元素通常被现实为独立的一块,独占一行,多个block元素会各自新起一行,默认block元素宽 ...

  8. 主引导记录MBR的结构和作用

    MBR磁盘分区都有一个引导扇区,称为主引导记录,英文简称为MBR.1. MBR的结构MBR扇区位于整个硬盘的第一个扇区:按照C/H/S地址描述,即0柱面〇磁头1扇 区:按照LBA地址描述即0扇区.它是 ...

  9. 论文笔记——ThiNet: A Filter Level Pruning Method for Deep Neural Network Compreesion

    论文地址:https://arxiv.org/abs/1707.06342 主要思想 选择一个channel的子集,然后让通过样本以后得到的误差最小(最小二乘),将裁剪问题转换成了优化问题. 这篇论文 ...

  10. UVa 12563 劲歌金曲(0-1背包)

    https://vjudge.net/problem/UVA-12563 题意: 在一定的时间内连续唱歌,最后一首唱11分钟18秒的劲歌金曲,问最多能长多长时间. 思路: 0-1背包问题,背包容量为t ...