以下内容主要展示 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. web前端----jQuery属性操作

    知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性值 - 点击加载图片示例 remo ...

  2. Centos6版本使用yum报错 Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfi Setting up Install Process No package gcc available. Error: Nothing to do

    在使用Centos6版本yum时报错 Loaded plugins: fastestmirror, refresh-packagekit, securityLoading mirror speeds ...

  3. bzoj 1179 [APIO 2009]Atm(APIO水题) - Tarjan - spfa

    Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  4. lambda表达式学习

    Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 . 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 ...

  5. python创建MySQL多实例-1

    python创建MySQL多实例-1 前言 什么是多实例 多实例就是允许在同一台机器上创建另外一套不同配置文件的数据库,他们之间是相互独立的,主要有以下特点, 1> 不能同时使用一个端口 2&g ...

  6. 启动jenkins服务错误

    背景 重新安装了jenkins,需要启动,使用的yum install安装的,启动jenkins的话只需要执行service jenkins start,但出了两个问题 1. 是提示找不到java 2 ...

  7. SpringBoot添加自定义消息转换器

    首先我们需要明白一个概念:springboot中很多配置都是使用了条件注解进行判断一个配置或者引入的类是否在容器中存在,如果存在会如何,如果不存在会如何. 也就是说,有些配置会在springboot中 ...

  8. Death to Binary? (模拟)题解

    思路: 除去前导0,注意两个1不能相邻(11->100),注意 0 *** 或者*** 0或者0 0情况 用string的reverse()很舒服 代码: #include<cstdio& ...

  9. C指针 的一些练习

    注:此篇是我使用指针敲的一些题目的集成,有一些代码是重复的(挠头).这样做的目的是进行前后的一些比较和收获一些心得(?). 关于上一次我上台的题目: 题目:输入十个整数,进行排序. 做法1:(传递指针 ...

  10. 01_Spark基础

    1.1.Spark Ecosystem BlinkDB: 允许用户定义一个错误范围,BlinkDB将在用户给定的错误范围内,尽可能快的提供查询结果 1.2.Spark愿景 1.3.Spark简介 1) ...