Asp.net中WebForm 與 MVC的架構區別


ASP.NET Webform 后台代碼(behind code)

這種behind code 模式有5個問題,我們用MVC的設計思想來分別解決這些問題

1、基於視圖的方案來解決基於行為的需求

從上圖可以看出,整個請求過程看上去很奇怪:

  • 用戶發起一個HTTP請求,比如HTTP POST / GET
  • IIS服務器將請求映射到視圖
  • 視圖調用頁面的生命周期,通過事件驅動,調用合適的交互方法
  • 最后將交互的結果展現給終端用戶

因為微軟一開始就選擇了基於視圖的設計方案,所以架構本身很難向基於用戶交互的設計思想靠攏。換句話說,當用戶發出“購買”請求時,先是訪問了視圖頁面“Shopping.aspx”,后台邏輯代碼在“Shopping.aspx.cs”中,頁面生命周期中會將頁面的計算結果返回給用戶。

如果利用MVC的思想,都是基於用戶交互行為的話,那么流程將會是如下圖所示:

 

2、壞架構的副作用——緊耦合

簡單地說,我們很難將Customer.aspx.cs和CustomerDetailed.aspx簡單地剝離開,后台代碼已經緊緊地將其捆在一起,而且也很難復用。如果我們可以將請求先通過action,而不同過視圖view,action得到的數據再由控制器決定由哪個view展示,那么請求的流程將會是這樣的:

 

所以我們可以很方便地控制最終結果是由移動頁面展示還是正常頁面展示,如下代碼:

public ActionResult Index(string DeviceType)
{
           if (viewType == "Mobile")
            {
                return View("MobileView");
            }
            else
            {
                return View("NormalView");
            }
}

3、HTML不是唯一的返回類型

  由於視圖view和后台代碼behind code緊密耦合在一起,所以默認的返回類型就固定了,都是HTML類型。如果你想改變類型就必須設置Content-type和調用Response.End方法。

  如果我們創建一個Action,返回的類型由Action中指定,系統就可以在同一個action中根據不同條件輸出不同的返回類型。代碼如下:

public ActionResult Index(string viewType)
{
            if (viewType == "JSON")
            {
                return Json(new Customer(), JsonRequestBehavior.AllowGet);
            }
            else
            {
                return View("DisplayCustomer", new Customer());
            }
}

4、視圖和數據的靈活組合

  Webform是視圖優先的架構,所以視圖決定了展現的數據,所以視圖的擴展性就很差,如果遇到復雜的數據結構,這種方式就顯得力不從心了。

  但是如果是行為優先的架構的話,當我們觸發action時,action可以根據不同的請求選擇不同的數據模型和視圖結構,如下圖:

在MVC中,你可以在不同的view中選擇相同的數據模型,比如下面的代碼,customerdata數據既可以綁定在DetailCustomer視圖中,也可以綁定在Customer視圖中。

public ActionResult Index(string ViewName,Customer customerdata)
{
            if (ViewName == "Detailed")
            {
return View("DetailCustomer",customerdata);
            }
            else
            {
                return View("Customer",customerdata);
            }
}

這在Webform中實現起來是非常麻煩的。

5、將behind code 當做普通的類來進行單元測試

behind code后台代碼在Webform中是一個非常龐大的類,並且不能簡單地實例化。要知道Webform是繼承於Page類的,Page類不能直接實例化,因為它有太多的依賴項了。

 

所以將WebForm架構切換到MVC架構,如下圖:

  • 將behind code中的代碼轉移到controller類中,並將原來的方法轉換成action方法。
  • 中間層用數據模型和邏輯接口代替。
  • 視圖view只用來展現數據和頁面布局。
  • DAL層和其他層沒有什么變化,因為它和behind code關系不大。

在MVC架構中,用戶的請求分為下面3個步驟:

  • 終端用戶發送請求,路由器將請求路由到合適的Controller,Controller是邏輯實體和行為action的集合。
  • Controller將請求映射到特定的Action。
  • action有兩個任務,第一是獲取合適的數據,第二是將這些數據和視圖view綁定起來。action創建數據模型,並將數據模型連接到指定view,輸出最終的相應結果。

這些資料信息皆是從網上搜集得到的,做個筆記,方便以后查詢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM