設計模式——面向初學者的 MVC 模式示例

已發表: 2016-04-15

它解釋了什麼是 MVC 模式以及什麼是 ASP.NET MVC 框架,它是如何工作的。 還解釋了 ASP.NET MVC 頁面生命週期和 ASP.NET MVC 功能版本明智。

示例提供了明智的步驟,幫助初學者輕鬆理解並精通 ASP.NET MVC。

我們都知道許多設計模式並在我們的應用程序中使用它們來實現業務組件和服務,但我們仍然會面臨應用程序的問題/挑戰。 此外,日常業務需求和優先事項也會發生變化。 如果我們仔細觀察我們面臨的許多問題、缺陷和挑戰,那就是 UI 和表示層。 儘管一些缺陷與業務邏輯和業務規則有關,但我們可能需要在 UI 和表示層中修復它們,因為我們可能在 UI 和表示層中緊密集成業務邏輯。 這背後的原因是我們沒有專注於在我們的應用程序中實現正確的設計模式。 讓我們一步一步來了解如何在我們的應用程序中實現和使用表示模式。

問題陳述:
  1. 已經在應用程序中使用了不同的模式,但仍然很難維護應用程序。
  2. 使用VS Test、NUnit、MBUnit等測試業務邏輯層,但由於業務邏輯涉及表示層,應用程序中仍然存在一些缺陷。
  3. 在應用程序中使用了表示層、業務邏輯層、數據訪問層,但有時仍需要在表示層編寫冗餘代碼來消費或調用其他模塊或其他用例。
  4. 當我們對集成模塊進行一些更改時,集成缺陷就會被注入。
  5. 缺陷修復和增強需要更多時間來分析表示層邏輯及其集成依賴關係,並導致新缺陷的出現。
  6. 不能選擇 ASP.NET MVC,因為 UI 構建起來很複雜。
問題的根本原因:

在表示層,

  1. 頁面或表單包含顯示應用程序域數據的控件。 用戶可以修改數據並提交更改。 該頁面檢索域數據,處理用戶事件,更改頁面上的其他控件以響應事件,並提交更改的域數據。 在網頁中包含執行這些功能的代碼 此外,在需要相同行為的網頁之間共享代碼也很困難。 類複雜,難以維護,難以測試。
  2. UI 層、UI 邏輯、表示邏輯、業務邏輯緊密耦合。
  3. 表示層負責集成模塊或用例。
解決方案:
  1. 選擇最佳的表示層模式,將 UI 層、UI 邏輯和表示邏輯以及業務邏輯分離為單獨的層,以使代碼更易於理解和維護。
  2. 在開發模塊或任何用例時啟用鬆散耦合。
  3. 最大化可以通過自動化測試的代碼。 (視圖很難測試。)
  4. 在需要相同行為的頁面之間共享代碼。
  5. 將視覺顯示和事件處理行為的職責分離到不同的類中,分別命名為視圖和演示者或控制器或 ViewModel。
使用演示模式的好處:
  1. 模塊化
  2. 測試驅動方法——最大化可以通過自動化測試的代碼
  3. 關注點分離
  4. 頁面和表單之間的代碼共享
  5. 易於維護

有哪些可用的表示層模式?

MVC(模型視圖控制器)

MVP (Model View Presenter) 或 (Model Passive View, Supervisor Controller)

MVVM(模型視圖 ViewModel)

MVC vs MVP vs MVVM:
  1. Model 和 View 在以上 3 種模式中代表相同?

    是的

  2. Controller、Presenter 和 ViewModel 的用途在以上 3 種模式中都相同嗎?

    是的

  3. Model、View with Controller、Presenter、ViewModel的通信和流程是一樣的嗎?

    ,這就是這三種模式存在的原因。

  4. 這些模式是否替代了 PL(表示層)、BLL(業務邏輯層)和 DAL(數據訪問層)

    ,這些模式用於將 UI 和 UI 邏輯與表示邏輯分離並啟用鬆散耦合。

選擇最佳的表示層模式:

MVP

  1. 無法通過數據上下文綁定
  2. 複雜的用戶界面設計
  3. 最適合 Windows 窗體、ASP.NET Web 窗體和 Sharepoint 應用程序

MVC

  1. 最適合帶有簡單 UI 的 ASP.NET
  2. 斷開模型(視圖與所有其他層分離)

注意:這裡我不關注 MVC VM(來自 MVC3 的 MVC ViewModel)和具有依賴注入的 ASP.NET MVVM。

MVVM

  1. 可以通過數據上下文綁定
  2. 連接模型
  3. 最適合 WPF 和 Silverlight 應用程序
ASP.NET Web 窗體與 ASP.NET MVC:

ASP.NET Web 窗體

  1. 輻射度
  2. 開發更輕鬆
  3. 豐富的控件生態系統
  4. 熟悉Windows Forms開發的開發方法
  5. 沒有ViewState和沒有回發支持

