• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
成为自己最想成为的那种人
博客园    首页    新随笔    联系   管理    订阅  订阅
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

posted on 2017-09-25 16:04  遇见未来  阅读(436)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3