Skip to main content

Posts

Showing posts with the label mvc

[探索 10 分鐘] 寫點有關 ASP.NET MVC ViewModel, ViewData, ViewBag, TempData 的代碼

將 ASP.NET MVC 的 Controller 資料要傳給頁面, 或是頁面再轉只給其他頁, 有很多方式, Data Passing Mechanism in MVC Architecture  對於不同的資料拋轉方式整理出非常明確的結論, 在開始介紹代碼之前我們先有基本認知 : 在 ASP.NET MVC 中, 沒有 view state, 沒有 code behind, 沒有 server controls。我們仍需在 MVC 架構中傳遞數據, 有一些機制來傳遞數據如下, 如ViewData, ViewBag, TempData, Session。 ViewData ViewData 是 ControllerBase 類的 property ViewData 用於 Controller 將資料傳遞給對應的 view (Controller to View) ViewData 生命週期只存在於當下的請求, 導頁後就被清掉了 (null) ViewData 是 Dictionary 類別, 繼承 ViewDataDictionary 纇, 要注意字典資料轉型跟 null 問題 Example - ViewData["Key"] = "Value" ViewBag ViewBag 也是 ControllerBase 類的 property ViewData 操作方法須對每個資料使用中括弧, ViewBag 簡化為點運算式 ViewBag 基本上是 ViewData 的包裝類別, 也是用於 Controller 將資料傳遞給對應的View (Controller to View) ViewBag 是 C# 4.0的 dynamic 型別, 可在執行期再判斷真正型別 (C# reflection) ViewBag 生命週期也只存在於當下的請求, 導頁後就被清掉了 (null) Example - ViewBag.Key = "Value" TempData TempData 也是 ControllerBase 類的 property TempData 生命週期除了當下請求, 導頁後仍可續存 (如action to action, controller ...

[探索 5 分鐘] 淺談 ASP.NET MVC 的生命週期

任何「生命週期」的探討都是一門學問,  ASP.NET MVC Life Cycle 的官網以及網路文獻也很多,今天找到一個淺顯易懂的版本  ASP.NET MVC - Life Cycle 。 他將所謂的生命週期分兩個來探討, 然後再配上圖片 : The application life cycle The request life cycle Web Application 的生命週期是起於 IIS (或其他 web server) 運行應用程式, 終止於服務暫停, 回收或關閉。但細部的 process 是: 當第一個請求發出時, 觸發 Application_Start() 事件 (Global.asax.cs 文件中), 做應用程式初始配置、路由設定等等載入工作。但當 web 服務器回收應用程序或在一段不活動狀態 (InActive) 或超過 cpu、memory 閾值之後, Application_End() 事件將觸發, 接下來的請求將被視為第一個請求, 並且再次觸發 Application_Start() 事件。 request 比較複雜, 但對 MVC 有概念的人大方向應該可以抓出一個順序: request → routing → controller → action → result → response。 提醒兩點, 應該有看到一個 Controller Intialization ? 順便分享一下, 過去曾有專案有效能問題, 結果是 Controller 建構子做了一些 AutoMapper.Attributes 的 mapping 動作, 天真以為他只會初始化一次。但 sorry, 是每一個請求都會進入構造函式, 這邊慢, 大家就一起漫步了。第二點, 不是每個 result 都需要 view engine 處理, 我們也可以回傳一個字串, JSON..., 對吧 ? 所以上圖 Result Execution 才會有兩種處理方式。 System.Web.Mvc / MvcHandler.cs 的  程式碼  也滿值得欣賞一下。是由 IControllerFactory 類來創建 Controller 實體去執行後續動作 : protected int...

[探索 10 分鐘] ASP.NET MVC 操作 HTTP handler 與 module