ASP.NET MVC

  1. 關注點清潔分離 (SoC)
  2. 完整的標記控制
  3. 啟用 TDD(測試驅動開發)
  4. 啟用並輕鬆製作 REST
  5. 更簡單的客戶端集成(Javascript)
  6. 多視圖引擎(這真的很酷!)
  7. 沒有 ViewState 和沒有回發支持
  8. 可擴展且支持 WEB 2.0

模型、視圖和控制器

  • 模型:模型對像是應用程序中實現應用程序數據域邏輯的部分。 通常,模型對象檢索模型狀態並將其存儲在數據庫中。 例如,Product 對象可能會從數據庫中檢索信息,對其進行操作,然後將更新的信息寫回 SQL Server 中的 Products 表。
  • 視圖:視圖是顯示應用程序用戶界面 (UI) 的組件。 通常,此 UI 是根據模型數據創建的。 一個示例是 Products 表的編輯視圖,它根據 Products 對象的當前狀態顯示文本框、下拉列表和復選框。
  • 控制器:控制器是處理用戶交互、使用模型並最終選擇要呈現的顯示 UI 的視圖的組件。 在 MVC 應用程序中,視圖只顯示信息; 控制器處理並響應用戶輸入和交互。 例如,控制器處理查詢字符串值,並將這些值傳遞給模型,模型又使用這些值查詢數據庫。
ASP.NET MVC 高級頁面生命週期?

ASP.NET MVC High Level Page Life Cycle

ASP.NET MVC 低級頁面生命週期?

ASP.NET MVC Low Level Page Life Cycle

MVC2.0新特性

1. 模板化助手:

模板化幫助器幫助我們自動將用於編輯和顯示的 HTML 元素與數據類型相關聯。

例如,當在視圖中顯示System.DateTime類型的數據時,可以自動呈現 datepicker UI 元素。

這類似於字段模板在 ASP.NET 動態數據中的工作方式。

2.領域:

使用區域 我們可以將一個大型項目組織成多個較小的部分,以管理大型 Web 應用程序的複雜性。

每個部分(“區域”)通常代表大型網站的一個單獨部分,用於對相關的控制器和視圖集進行分組。

例如

[xhtml]
領域
行政
控制器
楷模
意見
伊尼亞拉索賠
控制器
楷模
意見
[/xhtml]

3. 支持異步控制器:

ASP.NET MVC2 允許控制器異步處理請求。

這可以通過允許頻繁調用阻塞操作(如網絡請求)的服務器調用非阻塞對應方來提高性能。

4、Action-Method參數中對DefaultValueAttribute的支持:

System.ComponentModel.DefaultValueAttribute類允許為操作方法的參數參數提供默認值。

例如,假設定義了以下默認路由:

[代碼]
{控制器}/{動作}/{id}
[/代碼]

還假設定義了以下控制器和操作方法:

[代碼]
公共類 ArticleController
{
public ActionResult View(int id, [DefaultValue(1)]int page)
{
}
}
[/代碼]

以下任何請求 URL 都將調用前面示例中定義的 View 操作方法。

  • /文章/查看/123
  • /Article/View/123?page=1 (效果和之前的請求一樣)
  • /文章/查看/123?page=2
5. 支持使用模型綁定器綁定二進制數據:

Html.Hidden助手有兩個新的重載,將二進制值編碼為 base-64 編碼的字符串:

[代碼]
public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);
public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);
[/代碼]

6.支持DataAnnotations屬性:

當我們綁定到模型以提供輸入驗證時,使用RangeAttributeRequiredAttributeStringLengthAttributeRegexAttribute驗證屬性(在System.ComponentModel.DataAnnotations命名空間中定義)。

[代碼]
使用 System.ComponentModel.DataAnnotations;
命名空間 MvcTmpHlprs
{
[元數據類型(typeof(ProductMD))]
公共部分類產品
{
公開課 ProductMD
{
公共對象 SellStartDate { 獲取; 放; }
[UIHint("rbDate")]
公共對象 SellEndDate { 獲取; 放; }
[數據類型(數據類型。日期)]
公共對象 DiscontinuedDate { 獲取; 放; }
[腳手架柱(假)]
公共對象 ModifiedDate { 獲取; 放; }
[腳手架柱(假)]
公共對象 rowguid { 獲取; 放; }
[腳手架柱(假)]
公共對象 ThumbnailPhotoFileName { 獲取; 放; }
}
}
}
[/代碼]

7. 模型驗證器提供者:

模型驗證提供者類表示為模型提供驗證邏輯的抽象。

ASP.NET MVC 包括一個基於System.ComponentModel.DataAnnotations命名空間中包含的驗證屬性的默認提供程序。

8. 客戶端驗證:

