GATTACA2011

  :: :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

《ASP.NET MVC 4 开发指南》

========== ========== ==========
[作者] (台) 黄保翕
[出版] 清华大学出版社
[版次] 2013年07月 第1版
[印次] 2013年07月 第1次 印刷
[定价] 59.00元
========== ========== ==========

【作者序】

要进入一个全新技术的领域,首要任务就是先感受技术的价值,然后再进一步深入研究技术的细节。

【第01章】

(P004)

简言之,只要是和 “数据” 有关的任务,都应该在 Model 里完成定义。

(P006)

简言之,所有应该要显示在网页上的逻辑都是 View 负责的范围。

(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 辅助方法。

posted on 2020-05-21 08:16  GATTACA2011  阅读(425)  评论(0编辑  收藏  举报