《ASP.NET MVC 4 开发指南》javascript
========== ========== ==========
[做者] (台) 黄保翕
[出版] 清华大学出版社
[版次] 2013年07月 第1版
[印次] 2013年07月 第1次 印刷
[订价] 59.00元
========== ========== ==========html
【做者序】 java
要进入一个全新技术的领域,首要任务就是先感觉技术的价值,而后再进一步深刻研究技术的细节。web
【第01章】 数据库
(P004) json
简言之,只要是和 “数据” 有关的任务,都应该在 Model 里完成定义。设计模式
(P006) 安全
简言之,全部应该要显示在网页上的逻辑都是 View 负责的范围。app
(P013) 框架
经过自定义的 T4 代码生成器模板,也能快速地自动生成代码,进而达到快速开发之目的。
(P014)
鼓励开发人员能多接触各类不一样的技术领域,甚至学习不仅一种程序语言,除了能开阔视野外,也可以激发很多开发上的创意与乐趣。
【第02章】
(P017)
ASP.NET MVC 就是一个合理使用以习惯替换配置的开发框架,它将经过 MVC 设计模式常见的规则,切割成 Model 、 View 、 Controller 三个部分,并且明肯定义开发人员必须按照特定的 “习惯” 来开发程序。
【第03章】
(P053)
在定义 Routing 的时候,可能会注意到有个大括号 { } 包裹着一个变量名称,这个变量名称就是路由参数,这里的路由参数是能够自定义的,不过在全部路由参数中最重要的就是 {controller} 与 {action} 这两个。 ASP.NET MVC 为了可以对应到正确的 Controller 与 Action ,因此这两个路由参数是必选参数,若是网址路径没有包含这两个参数的话,在 defaults 参数里必需要指定才行。
(P055)
动态 (dynamic) 型别出如今 C# 4.0 之中,所以 ASP.NET MVC 4.0 网址必须运行在 .NET Framework 4.0 以上版本才行。
(P069)
若是在 View 里面定义了 @model 模型声明,经过 Controller 传到 View 的模型数据也必须与这个 View 声明的型别兼容,不然将会引起例外。
(P073)
使用 Razor 语法输出属性,默认全部数据都会使用 HTML 编码 (HtmlEncode) 输出,这是出自于程序安全考虑,避免网页遭受跨网站脚本攻击 (Cross-Site Scripting Attach) 。
(P093)
使用 ASP.NET MVC 标准的数据模型绑定 (Model Binder) 才是王道。
【第04章】
(P102)
IgnoreRoute 与 MapRoute 扩充方法是 ASP.NET MVC (System.Web.Mvc) 的一部分。
(P105)
全部网址都是从 http://localhost/ 以后开始比对,咱们称为 “网址路径” 。
(P106)
在 “URL 样式” 的地方出现的全部路由参数,都是 “必要的” 参数,必须彻底符合才算是比对成功,比对失败就会跳至下一条网址路由规则继续比对,但若是全部路由规则都比对失败的话,那么,此次的 HTTP 请求就会交由 IIS 的其余 HTTP 模块负责处理。
【第05章】
(P137)
任何 Entity Framework 里的模型,都被要求必定有主键。
(P141)
能够设置 StringLength 属性来限定字段长度。
(P143)
在使用 Entity Framework 的时候没法指定数据库中的默认值,若要加上默认值,则必须在数据库中手动设置。
(P154)
使用 Code First 开发时要特别注意,若要在 Code First 模型类别中启用 “延迟装入” 特性,必须在属性声明加上 virtual 关键字,才会启用 “延迟装入” 特性。
(P159)
若要在项目中启用数据库迁移功能,必须先开启程序包管理控制台 (Package Manager Console) 窗格,而后输入 Enable-Migrations 指令。
(P180)
只有经过适当的 Model 规划,才有助于开发出一个容易维护,且关注点分离的 ASP.NET MVC 专案。
【第06章】
(P182)
全部动做方法必须为公开方法。任何非公开的方法如声明为 private 或 protected 的方法都不会被视为一个动做方法。
(P183)
Action 若要声明成 void 也是能够的,那就表明这个 Action 不会回传任何数据到客户端。
若是 ActionInvoker 找不到对应的 Action ,默认会运行 System.Web.Mvc.Controller 类别的 HandleUnknownAction 方法,在 System.Web.Mvc.Controller 类别里 HandleUnknownAction 方法默认会相应 HTTP 404 找不到资源的错误消息。
(P186)
若套用 NonAction 属性在 Controller 里的 Action 方法上,即使该 Action 方法是 “公开方法” ,也会告知 ActionInvoker 不要选定这个 Action 来运行。
(P188)
ActionResult 是 Action 运行后的回传型别,可是当 Action 回传 ActionResult 的时候,其实并不包含这个 ActionResult 的运行结果,而是包含运行这个 ActionResult 时所需的数据,当 MvcHandler 从 Controller 取得 ActionResult 以后才会去运行出 ActionResult 的结果。
(P199)
JavaScriptResult 的功能与 ContentResult 差很少,主要的差异在于默认的 Content-Type 不同而已, JavaScriptResult 默认的 Content-Type 为 application/x-javascript 。
JSON (JavaScript Object Notation) 是 Web 在实做 Ajax 应用程序时常用的一种传输数据格式, JsonResult 可自动将任意对象数据串行化成 JSON 格式回传, JsonResult 默认的 Content-Type 为 application/json ,对某些 JavaScript Framework 这是必要需求。
JsonResult 是使用 JavaScriptSerializer 完成 JSON 串行化操做,但若是你的对象没法串行化,这个转换的过程将会发生例外。
(P201)
在 RedirectResult 的内部,基本上仍是以 Response.Redirect 方法响应 HTTP 302 暂时导向。
在 ASP.NET MVC 3 的版本以后, System.Web.Mvc.Cntroller 类别里还内建了一个 RedirectPermanent 辅助方法,可让 Action 响应 HTTP 301 永久导向。使用 HTTP 301 永久导向能够提高 SEO 效果,可保留本来页面网址的网页排名 (Ranking) 记录,并自动迁移到转向的下一页,这对于网站改版致使网站部分页面的网址发生变动时很是实用。
(P209)
ViewData 属性被声明为一个 dynamic 动态型别,而且属性是一个传入 ViewData 的 DynamicViewDataDictionary 动态 ViewData 字典,严格上来讲,ViewBag 并无什么的特殊之处,由于全部对 ViewBag 属性的任何访问动做,最终都仍是对 ViewData 来进行操做,惟一的差异仅在于 ViewBag 是 dynamic 动态型别而已,优势是能够少输入几个字符。
(P210)
dynamic 型别是 .NET Framework 4.0 的新功能。
(P212)
从 ASP.NET MVC 2.0 以后的版本,只有在使用 RedirectResult 或 RedirectToRouteResult 当成 ActionResult 型别时,才会强制保留 TempData 不被清除,除此以外,只要有取用 TempData 的键值,默认就会在当次网页要求就被清除。可是,若是你只单纯设置了 TempData 的值,并无读取行为的话, TempData 仍是会被保留到下一次取用。
在大部分的状况下, DefaultModelBinder 类别就能够处理掉 95% 以上的信息型态,除非你有特殊的用途。
(P214)
除了经过简单模型绑定取得窗体传来的单栏信息外,还能够经过 FormCollection 一次取得整份窗体传来的信息。
(P222)
经过 ASP.NET MVC 自动模型绑定请务必在动做 (Action) 里验证 ModelState.IsValid 属性,不然那些验证失败的数据模型可能还会被你新增到数据库中。
(P227)
在 UpdateModel 的前一行必须先准备好一个数据模型对象,才能让 UpdateModel 自动绑定数据上去。
(P228)
在运行 TryUpdateModel 以前, ModelState 不会有任何信息、当运行完 TryUpdateModel 以后,就能够经过 ModelState 取得模型绑定过程当中完整的验证错误信息。
(P230)
动做过滤器属性能够套用在 Action 之上,也能够套用在 Controller 类别上,若动做过滤器属性套用在 Controller 类别上等于套用此属性在此 Controller 的全部 Action 之上。
(P231)
在 web.config 的 <system.web> 设置下包括一个 <authentication> 设置,其中的 <forms> 有个 loginUrl 可设置当权限不足时应该转向的地址。
【第07章】
(P245)
咱们在开发 ASP.NET MVC 时,常常有一句口头禅 : “Model 要重、 Controller 要轻、 View 要够笨” 。
(P246)
若要使用 C# 语言来撰写 Razor 页面,记得 View 页面的副文档名必须使用 cshtml 才行。若要用 VB.NET 语言来撰写 Razor 页面的话,要用 vbhtml 当成 View 页面的副文档名才行。
在页面中输出一段含有空白字元或运算子的结果时,必须在先后加上一个小括弧。
(P247)
在页面中执行多行 C# 代码时,必须在先后加上一个大括弧。
因为 @{到} 之间属于一个 C# 代码区段,在撰写代码时必须符合 C# 语言规范,也就是每段句都要由分号结尾。
若是要在多行 C# 代码的 Razor 语法中插入 HTML 或其余文字内容,必须在每一行最前面加上一个 “@:” 符号,并且加上 “@:” 符号的这行代码里,也能够再加上其余 Razor 变量。
若是要在 Razor 检视页面中输出 “@” 符号,能够用 “@” 符号当成跳脱字元。
(P249)
纯文字在 Razor 的代码区块中会自动被视为是 C# 陈述句。
若是要在代码区块中输出大量文字,只要在代码区块里的先后加上一组 HTML 标签便可, Razor 会智能地判断出这不是一段 C# 语法,而是一段 HTML 标签文字,如此一来,若是在大范围的代码区段中就不用在每一行前面加上 “@:” 符号了。
(P259)
_ViewStart.cshtml 文件不只能出如今 /Views/ 目录下,任何与 Controller 同名的 Views 子目录下也都能出现相同的 _ViewStart.cshtml 文件,如此一来,就可让不一样的 Controller 预设载入不一样的主版页面。
(P262)
因为 Razor 页面有其执行顺序,主要是先执行 View 再执行 Layout 主版页面,由于 View 与 Layout 共用一个 ViewDataDictionary 实体,所以,若是要将数据传递到 Layout 页面中同样能够经过 ViewData 或 ViewBag 的方式传递过去。
(P267)
请注意 @model 语法的第一个字是小写字母的 m ,千万不要和 Model 给搞混了。
在 Razor 页面里能够在页面最上方经过 @using 引用这一个 View 页面里会用到的命名空间,以简化程序的长度。
(P268)
从 Action 取得数据,在 ASP.NET MVC 可区分红两种方式,一种是 “使用弱型别取得数据”,另外一种则是 “使用强类型取得数据”,二者的差异在于 View 页面最上方声明的方式。
若是 View 页面使用弱型别接收来自 Controller 的数据,在 View 页面里彻底不须要有任何声明,数据能够从 ViewData 、 ViewBag 或 TempData 取得,在页面中也能够经过 @Model 属性,取得从 Action 传来的 ViewData.Model 数据模型,但 @Model 数据模型的型别将会是 object ,因此算是弱型别的传值方式。
若是 View 页面使用强型别方式接收来自 Controller 的数据,那么,必须在 View 页面的第一行使用 @model 关键字引入一个 View 页面专用的数据模型型别参考。
(P276)
Html 辅助方法并无 File 方法,所以必须用 TextBox 方法来代替,并传入第三个参数将内建的 type 属性换成 file 便可。
(P278)
在 HTML 辅助方法的帮助下,会同时将 id 属性赋予和 name 属性同样的值。
(P288)
使用分部视图不必定须要创建相关的 Action ,由于它仅仅是片断的 HTML ,且调用时,也不会调用 Action 来执行。
【第09章】
(P331)
在 ASP.NET MVC 开发流程中,实务上都会先定义 Model 数据模型,再规划 Controller ,最后再来开发 View 视图页面。
(P390)
在撰写提供远程验证的 Action 时,有四个注意事项 :
1. 传入的参数名称必须等同于要验证的那个属性名称。
2. 结果必须使用 JsonResult 回传,可使用 System.Web.Mvc.Controller 基类中的 Json 辅助方法帮助咱们输出这个结果。
3. 回传的信息,只要响应结果是 true ,就表明验证成功,若是回传 false 就会被视为验证失败,并显示默认的错误消息。除此以外,只要任何不是 true 或 false 的属性,都会被视为验证失败时的自定义错误消息。
4. 若是你使用 HTTP GET 方法进行验证,那么你的 Json 辅助方法必须输入第二个参数,明确指定容许 GET 方法调用这个动做。
【第10章】
(P399)
在 ASP.NET MVC 里,这两种攻击情境都内建了相对应的防御措施,要防止 “你的网站攻击别人的网站” ,可使用 Html.Encode 、 Url.Encode 或 Ajax.JavaScriptString.Encode 辅助方法;而防止 “别人的网站攻击你的网站” 则使用 AntiForgeryToken 辅助方法。
若使用 Razor 语法,任何经过 @ 方式输出的内容预设都是通过 HTML 编码过的,所以不须要特别使用 Html.Encode 辅助方法。