**《ASP.NET MVC 4 实战》

========== ========== ==========
[作者] (美) Jeffrey Palermo (美) Jimmy Bogard (美) Eric Hexter (美) Matthew Hinze (英) Jeremy Skinner
[译者] (中) 徐燕萍 李萍 林逸
[出版] 人民邮电出版社
[版次] 2014年05月 第1版
[印次] 2014年05月 第1次 印刷
[定价] 69.00元
========== ========== ==========

【第01章】

(P003)

Web 本质上是无状态的。

【第02章】

(P015)

框架是如何知道将 URL 映射到一个特定的控制器动作的?答案就在 Global.asax 文件的 RegisterRoutes 方法中。

Web API 是微软随 ASP.NET MVC 4 一起发布的一个 Web 服务框架。

(P016)

ViewBag 本质上是一个字典 —— 它提供了一种存储数据的方式,这些数据随后能够在视图中进行访问。

(P017)

@ 前缀表示 HTML 与代码之间的转换。

【第03章】

(P032)

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

(P033)

可以调用 View 方法的第二个重载版本来接受一个明确的视图名。

(P034)

能够将数据传递给视图的三种不同方式,即使用 ViewDataDictionary (视图数据字典) 、 ViewBag (视图包) ,以及强类型视图。

(P035)

只要从字典接受数据,就必须执行类型转换。

(P036)

为了使用强类型视图,首先必须确保控制器动作适当地设置了 ViewData.Model 。

(P037)