模型驗證器提供程序類以 JSON 序列化數據的形式向瀏覽器公開驗證元數據,客戶端驗證庫可以使用這些數據。

ASP.NET MVC 2 包括一個客戶端驗證庫和適配器,它支持前面提到的DataAnnotations命名空間驗證屬性。

9. 新的RequireHttpsAttribute動作過濾器:

ASP.NET MVC 2 包括一個新的RequireHttpsAttribute類,可應用於操作方法和控制器。

默認情況下,過濾器將非 SSL (HTTP) 請求重定向到啟用 SSL (HTTPS) 的等效請求。

10. 覆蓋 HTTP 方法動詞:

當我們使用 REST 架構風格構建網站時,HTTP 動詞用於確定對資源執行的操作。

REST 要求應用程序支持所有常見的 HTTP 動詞,包括GETPUTPOSTDELETE

ASP.NET MVC 2 包括我們可以應用於操作方法的新屬性,並且具有緊湊的語法。

這些屬性使 ASP.NET MVC 能夠根據 HTTP 謂詞選擇操作方法。

例如, POST請求將調用第一個操作方法,而PUT請求將調用第二個操作方法。

[代碼]
[HttpPost]
公共 ActionResult 編輯(int id)

[HttpPut]
public ActionResult Edit(int id, Tag 標籤)
[/代碼]

在早期版本的 ASP.NET MVC 中,這些操作方法需要更詳細的語法,如以下示例所示:

[代碼]
[AcceptVerbs(HttpVerbs.Post)]
公共 ActionResult 編輯(int id)

[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Edit(int id, Tag 標籤)
[/代碼]

由於瀏覽器僅支持GETPOST HTTP 動詞,因此無法發佈到需要不同動詞的操作。 因此,不可能原生支持所有RESTful請求。

但是,為了在POST操作期間支持RESTful請求,ASP.NET MVC 2 引入了一個新的HttpMethodOverride HTML 幫助器方法。

此方法呈現一個隱藏的輸入元素,使表單有效地模擬任何 HTTP 方法。

例如,通過使用HttpMethodOverride HTML 輔助方法,我們可以讓表單提交顯示為PUTDELETE請求。

HttpMethodOverride的行為影響以下屬性:

  • HttpPostAttribute
  • HttpPutAttribute
  • HttpGetAttribute
  • HttpDeleteAttribute
  • AcceptVerbsAttribute
11. 模板化助手的新HiddenInputAttribute類:

我們可以將新的HiddenInputAttribute屬性應用於模型屬性,以指示在編輯器模板中顯示模型時是否應呈現隱藏的輸入元素(該屬性設置HiddenInput的隱式UIHint值)。

屬性的DisplayValue屬性允許我們指定值是否在編輯器和顯示模式中顯示。

DisplayValue設置為 false 時,不會顯示任何內容,甚至通常圍繞字段的 HTML 標記也不顯示。

DisplayValue的默認值為 true。

我們可能會在以下場景中使用HiddenInputAttribute屬性:

  • 當視圖允許用戶編輯對象的 ID 並且需要顯示該值以及提供包含舊 ID 的隱藏輸入元素以便可以將其傳遞回控制器時。
  • 當視圖允許用戶編輯不應顯示的二進制屬性時,例如時間戳屬性。

在這種情況下,不會顯示值和周圍的 HTML 標記(例如標籤和值)。

例如:

[代碼]
公共類 ProductViewModel
{
[HiddenInput] // 相當於 [HiddenInput(DisplayValue=true)]
公共 int ID { 獲取; 放; }

公共字符串名稱 { 獲取; 放; }

[隱藏輸入(顯示值=假)]
公共字節[]時間戳{獲取; 放; }
}
[/代碼]

12. Html.ValidationSummary Helper 方法可以顯示模型級錯誤:

Html.ValidationSummary輔助方法不是總是顯示所有驗證錯誤,而是有一個新選項來僅顯示模型級錯誤。

這使得模型級錯誤可以顯示在驗證摘要中,並且特定於字段的錯誤可以顯示在每個字段旁邊。

13. Visual Studio 中的 T4 模板生成特定於 .NET Framework 目標版本的代碼:

來自 ASP.NET MVC T4 主機的 T4 文件可以使用一個新屬性,該屬性指定應用程序使用的 .NET Framework 的版本。

這使 T4 模板能夠生成特定於 .NET Framework 版本的代碼和標記。

在 Visual Studio 2008 中,該值始終為 .NET 3.5。 在 Visual Studio 2010 中,該值為 .NET 3.5 或 .NET4。

14. API 改進:

在 Controller 類中添加了受保護的虛擬CreateActionInvoker方法。

此方法由 Controller 的ActionInvoker屬性調用,如果尚未設置調用程序,則允許對調用程序進行延遲實例化。