首先, 一個整體觀, HttpHandler 與 HttpModule 這兩種處理模式, 可以互相搭配運用, 也可以互相取代, 取決於需求。他們的關係如 Implementing HTTPHandler and HTTPModule in ASP.NET 文章提到, 是這樣: 一個 request 可以通過許多 module (IHttpModule 介面), 被整個生命週期期間 (BeginRequest() ~ EndRequest()) 被各種事件函式做加工, 如驗證, 轉址, 寫 Log; 而後透過路由導到 handler (IHttpHandler 介面) 做最後 ProcessRequest() 加工, 如副檔名 .jpg 要做什麼, .zip 要做什麼, 並產生 HttpRequest 的 response。前者 module 類可以攔截所有 request, 而後者 handler 類專注在被分配到的特定資源請求處理。對於一個 web 應用, 這些都是可以選配的類別。 HttpHandler MSDN 解釋: An ASP.NET HTTP handler is the process that runs in response to a request that is made to an ASP.NET Web application. The most common handler is an ASP.NET page handler that processes .aspx files. When users request an .aspx file, the request is processed by the page handler. ASP.NET HTTP 處理常式是為了回應對 ASP.NET Web 應用程式所提出之要求而執行的處理序。最普通的處理常式是處理 .aspx 檔案的 ASP.NET 網頁處理常式。當使用者要求 .aspx 檔案時,會透過網頁處理常式處理要求。HttpHandler 負責特定副檔名資源請求的處理常式, 如 ASP.NET page handler (*.aspx) Web service handler (*.asmx) Generic Web handler (...

[探索 5 分鐘] 淺談 ASP.NET MVC 路由 (routing)

路由 (routing) 的組合千變萬化, 但對於 ASP.NET routing 的起手式, 就是這一條: public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute( name: "Default", // Route name url: "{controller}/{action}/{id}", // URL with parameters defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } 進階的用法非常多, 但專案需求若沒有非常特殊(如多層 routing, 或安全性考量故意混淆), 使用大家約定俗成的 pattern, 其實易於維護。當然還有一種用於 Web API 的 routing 方式, 稱為  Attribute Routing 。就是在 Action 或 Controller 上方標上一行清楚到不行的 routing rule, 個人是滿推薦的, 像下方這樣: public class BooksController : ApiController { [Route("api/books")] public IEnumerable<Book> GetBooks() { ... } [Route("api/books/{id:int}")] public Book GetBook(int id) { ... } [Route("api/books")] [HttpPost] public HttpResponseMessage CreateBook(Book book) { ... } } 是不是非常清楚呢 ? Web API如何Routing 從技術上來看, Web API 是如何做 routing 呢 ? 參考...

[探索 5 分鐘] 淺談 ASP.NET View Engine

參考  Difference Between Razor View Engine and ASPX View Engine  所整理兩種 View 引擎的特性, 提列重點如下, 並於文末針對 Razor 語法做注意事項筆記 (陸續新增)。 Razor View Engine Web Form View Engine 適用於 MVC3 以後版本, Razor 不是一種新的語言, 算一種標記語法 ASP.NET 預設的 View Engine 命名空間為 System.Web.Razor 命名空間為 System.Web.Mvc.WebFormViewEngine 附檔名為 .cshtml (Razor with C#) 或 .vbhtml (Razor with VB) 附檔名為 .aspx 或 .ascx 或 .master. Razor具有更新更進階的語法. 與舊有的 .aspx 頁面語法完全相同. Razor 語法 更直覺或易用, 比如使用  @ 前置詞: @Html.ActionLink("SignUp", "SignUp") 使用 .aspx 既有定義符號 <% 與 %> 如: <% Html.ActionLink("SignUp", "SignUp") %> 預設會預防 XSS 攻擊 (Cross-Site Scripting Attacks), 所以輸出到 View 之前會自動 encode 特殊字元( Scripts 或 HTML 標籤), 如 <,>  預設無預防 XSS 攻擊 不緩存情況, 處理速度稍慢 處理速度比 Razor 稍快 Razor 不支持頁面預覽 用 Visual Studio 可看到頁面預覽 (design mode), 方便不啟動服務進行頁面設計 Razor 支持 TDD (Test Driven Development) , 因為他不與 UI 元件相依, 如 System.Web.UI.Page 類 依賴 System.Web.UI.Page 類, 所以進行 TDD 或測試較為複雜 Layout的定義 微軟  layout  這篇文章帶領的不錯, By conv...

[探索 3 分鐘] ASP.NET MVC 演進歷史

MVC 模式(Model–view–controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。 wiki 開宗明義就是這麼說, 且在 1978 年就被提出, 至今已經將近 40 年。說穿了就是一種關注點分離設計概念, 後來各個語言都基於這個概念推出自己的 MVC 架構。ASP.NET MVC 算是發展較晚, 但發展至今大家已經離不開他了。 ASP.NET MVC 的發展歷史, 各版本有滿多差異, 接手 MVC 專案時要特別注意 MVC 版本, 免得一直拿新版本功能硬幹, 或 Install-Package UpgradeMvc3ToMvc4 指令不小心下去, 結果專案死透了。 ASP.NET ASP.NET MVC 的起源其實是 ASP.NET 技術框架,  ASP.NET  技術開發歷史如下 : 1996 : Active Server Pages (ASP) 2002 : ASP.NET 2008 : ASP.NET MVC 2010 :  ASP.NET Web Pages  (Razor)  2012 :  ASP.NET Web API ,  SignalR  ( MVC 4 ,  MVC5 ) 2014 : ASP.NET 5  (ASP.NET Core, Open Source) ASP.NET is a free web framework for building great websites and web applications using HTML, CSS, and JavaScript. You can also create Web APIs and use real-time technologies like Web Sockets. ASP.NET MVC 時間過得真快, 微軟 ASP.NET MVC 框架已經發展快 10 年了 (2007 ~ 2017截稿), 近年來更是每年更新一版, 你在用的是哪一版呢 ? 我自己最多也曾經在服務的公司使用 ASP.NET MVC 5 + Web API 2,...