《ASP.NET MVC 4 实战》学习笔记 3:视图

本篇最后两节没看懂,但是日子还是要过,先笔录下来等以后再慢慢理解吧。。。

视图的生存目标是取得一个送给它的模型并用这个模型来渲染内容。由于控制器及相关服务已经执行了所有业务逻辑并将结果包装成一个模型对象,故视图只需要知道如何取得这一模型并把它转换成HTML。

一、选择待渲染视图:

视图是通过控制器动作中调用View方法来渲染的,如前面所讲GuestbookController中的Create动作:

public ActionResult Create()
{
  return View();
}

当不带参数调用View方法时,框架默认渲染视图的名字与动作名(Create)相同,默认的视图引擎会在Views/<控制器名>和Views/Shared目录中查找。

若要渲染的视图与动作名不同,则需要传参给View方法,如New.cshtml,则 return View("New")。如果视图不在与控制器同名的子目录中,则需要指定相关路径,如return View("~/Views/SomeOtherDirectory/New.cshtml")。

二、给视图传递数据:

将数据传递给视图有三种方式:ViewDataDictionary(视图数据字典)、ViewBag(视图包)和强类型视图。

1.ViewDataDictionary:

修改Details动作和Details视图,如下:

 1 public ActionResult Details(int? id)
 2         {
 3             if (id == null)
 4             {
 5                 return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
 6             }
 7             GuestbookEntry guestbookentry = db.Entries.Find(id);
 8             if (guestbookentry == null)
 9             {
10                 return HttpNotFound();
11             }
12             bool IsShowEdit = guestbookentry.Name == "张无忌";
13             ViewData["IsShowEdit"] = IsShowEdit;
14             return View(guestbookentry);
15         }
 1 @* 以上省略 *@
 2 <p>
 3     @{
 4         bool IsShowEdit = (bool)ViewData["IsShowEdit"];
 5     }
 6     @if(IsShowEdit)
 7     {
 8         @Html.ActionLink("Edit", "Edit", new { id = Model.Id })
 9     }
10     @Html.ActionLink("Back to List", "Index")
11 </p>

我们可以在ViewDataDictionary中存储任何数据,但是从字典接收数据必须执行类型转换。

2.ViewBag:

上面的Details动作和Details视图可修改为:

ViewBag.IsShowEdit = IsShowEdit;
@if(ViewBag.IsShowEdit)
    {
        @Html.ActionLink("Edit", "Edit", new { id = Model.Id })
    }

ViewBag不需要类型转换,可以直接使用。

ViewData和ViewBag的优点是灵活,缺点是如果在使用中输错动态属性名编译器不能检测出错误。另外也不能将元数据添加到动态属性上,如注解属性。

3.强类型视图:

使用@model关键字指定模型类型就得到了一个强类型,如Index视图中:

@model IEnumerable<Guestbook.Models.GuestbookEntry>

也可以写成:

@using Guestbook.Models
@model IEnumerable<GuestbookEntry>

  我们可以利用专为强类型视图设计的HtmlHelper扩展方法显示强类型视图数据,清单如下:

三、使用强类型模板:

HtmlHelper扩展方法适合于个别的HTML元素片段,但是当生成的HTML开始变得更加复杂并且包含各种元素时一般不倾向与扩大使用。MVC团队又设计了模板辅助器(Templated Helper),辅助生成基于强类型的HTML。

1.DisplayFor和EditorFor模板:

  • Html.Display("Message");  --弱类型视图显示模板
  • Html.Display(m=>m.Message);  --基于表达式强类型视图显示模板
  • Html.DisplayForModel();  --迭代模型中的每个成员生成完整的显示视图模板
  • Html.Editor("UserName");  --弱类型视图编辑模板
  • Html.EditorFor(m=>m.UserName);  --基于表达式强类型视图编辑模板
  • Html.EditorForMode();  --迭代模型中的每个成员生成完整的编辑视图模板

2.内建模板:

除Collection和Object模板外,每个模板都渲染一个单值。Collection模板循环遍历模型对象中的每个数据项,Object模板循环遍历ModelMetadata.Properties集合的每个数据项。

3.选择模板:[ 暂时没搞太懂。。。]

本质上显示模板和编辑模板的辅助器方法是使用一个特定的算法按照名称查找来选择所用的模板。

模板的搜索位置是DisplayTemplates和EditorTemplates文件夹,像部分视图和视图的名称一样,在转向Shared视图文件夹之前模板方法首先查看控制器(或“区域+控制器”)专用的视图文件夹。以编辑模板为例,如果模板辅助器方法是在区域专用视图中使用的那么这些文件夹包括:

  • <Area>/<控制器名>/EditorTemplates/<模板名>.cshtml(或.vbhtml);
  • <Area>/Shared/EditorTemplates/<模板名>.cshtml

如果在这些文件夹中没找到模板或者该视图不在区域中,将使用默认的视图搜索位置:

  • <控制器名>/EditorTemplates/<模板名>.cshtml(或.vbhtml);
  • Shared/EditorTemplates/<模板名>.cshtml

4.定制模板:[ 彻底没看懂,哭。。。]

  建立在部分视图上的模型模板的优点:

  1).部分视图需要在视图中通过名称来选择,模板是通过模型元数据信息来选择的,无须为视图明确指定使用哪个模板;

  2).ViewDataDictionary给模板提供了额外信息,部分视图和其他页面是接收不到这些信息的,这种信息在ViewData.ModelMetadata属性中。

  利用ModelMetadata属性可以访问通过模型元数据提供器(Model Metadata Provider)生成的所有元数据信息,包括模型类型信息、属性以及模型的元数据。

  除了一般的模型类型信息外,ModelMetadata对象还包括其他元数据,这些默认是通过注解属性填充的。

  ModelMetadata对象还公开了一个类型为IDictionary<string,object>的AdditionalValues属性,它能包含通过自定义模型元数据提供器填充的附加元数据信息。

时间: 2024-10-14 18:22:41

《ASP.NET MVC 4 实战》学习笔记 3:视图的相关文章

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: <input name="UserName&quo

ASP.Net MVC开发基础学习笔记:一、走向MVC模式

一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由

ASP.Net MVC开发基础学习笔记(1):走向MVC模式

链接地址:http://blog.jobbole.com/84992/ 一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到

ASP.NET MVC Web API 学习笔记---Web API概述及程序示例

1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP) 2. ASP.NET W

ASP.NET MVC Web API 学习笔记---第一个Web API程序

http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有

ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器

一.校验 — 表单不是你想提想提就能提 1.1 DataAnnotations(数据注解) 位于 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中的各个字段的验证.这些特性用于定义常见的验证模式,例如范围检查和必填字段.而 DataAnnotations 特性使 MVC 能够提供客户端和服务器验证检查,使你无需进行额外的编码来控制数据的有效. 通过为模型类增加数据描述的 DataAnnotations ,我们可以容易地为应用程序增加验证

ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新的区域,可以让我们的项目不至于太复杂而导致管理混乱.有了区域后,每个模块的页面都放入相应的区域内进行管理很方便.例如:上图中有两个模块,一个是Admin模块,另一个是Product模块,所有关于这两个模块的控制器.Model以及视图都放入各自的模块内.可以从上图中看出,区域的功能类似一个小的MVC项

【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP)  2. ASP.NET