Razor 的多行代码语句是以 @ 后跟开花括号字符开始的 : @{ 。

(P038)

数据在渲染到屏幕之前是默认自动编码的。若要显示未编码信息,可以使用 Html.Raw 方法来强迫渲染原始文本。

(P043)

对于简单的显示模型和编译器模型, EditorForModel 和 DisplayForModel 方法可能就够了。

【第04章】

(P051)

IController 接口定义了控制器最基本的元素 —— 一个单一的 Execute 方法,它接收一个 RequestContext 对象。

ControllerBase 类直接实现 IController ,但只包含了我们曾考察的几个特性所必需的基础架构。

(P052)

Controller 类继承于 ControllerBase ,因此它包含了 ControllerBase 所定义的属性 (如 ViewData) ,但它还增加了大量的附加功能。

(P053)

更好的做法是依靠视图,以使表现逻辑与控制器分离开来。这更易于修改应用程序的用户界面,而无需改变控制器代码。

动作方法选择器是一种注解属性,它可以用来对动作方法进行修饰或标注。

选择器的名称总是 XXXAttribute 形式的,但在使用时,需要将 Attribute 部分去掉。

(P057)

请记住,调用 ModelState.IsValid 并未真正执行验证,它只是检查验证是否已经成功或失败,验证本身是在调用控制器动作之前发生的。

(P060)

每个测试都有三个阶段 —— Arrange (准备) 、 Act (动作) 、 Assert (断言) 。

【第05章】

(P067)

视图模型的目的十分简单 —— 它是一个专门为用于视图而设计的模型。它提供了一个建立在域模型之上的简化接口,以保持视图决策最小化。

(P068)

为了使视图尽可能是可维护的,它应该尽可能简化 —— 复杂的循环和计算逻辑应该在更高层执行,视图唯一应该做的只是显示这种计算的结果。

(P070)

控制器与视图共享了一个 ViewDataDictionary 类型的对象,其名称为 ViewData 。

【第06章】

(P076)

服务器是保护数据、防止劣质输入的最后一道防线。

【第07章】

(P088)

现在有许多流行的 JavaScript 库 (包括 jQuery 、 Prototype 、 MooTools 和 Dojo 等) ,所有这些都是为了让 JavaScript 更易于使用,并辅助跨浏览器的 JavaScript 功能标准化。

在使用 jQuery 时,主要是使用 jQuery 函数 (基本上是使用别名符号 “$”) ,它能够根据其上下文执行各种不同的操作。

当把一个字符串传递给 “$” 函数时, jQuery 会将其视为 CSS 的选择器,并尝试在页面中找出与该选择器匹配的任何元素。

“#” 表示元素的 id 标签属性。

“.” 表示元素的 class 标签属性。

空格表示子元素。

(P089)

最好将所有事件绑定和 jQuery 代码都包含到 ready 处理程序之中。

(P092)

只有启用了 JavaScript 的浏览器才能向服务器发送 Ajax 请求,否则只能发送常规的 HTTP 请求。

(P095)

由于 JavaScript 是将函数作为对象来使用的,所以 this 关键字的含义并不总是显而易见的,因为它是上下文敏感的。

(P098)

对 BeginForm 的调用会渲染表单的开标签,而 using 语句的闭括号会渲染

的闭标签。

【第08章】

(P113)

认证确保用户已提供了适当的访问系统所需的凭据。一旦用户登录,那么他们便是已认证的了。

授权发生在认证之后,且包括对给定用户是否有权对系统做某事的决策。当用户访问一个其他人不可用的资源时,必须得到明确的授权。

(P118)

决不相信输入。决不、永远、永远也别期望输入是安全的。无论是人类用户或是机器,危险的输入都是陷入 XSS ***的根源。

HTML 编码是将 HTML 转换成文本,这种 HTML 会被浏览器解释成渲染时不再解释的符号。

【第09章】

(P129)

通过使用路由, URL 完全能够与底层实现解耦。

(P131)

对于 URL ,大小是有关系的,而且是越小越好。

(P136)

路由处理程序是实现 IRouteHandler 接口的类,并负责构造适当的 HTTP 处理程序,以便为所选路由处理请求。

【第10章】

(P157)

为了创建一个类型的实例,你必须通过开泛型类型创建一个闭泛型类型。

【第11章】

(P173)

利用 AutoMapper 让开发人员能够只写一次代码,然后只要用一个声明,就可以在很多地方运用它。

【第12章】

(P174)

注重保持控制器轻量级是重要的。

(P175)

减轻控制器负担的快速方式是去除其责任。

(P177)

重构不会让事情简单很多,但一个简单的更改可能会明显降低圈复杂度,并且能够减轻与复杂控制器关联在一起的测试努力和维护负担。

【第13章】

(P193)

T4MVC 是一个强大的工具,它能够消除 ASP.NET MVC 应用程序中的许多魔术字符串激增问题。

【第14章】

(P194)

Nuget 是随 MVC 一起安装的,并使得 MVC 开发更容易。

【第15章】

(P208)

NHibernate 要求至少有一个映射。

(P209)

Log4Net.config 文件含有 log4net 的配置信息,该信息广泛适用于任何类型的应用程序。

【第16章】

(P222)

框架包含一个 ControllerBase 类,它为管理 ViewData 和 TempData 提供了最基本的属性。

(P223)

动作是控制各个服务器请求主逻辑的方法,但并不是一个控制器类的所有方法都有资格作为一个动作。

(P230)

动作有助于你轻松地讲单个控制器分解成一些基本功能,而动作过滤器则为在动作执行之前或之后插入一些代码提供了挂接手段。动作选择器为动作调用器提供了应选择哪一个动作执行的线索,而动作结果有助于封装重复的渲染逻辑。

【第17章】

(P233)

布局也可以相互嵌套,因此,可以为整个网站的通用模板定义一个泛型网站级布局。更具体的布局然后可以定义更具体的模板和新的内容块。

当多个视图共享公用内容时,运用布局是最好的方式。然后可以把 (视图) 内容推送给布局,每个视图只需要提供自己的内容片断。

(P234)

渲染分部的机制很简单,可以在一个父视图中使用 RenderPartial 方法或 Partial 方法。

即使不与其他视图进行内容共享,分部也可以用来简化和减少视图中的标记量。

(P235)

Html.RenderPartial() 是一个无返回方法,它立即将分部渲染到响应流。而 Html.Partial() 返回一个字符串被立即渲染到视图。

在 Razor 中, Html.RenderPartial 必须放在一个代码块中。

(P237)

常规控制器动作与子动作之间的唯一区别就是这个 ChildActionOnly 注解属性。

【第18章】

(P247)

作为开发者,经常容易受到技术细节、设计模式,以及建立优雅的可维护体系结构等方面的困扰,而忽略关注事情的真正本质 —— 解决用户的问题。如果应用程序不能实际工作,即使有最可维护的代码,对用户也是毫无帮助的。

(P248)

知道何时或何处才适合使用一种技术或工具,与知道如何使用这一技术是同等重要的。

(P251)

DI 容器本质上是一个智能工厂。像其他工厂类一样,其职责是创建对象的实例,但它也知道如何实例化对象的依赖性。

(P253)

任何对基础结构的某种外部依赖性都可以用一种很好的候选办法来实现,这种办法就是将这种依赖性提取出来,形成一个由控制器使用的接口。

【第19章】

(P261)

Nuget 包是一个简单的 zip 文件,它含有一个清单和需要安装到 Visual Studio 项目中的文件。它还包含了三个 PowerShell 脚本,用于在安装、卸载和项目启动期间实现自动化。Nuget 包是通过其 ID 进行标识的,这是一个用以唯一标识包及其版本号的字符串。清单文件含有以下方面的信息 : 安装期间需要添加到项目的文件、依赖包列表,以及包括作者、项目网站 URL 和许可 URL 等信息的附加元数据。
**