《ASP.NET MVC 5 高级编程》
========== ========== ==========
[作者] (美) Jon Galloway (美) Brad Wilson (美) K. Scott Allen (美) David Matson
[译者] (中) 孙远帅
[出版] 清华大学出版社
[版次] 2015年02月 第1版
[印次] 2015年02月 第1次 印刷
[定价] 59.80元
========== ========== ==========
【第01章】
(P001)
证明软件框架和模式价值最好的方法就是展示它们在实际场景中的应用。
(P007)
虽然 ASP.NET API 包含在 ASP.NET MVC 4 中,但它可以单独使用。事实上,它与 ASP.NET 不存在任何依赖关系,并且可以自托管 —— 也就是说,独立于 ASP.NET 和 IIS 。
(P014)
MVC 5 是完全 bin 部署的,这意味着所有必要的程序集都包含在应用程序的 bin 目录中。只要服务器上有 .NET 4.5 ,就可以进行安装。
【第02章】
(P023)
URL 并不与存储在 Web 服务器磁盘上的文件有直接对应关系,而是与控制器类的方法有关。
路由子系统在前面,之后才是控制器。
(P024)
MVC 提供的是方法调用结果,而不是动态生成的 (又名脚本) 页面。
(P025)
在 ASP.NET MVC 中,每个请求都被路由到控制器的一个方法 (又称操作),该控制器全权负责解释这些请求,如有必要,还要操纵模型,然后选择一个视图反馈给用户。
(P034)
利用方法 HttpUtility.HtmlEncode 来预处理用户输入,这样就能阻止用户用链接向视图中注入 JavaScript 代码或 HTML 标记。
ASP.NET MVC 的默认路由约定,就是将操作方法名称后面 URL 的这个片段作为一个参数,该参数的名称为 ID 。
【第03章】
(P036)
视图实际上就是应用程序的 “大使” 。
(P037)
视图总是被控制器渲染,因为控制器为它提供了要渲染的数据。
(P039)
ViewBag 具有局限性,但是如果只是向视图传递少量数据,它还是很有用的。
(P042)
可以从控制器向视图传递一个在两端都是强类型的模型对象。
如果不想输入模型类型的完全限定类型名,可使用 @using 关键字声明。
对于在视图中经常使用的名称空间,一个较好的方法就是在 Views 目录下的 web.config 文件中声明。
(P045)
显示 “Add View” 对话框最简单的方法就是在操作方法上右击。
(P049)
Razor 中的核心转换字符是 “at” 符号 (@) 。这个单一字符用做 “标记-代码” 的转换字符,有时也反过来用做 “代码-标记” 的转换字符。
(P053)
有些情况下,需要显式地渲染一些不应该采用 HTML 编码的值,这时可以采用 Html.Raw 方法来保证该值不被编码。
(P054)
可以用 “@@” 来编码 “@” 以达到显示 “@” 的目的。
(P055)
@RenderBody 是一个占位符,用来标记使用这个布局的视图将渲染它们的主要内容的位置。
【第04章】
(P062)
在 Visual Studio 中,既可以使用 Build | Build Solution 菜单项,也可以使用键盘快捷键 Ctrl + Shift + B 来编译应用程序。
(P063)
基架对于创建应用程序来说不是不可或缺的,但是利用基架会为应用程序开发节省很多时间。
(P079)
浏览器会自动收集用户在表单中输入的所有信息并将这些值 (及其相关的 name 属性值) 放在请求中一起发送。
【第05章】
(P086)
action 特性用以告知 Web 浏览器信息发往哪里,所以 action 就顺理成章地包含一个 URL 。
当用户使用 HTTP GET 请求提交时,浏览器会提取表单中输入元素的 name 特性值及其相应的 value 特性值,并将它们放入到查询字符串中。
如果不想让浏览器把值放入查询字符串中,而是想放入 HTTP 请求的主体中,就可以给 method 特性赋值 post 。
(P087)
通常情况下,在 Web 应用程序中, GET 请求用于读操作, POST 请求用于写操作 (通常包括更新、创建和删除) 。
(P089)
可以通过视图的 Html 的属性调用 HTML 辅助方法。相应地,也可以通过 Url 属性调用 URL 辅助方法,通过 Ajax 属性调用 AJAX 辅助方法。所有这些方法都有一个共同的目标 : 使视图编码变得容易。
(P091)
在 ASP.NET MVC 框架的重载版本中,几乎每一个 HTML 辅助方法都包含 htmlAttributes 参数。
所有的 HTML 辅助方法在渲染 HTML 时会将属性名中的下划线转换为连字符。
(P093)
ValidationSummary 辅助方法可以用来显示 ModelState 字典中所有验证错误的无序列表。
(P095)
TextBox 辅助方法渲染一个 type 特性为 text 的 input 标签。我们一般利用 TextBox 辅助方法接收用户自由形式的输入。
(P096)
label 的作用就是为其他输入元素显示附加信息,这样可以为用户提供人性化的界面,从而增强应用程序的可访问性。
label 的 for 特性应该包含相关输入元素的 id 。
如果用户单击 label ,那么浏览器会把焦点传送给相关的输入控件。
(P097)
当 ModelState 字典中的某一特定字段出现错误时,可以使用 ValidationMessage 辅助方法来显示相应的错误提示信息。
(P098)
辅助方法提供了对 HTML 细粒度控制的同时带走了构建 UI (要在合适的位置显示控件、标签、错误信息和值) 的乏味工作。
在 ViewBag 对象中的所有值也可以通过 ViewData 得到。
(P099)
在 id 特性中包含 (.) 是非法的。
如果没有有效的 id 特性,就无法执行带有 JavaScript 库 (如 jQuery) 的客户端脚本。
(P100)
辅助方法在查找强类型模型对象之前,会首先查看 ViewBag 。
(P101)
一般情况下,可为处理模型数据的每个辅助方法找到一个与其对应的强类型方法。
(P102)
ModelState 是模型绑定的副产品,并且存储模型绑定期间检测到的所有验证错误,以及用户提交用来更新模型的原始值。
(P104)
CheckBox 辅助方法是唯一一个渲染两个输入元素的辅助方法。
ActionLink 辅助方法能够渲染一个超链接 (锚标签) ,渲染的链接指向另一个控制器操作。
当链接的操作所在控制器与用来渲染当前视图的控制器一样时,只需要指定操作的名称。
当需要一个指向不同控制器操作的链接时,可通过 ActionLink 方法的第三个参数来指定控制器名称。
(P105)
尽管 RouteLink 辅助方法和 ActionLink 辅助方法遵循相同的模式,但是 RouteLink 只可以接收路由名称,而不能接收控制器名称和操作名称。
URL 辅助方法与 HTML 的 ActionLink 和 RouteLink 辅助方法相似,但它不是以 HTML 标记的形式返回构建的 URL ,而是以字符串的形式返回这些 URL 。
(P106)
Content 辅助方法特别有用,因为它可以把应用程序的相对路径转换成绝对路径。
ASP.NET MVC 5 使用的是 Razor 的第三个版本,波浪号当出现在 script 、 style 和 img 元素的 src 特性时就会被自动解析。
RenderPartial 辅助方法与 Partial 非常相似,但 RenderPartial 不是返回字符串,而是直接写入响应输出流。出于这个原因,必须把 RenderPartial 放入代码块中,而不能放在代码表达式中。
【第06章】
(P116)
每个验证特性都允许传递一个带有自定义错误提示信息的参数。
(P117)
默认情况下,ASP.NET MVC 框架在模型绑定时执行验证逻辑。
在操作方法带有参数时,就会隐式地执行模型绑定。
也可以利用控制器的 UpdateModel 或 TryUpdateModel 方法显式地执行模型绑定。
【第07章】
(P129)
身份验证是指通过使用某种形式的登录机制来核实用户的身份。
授权验证是用来核实登录站点的用户是否在他们的权限内执行操作。
Authorize 特性不带任何参数,只要求用户以某种角色身份登录网站。
(P133)
Authorize 特性是一个过滤器,也就是说,它能先于相关控制器操作执行。
(P137)
全局过滤器只针对 MVC 控制器操作,记住这一点很重要。它不能保障 Web Forms 、 静态内容或其他 ASP.NET 处理程序的安全。
(P140)
技术上讲,设计 OAuth 协议是出于授权的目的,但是该协议常常被用来进行身份验证。
(P150)
Html.Encode 是程序员最好的 “朋友” 。
(P161)
防御重复提交攻击的最简单方法就是,使用 [Bind] 特性显式地控制需要由模型绑定器绑定的属性。
[Bind] 特性既可以放在模型类上,也可以放在控制器操作参数中。
(P162)
避免直接绑定到数据模型也是有效防御重复提交攻击的一种方式。它通过使用一个视图模型 (View Model) ,只缓存允许用户设置的属性来阻止攻击。
【第08章】
(P171)
ASP.NET MVC 5 中主要的 Ajax 特性要么是基于 jQuery 构建,要么是扩展的 jQuery 特性。
(P172)
jQuery 擅长在 HTML 文档中查找、遍历和操纵 HTML 元素。一旦找到元素, jQuery 就可以方便地在其上进行操作。
jQuery 函数对象可以用来访问 jQuery 特性。
(P173)
当传递一个函数作为第一个参数时, jQuery 就会假定这个函数是要在浏览器完成构建 (由服务器提供的) HTML 页面中的文档对象模型 (Document Object Model , DOM) 后立即执行,换句话说,这个函数在从服务器加载完 HTML 页面之后执行。
jQuery 利用 JavaScript 的函数式编程特性,经常把创建的或传递的函数作为 jQuery 方法的参数。
(P174)
选择器是指传递给 jQuery 函数的、用来在 DOM 中选择元素的字符串。
jQuery 选择器的语法正是派生于 CSS 3.0 选择器的语法,并在其基础上做了一些补充。
jQuery 的 on 方法 (以及对应的 off 方法,用于取消订阅事件) 是在 jQuery 1.7 中引入的,用于为事件绑定提供一个统一的 API 。 on 方法取代了原来的 bind 、 live 和 delegate 方法;事实上,如果查看源代码,可看到 bind 、 live 和 delegate 方法只是将调用传递给了 on 方法。
(P175)
一旦选择了一些 DOM 元素或是在一个事件处理程序内, jQuery 就可以很容易地操纵页面上的元素,读取或设置它们的特性值,添加或移除它们的 CSS 类等。
jQuery 包含了向 Web 服务器回发异步请求所需的所有功能。可以用 jQuery 来生成 POST 请求或 GET 请求,并且当请求完成 (或出现错误) 时 jQuery 会发出通知。
(P182)
必须引用 jquery.unobtrusive-ajax.js 脚本,才能让 Ajax 辅助方法的 Ajax 功能生效。如果在使用 Ajax 辅助方法时发生问题,这时应该首先检查的地方。
可以把脚本引用添加到应用程序的 _Layout 视图中,也可以仅添加到使用 Ajax 辅助方法的视图中。除非在网站中发出大量 Ajax 请求,否则建议仅把脚本引用添加到单独的视图中。
(P196)
jQuery UI 可能是最流行的 jQuery 插件集合,也是最流行的 NuGet 包之一。
jQuery UI 是一个包含效果和小部件的 jQuery 插件。与所有插件类似,它紧密地集成了 jQuery ,并且扩展了 jQuery 中的 API 。
【第09章】
(P215)
在操作方法级别指定路由特性时,会覆盖控制器级别指定的任何路由特性。
(P223)
特性路由直接绑定到方法和控制器,而不是仅指定名称,这意味着它们更加精确。
(P224)
只需要记住,除非路由提供了 controller 和 action 参数,否则 MVC 不知道为 URL 运行哪些代码。
【第11章】
(P272)
应用程序频繁地使用 HTTP 和 JSON 作为通信渠道访问主页。当今的应用程序如果不能提供某种形式的远程访问 API 和/或 手机应用,就不能认为它已经 “完成” 。
ASP.NET MVC 在接收表单数据生成 HTML 方面功能非常强大; ASP.NET Web API 在接收和生成像 JSON 和 XML 等结构化数据方面功能非常强大。
(P273)
Web API 直接把结果模型对象作为响应来渲染。
(P283)
自托管和 Web 托管之间的主要区别在于路由的运行时刻 : 对于 Web 托管,ASP.NET 运行路由非常早;但在自托管情形中, Web API 运行路由的时刻就非常晚。
【第12章】
(P290)
HTML 应用程序,也与人称之为单页应用程序或 SPA (Single Page Application) ,是一个复杂的事物。
管理复杂性的技术通常都是创建一个可以隐藏复杂性的框架。
(P291)
为什么要在客户端使用模型、视图和控制器呢?其实和服务器端使用的原因一样 —— 维持代码的顺序,把不同功能分在不同的抽象中。
Web API 模板也有 ASP.NET MVC 支持,但只提供一个首页作为起始点。对于应用程序的需求,这样做是很完美的。
(P293)
Angular 核心指令都有一个 “ng” 前缀,这里 “ng” 即是 Angular 的简写。
“ng-app” 是 Angular 的应用程序引导指令。
“ng-app” 告知 Angular 跳入并初始化应用程序,并寻找其他内部指令和模板来控制 DOM 节,这一过程通常被称作编译 DOM 。
(P298)
Angular 控制器主要用来管理 DOM 节,构建模型。只要与之关联的 DOM 区域仍在展现, Angular 控制器就是有状态的、存活的。
【第13章】
(P321)
ASP.NET MVC 框架充分利用了扩展方法。大部分用来在视图中生成表单的 HTML 辅助方法都是 HtmlHelper 、 AjaxHelper 或 UrlHelper 类的扩展方法。
(P322)
依赖注入的最常见形式是构造函数注入 (constructor injection) 。
(P323)
属性注入 (property injection) 是一种不太常见的依赖注入方式。
(P324)
依赖注入容器便是使依赖解析变得简单的一种方式。依赖注入容器是一个可以作为组件工厂使用的软件库,它可以自动检测和满足里面元素的依赖需求。依赖注入容器 API 的使用接口看起来很像服务定位器,因为请求其执行的主要操作将根据类型提供一些组件。
(P329)
视图引擎的主要任务是把视图的名称转换为视图实例。
【第14章】
(P343)
ASP.NET 核心基础结构主要由 IHttpModule 和 IHttpHandler 接口,以及 HttpRequest 和 HttpResponse 等类的 HttpContext 层次结构组成。这些也是所有 ASP.NET 构建的基础类,无论是 Web Forms 、 MVC 还是 Web Pages 都是在其上构建。
【第15章】
(P366)
HTML 和 Ajax 辅助方法可以访问 ViewContext ,因为它们只能从视图中调用,而 URL 辅助方法可以访问 ControllerContext ,因为它们既可以从控制器中调用,也可以从视图中调用。
【第16章】
(P395)
默认基架器使用 Text Template Transformation (通常称为 T4) 生成代码。 T4 是一个集成到 Visual Studio 中的代码生成器引擎。
(P423)
使用同步管道的指导原则如下 :
1. 操作简单或者能在短时间内执行完毕;
2. 简单性和可测试性是重要的;
3. 操作是 CPU 密集型,而非 IO 密集型;
使用异步管道的指导原则如下 :
1. 测试结果表明阻塞操作是站点性能的瓶颈;
2. 并行性比代码简单更重要;
3. 操作是 IO 密集型,而非 CPU 密集型;
把一个操作转换为一个异步操作的一些要求 :
1. 操作方法必须使用 async 修饰符标记为异步;
2. 操作必须返回 Task 或 Task
3. 方法中的任何异步操作使用 await 关键字挂起操作,直到调用完成;