ASP.NET vs MVC vs WebForms

?

許多ASP.NET開發人員開始接觸MVC認為MVC與ASP.NET完全沒有關系,是一個全新的Web開發,事實上ASP.NET是創建WEB應用的框架而MVC是能夠用更好的方法來組織并管理代碼的一種更高級架構體系,所以可以稱之為ASP.NET MVC。

我們可將原來的ASP.NET稱為 ASP.NET Webforms,新的MVC 稱為ASP.NET MVC.

ASP.NET Web Form

ASP.NET 在過去的十二年里,已經服務并成功實現Web 應用的開發。我們首先了解一下為什么ASP.NET能夠如此流行,并成功應用。

微軟編程語言從VB開始就能夠成為流行并廣泛應用,都源于其提供的強大的Visual studio能夠進行可視化的編程,實現快速開發。

使用VS時,開發人員能夠通過拖拽UI元素,并在后臺自動生成這些界面的代碼。稱為后臺代碼。在后臺代碼中開發人員可以添加操作這些UI元素的邏輯代碼。

clip_image002

因此微軟的可視化RAD架構體系有兩方面組成,一方面是UI,一方面是后臺代碼。因此ASP.NET Web 窗體,包含ASPX和ASPX.CS,WPF包含XAML/XAML.CS等。

ASP.NET Web Form存在的問題

我們不得不考慮的問題是,既然ASP.NET Web Form 如此成功且具有優勢,為什么微軟還要推出ASP.NET MVC?主要是因為ASP.NET Webform的性能問題。在Web應用程序中從兩方面來定義性能:

1. 響應時間: 服務器響應請求的耗時

2. 帶寬消耗: 同時可傳輸多少數據。

響應時間

我們可以理解為什么ASP.NET Webform比較慢,如圖我們做了一些小的加載測試。分別使用ASP.Net MVC和ASP.Net Webform,發現ASP.Net MVC的響應時間比Webform快了兩倍。

clip_image003

接下來我們在思考一個問題為什么ASP.NET MVC的性能更好?看看下面這個示例,簡單的UI代碼和UI的后臺代碼。

假如一個textbox的ASPX頁面:

<asp:TextBox ID="TextBox1" runat="server">

對應的UI后臺代碼:

   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {      
   3:        TextBox1.Text = "Make it simple";            
   4:        TextBox1.BackColor = Color.Aqua;
   5:  }

運行結果:

clip_image004

如果查看HTML輸出,則會顯示如下代碼:

<input name="TextBox1" type="text" value="Make it simple" id="TextBox1" style="" />

我們再來思考上面提到的問題

1. 這種HTML生成方式是否很有效?我們是否為了獲取如此簡單的HTML而長時間的消耗服務器

2. 開發人員是否可以直接編寫HTML?很難實現嗎?

?

clip_image005

通過分析我們可以得知,每一次請求都有轉換邏輯,運行并轉換服務器控件為HTML輸出。如果我們的頁面使用表格,樹形控件等復雜控件,轉換就會變得很糟糕且非常復雜。HTML輸出也是非常復雜的。由于這些不必要的轉換從而增加了響應時間。該問題的解決方案就是擺脫后臺代碼,寫成純HTML代碼。

帶寬消耗

ASP.NET開發人員都非常熟悉Viewstates,因為它能夠自動保存post返回的狀態,減少開發時間。但是這種開發時間的減少會帶來巨大的消耗,Viewstate增加了頁面的大小。在做的加載測試中,與MVC 對比,我們發現Viewstate增加了兩倍的頁面存儲。以下是測試結果:

?

clip_image006

頁面尺寸的增加是因為viewstate產生了額外的字節。下圖就是Viewstate的截圖。許多人可能會不同意此觀點,但是眾所周知,開發人員是如何工作的,如果有選擇,他們肯定會采取別的選擇。

?

clip_image008

  1. HTML 消耗

現在因為我們都是后臺代碼和ASP.NET web server控件的努力,我們對于怎樣得到HTML以及如何使他們更有效沒有更好的辦法。如下面展示的ASPX 代碼,你能確定會生成什么樣的HTML代碼嗎?


  • <asp:Label ID="Label1"?runat="server"?Text="I am label">

    ?
  •   
    <asp:Literal ID="Literal1" runat="server" Text="I am a literal">
    ?
  • <asp:Panel ID="Panel1"?runat="server">I am a panel

    ?

    ?

Lable標簽會生成DIV標簽還是SPAN標簽?運行后生成的HTML代碼的結果如下:label生成了span標簽,Literal生成了轉換為了簡單的文本,而panel轉換為了DIV標簽。

?<span?id="Label1">I am label</span>I am a literal

  • I am a panel

因此與其生成HTML代碼,還不如直接編寫HTML代碼,并實現HTML控件。

所以該問題的解決方案是:不使用服務器控件,直接編寫HTML代碼。

直接編寫HTML代碼的好處在于web設計者可以與開發人員緊密合作及時溝通。設計人員可以使用他們喜愛的設計工具來設計HTMl代碼,像dream weaver,前端頁面等,設計獨立。如果我們使用服務器控件,這些設計者工具可能不會識別。

? ? ? ?2. 后臺代碼類的重用性
如果仔細觀察一些專業的ASP.NET Webform項目,你會發現后臺代碼類往往都包含了大量的代碼,并且這些代碼也是非常復雜的。而現在,后臺代碼類繼承了“System.Web.UI.Page”類。但是這些類并不像普通的類一樣能夠到處復用和實例化。換句話來講,在Weform類中永遠都不可能執行以下代碼中的操作:
? ?1: WebForm1 obj = new WebForm1();obj.Button1_Click();

?

  • ??3. 單元測試

既然無法實例化后臺代碼類,單元測試也是非常困難的,也無法執行自動化測試。必須手動測試。

  • 解決方案

既然講了ASP.Net Webform存在的兩大問題即服務器控件和后臺代碼,以下是根源圖,

clip_image009

那么解決方案是什么?

就是我們需要將后臺代碼遷移到獨立的簡單的類庫,并且拜托ASP.Net服務器控件,并寫一些HTML示例。

ASP.NET Webform 和MVC 比較,如下圖:

clip_image010

Microsoft Asp.Net MVC 是如何彌補Web Form存在的問題的?

后臺代碼和服務器控件是一切問題的根源。所以如果你查看當前的WebForm體系結構,開發者正在使用的包含3層體系結構。三層體系結構是由UI包含ASPX及CS 后臺代碼。

UI,業務邏輯以及包含數據訪問的中間層

clip_image011

Asp.Net MVC 由Model,View,Controller三部分組成。Controller中包含后臺代碼邏輯,View是ASPX,如純HTML代碼,Model是中間層。通過上圖可獲得這三部分的關系。

所以會發現MVC的改變有兩點,View變成簡單的HTML,后臺代碼移到簡單的.NET類中,稱為控制器。

以下是ASP.NET MVC 請求流的通用步驟:

Step 1:首先獲取控制器。

Step 2:依賴行為控制器創建Model對象,Model通過轉換調用數據訪問層。

Step 3:數據填充Model之后,傳遞到View 顯示層,實現顯示的目的。

clip_image012

到這里我們就已經了解了ASP.Net MVC的各個組件。下面我們做一些小的實驗深入了解MVC的各組件。首先我們從Controller 控制器開始,因為Controller是MVC體系架構的核心部分。

你是否真的理解Asp.Net MVC的Controller(控制器)?

為了我們能夠更好的理解Controller,我們首先需要理解Controller中涉及的專業術語:用戶交互邏輯。

什么是用戶交互邏輯?

場景1

你是否想過當用戶輸入URL摁下回車鍵時,會發生什么事情?

clip_image013

瀏覽器首先需要給服務器發送請求,服務器再做出響應。

clip_image014

通過這些請求之后,客戶端正嘗試與服務器交互,服務器能夠反饋響應,因為服務器端存在一些判斷邏輯來處理這些請求。這些能夠處理用戶請求以及用戶交互行為的業務邏輯稱為用戶交互邏輯。

場景2

有一種常見的情況,服務器端發送的請求是HTML請求。HTML請求是由一組輸入控件和提交按鈕組成的。

clip_image015

當用戶點擊“Save”按鈕之后會發生什么?

如果你的回答是有一些事件處理器來處理button點擊事件,那么很抱歉回答是錯誤的。

在Web編程中是沒有事件的概念的,Asp.net Web forms 根據我們的行為自動添加了處理代碼,所以給我們帶來的錯覺認為是事件驅動的編程。這只是一種抽象的描述。

當點擊Button時,一個簡單的HTTP請求會發送到服務器。差別在于Customer Name,Address以及Age中輸入的內容將隨著請求一起發送。最終,如果是有個請求,服務器端則有對應的邏輯,使服務器能夠更好響應請求。簡單來說是將用戶交互邏輯寫在服務器端。

在Asp.Net MVC中,C代表Controller,就是用來處理用戶交互邏輯的。

實驗一:簡單的MVC Hello world,著重處理Controller。

  • Step1 創建一個Asp.Net MVC 5項目

打開Visual studio 2013 點“文件”->新建->項目。

clip_image016

  • Step 1.2 選擇Web 應用,輸入項目名稱,選擇存放路徑,點擊確定。

clip_image017

  • Step 1.3 選擇MVC 模板

clip_image018

  • Step 1.4 選擇Change Authentication(改變授權),彈出對話框中選擇“No Authentication”,并點擊確定。

clip_image019

  • Step 2 –創建控制器
  • Step 2.1,在資源管理器中,右擊controller文件夾,選擇添加->Controller(控制器)

clip_image020

  • Step 2.2 選擇空 MVC 5 Controller 并點擊添加

clip_image021

  • Step 2.3 輸入控制器的名稱”TestController“,點擊添加。

在這一步驟中,要特別注意千萬不能刪除名稱中的” Controller”關鍵字。名稱中必須包含Controller關鍵字。

clip_image022

  • Step 3. 創建行為方法

打開新建的TestController 類,可以發現已生成的Index 方法,將該方法刪除,并且添加新方法命名為GetString ,代碼如下:

   1:  public class TestController : Controller
   2:  {
   3:      public string GetString() 
   4:     {        return "Hello World is old now. It’s time for wassup bro ;)"; 
   5:   
   6:    }
   7:  }
  • Step 4. 運行并測試?按 F5 鍵,在地址欄中以“ControllerName/ActionName”這樣的形式輸入,需要注意的輸入控制器名稱時,不能輸入”Controller“只輸入”Test”。

clip_image023

?

實驗一:Q&A

1. TestController 和Test之間的關系是什么?

TestController是類名稱,而Test是Controller的名稱,請注意,當你在URL中輸入controller的名稱,不需要輸入Controller這個單詞。

2. Action(行為) 方法是什么?

Action 方法 簡單的來說就是一個Controller內置的public類型的方法,能夠接收并處理用戶的請求,上例中,GetString 方法返回了一個字符串類型的響應。

注意:在Asp.Net Web Forms中默認的返回請求是HTML的,如果需要返回其他類型的請求,就必須創建HTTP 處理器,重寫內容類型。這些操作在Asp.net中是很困難的。在Asp.net MVC中是非常簡單的。如果返回類型是”String“直接返回,不需要發送完整的HTML。

3. 如果從Action 方法中返回對象值會出現什么意外情況?

請瀏覽以下代碼

   1:  namespace WebApplication1.Controllers
   2:  {
   3:      public class Customer
   4:      {
   5:          public string CustomerName { get; set; }
   6:          public string Address { get; set; }
   7:      }
   8:      public class TestController : Controller
   9:      {
  10:          public Customer GetCustomer()
  11:          {
  12:              Customer c = new Customer();
  13:              c.CustomerName = "Customer 1";
  14:              c.Address = "Address1";
  15:              return c;
  16:          }
  17:      }
  18:  }

?輸出結果如下所示:?

?

?

當返回類型如“Customer”這樣類似的對象時,將調用ToString()方法,返回“NameSpace.ClassName”形式的類名。

4. 如果需要獲得上面例子中的屬性值,要如何操作?

簡單重寫類的“ToString”方法,如下:

   1:  public override string ToString()
   2:  {
   3:       return this.CustomerName+"|"+this.Address;
   4:  }

?

?

運行結果:

clip_image025

5. Action 方法是否只能用Public修飾符來修飾?

答案是肯定的,每個公有方法都會自動稱為Action 方法。

6. 非public方法是什么?

類的方法都比較簡單,并且并不是公共可用的。無法在Web中調用。

7. 如果我們需要其他函數來完成一些特定功能,但不是Action Method要如何實現?

使用NonAction屬性修飾,如下:

?

?

   1:  [NonAction] 
   2:  public string SimpleMethod()
   3:  { 
   4:     return "Hi, I am not action method";
   5:  }

?

?

當嘗試給以上Action 方法發送請求時,會獲得以下結果:?

clip_image026

View部分

Controller是處理用戶請求,并做出響應,通常情況下響應都是以顯示在瀏覽器中,使用HTML代碼,瀏覽器才可識別。HTML有圖像,文本,輸入控件等。通常稱為用戶界面的設計即UI層,在ASP.net MVC稱為View。

實驗二——深入理解View

在實驗二中,創建一個簡單的MVC應用,僅僅具有Controller和簡單的字符串類型的返回值。讓我們來了解MVC中的View部分吧。

  • Step1 –創建新的Action 方法

在TestController中添加新的Action 方法,如下:

   1:  public ActionResult GetView()
   2:  { 
   3:     return View("MyView");
   4:  }

?

  • Step 2 創建View
  • Step 2.1 右擊上述創建的Action 方法,選擇“添加View”

?

clip_image027

  • Step 2.2 在添加View的對話框中輸入View名稱“MyView”,取消選擇“使用布局”的復選框,點擊添加。

clip_image028

資源管理器重的Views/Test文件夾中會添加一個新的View文件。

clip_image029

  • Step3 在View中添加內容

打開MyView.cshtml 文件,并添加以下內容:

@{Layout = null;}
<!DOCTYPE html>
<html><head><meta name="viewport" content="width=device-width" /> <title>MyView</title> </head><body>Welcome to MVC 5 Step by Step learning
</body></html>
  • Step 4. 運行?按F5鍵運行應用

clip_image030

實驗二:Q&A

1. 為什么View會放在Test的文件夾中?

View是與放置在特定目錄下的Controller相關。這個特定文件夾是以”ControllerName”命名的,并且放在View文件夾內

2. 在多個控制器中無法重用View嗎?

當然可以,我們需要在將這些文件放在特定的Shared文件夾中。將View 放在Shared文件夾中所有的Controller都可用。

clip_image031

3. 單個Action 方法中可引用多個View嗎?

可以,ASP.NET MVC的view和Controller不是嚴格的匹配的,一個Action Method可以引用多個view,而一個View也可以被一個Action方法使用如下代碼所示:

   1:  public ActionResult GetView()
   2:  {
   3:      if(Some_Condition_Is_Matching)
   4:      { 
   5:         return View("MyView");
   6:      }
   7:      else
   8:      {
   9:         return View("YourView");
  10:      }
  11:  }

?

?

4. View函數的功能是什么?

?創建 ViewResult 對象將會渲染成視圖來給用戶反饋

?

  • ViewResult 創建了ViewPageActivator 對象
  • ViewResult 選擇了正確的ViewEngine,并且會給ViewEngine的構造函數傳ViewPageActivator對象的參數
  • ViewEngine 創建View類的對象
  • ViewEngine 調用View的RenderView 方法。

5. ActionResult和 ViewResult的關系是什么?

ActionResult是抽象類,而ViewResult是ActionResult的多級孩子節點,多級是因為ViewResult是ViewResultBase的子類,而ViewResultBase是ActionResult的孩子節點。

6. 什么是ContentResult?

ViewResult是HTML響應而ContentResult是標準的文本響應,僅返回字符串類型。區別就在于ContentResult是ActionResult的子類。

?

要進行ASP.ET MVC的開發,不但需要具備MVC的知識,還需要高效的工具來幫助開發。

使用?ComponentOne Studio Enterprise?中提供的?ComponentOne Studio ASP.NET MVC?版本,您能獲取快速的輕量級控件來滿足用戶所有需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284409.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

產品經理有哪些類型?

不知道大家是如何給產品經理這個職業進行分類&#xff0c; 按負責的產品&#xff1f;按等級&#xff1f;按工作年限&#xff1f;按工作方向等&#xff1f; 一、按工作內容分 1. 功能設計產品經理 最常見的了&#xff0c;負責的工作就是設計出功能來。從 APP 的界面&#xff0…

在Blazor 中自定義權限驗證

Blazor是什么Blazor 是微軟在 .NET 里推出的一個 WEB 客戶端 UI 交互的框架&#xff0c;使用 Blazor 你可以代替 JavaScript 來實現自己的頁面交互邏輯&#xff0c;可以很大程度上進行 C# 代碼的復用&#xff0c;Blazor 對于 .NET 開發人員來說是一個不錯的選擇。需求背景其實我…

看出每個應用程序最高可用內存是多少

int maxMemory (int) (Runtime.getRuntime().maxMemory() / 1024); Log.d("TAG", "Max memory is " maxMemory "KB"); 轉載于:https://www.cnblogs.com/coderwjq/p/6501639.html

中文分詞之HMM模型詳解

文章轉載自: http://yanyiwu.com/work/2014/04/07/hmm-segment-xiangjie.html HMM(Hidden Markov Model): 隱式馬爾科夫模型。 HMM模型可以應用在很多領域&#xff0c;所以它的模型參數描述一般都比較抽象&#xff0c;以下篇幅針對HMM的模型參數介紹直接使用它在中文分詞中的實…

【ArcGIS微課1000例】0035:地圖面狀符號設計教程

地圖符號是表示地圖內容的基本手段,它由形狀不同、大小不一、色彩有別的圖形和文字組成。 地圖符號是地圖的語言,是一種圖形語言。它與文字語言相比較,最大的特點是形象直觀,一目了然。 本文講解ArcGIS中面狀符號設計方法。 文章目錄 一、新建符號樣式二、面狀符號設計1. 斜…

MySQL奪命15問,你能堅持到第幾問?

前言 MySQL在面試中經常被問到&#xff0c;本文總結了面試中的經典問題。 1. 數據庫三大范式是什么&#xff1f; 第一范式&#xff1a;每個列都不可以再拆分。 第二范式&#xff1a;在第一范式的基礎上&#xff0c;非主鍵列完全依賴于主鍵&#xff0c;而不能是依賴于主鍵的一部…

ios元素定位

原文地址http://www.cnblogs.com/meitian/p/7373460.html 第一種&#xff1a;通過Appium1.6的Inspector來查看 具體安裝方式前面的隨筆已經介紹了&#xff1a;http://www.cnblogs.com/meitian/p/7360017.html可以通過定位找到元素xpath或name個人不推薦用這個方法&#xff0c;實…

分治法——循環賽日程表

1、問題描述&#xff1a;有n2^k個遠動員選手&#xff0c;設計比賽日程表實現&#xff1a;&#xff08;1&#xff09;每個選手必須與n-1個選手比賽&#xff08;2&#xff09;每個選手一天只比賽一場&#xff08;3&#xff09;比賽共進行n-1天輸入&#xff1a;n人輸出&#xff1a…

使用 LSM-Tree 思想基于.NET 6.0 C# 寫個 KV 數據庫(案例版)

文章有點長&#xff0c;耐心看完應該可以懂實際原理到底是啥子。這是一個KV數據庫的C#實現&#xff0c;目前用.NET 6.0實現的&#xff0c;目前算是屬于雛形&#xff0c;骨架都已經完備&#xff0c;畢竟剛完工不到一星期。當然&#xff0c;這個其實也算是NoSQL的雛形&#xff0c…

35.使用攔截器實現權限驗證

轉自&#xff1a;https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 為了說明此問題&#xff0c;我們建立struts2auth項目&#xff0c;流程圖如下&#xff1a; 簡短說明&#xff1a;當我們訪問main.jsp頁面&#xff0c;并試圖通過此頁面中的鏈接地址&#xff1a;not…

如何保證緩存和數據庫的一致性?

1. 問題分析 2. Cache-Aside 2.1 讀緩存 2.2 寫緩存 2.3 延遲雙刪 2.4 如何確保原子性 3. Read-Through/Write-Through 3.1 Read-Through 3.2 Write-Through 4. Write Behind 很多小伙伴在面試的時候&#xff0c;應該都遇到過類似的問題&#xff0c;如何確保緩存和數據庫…

Pressed狀態和clickable,duplicateParentState的關系

做Android開發的人都用過Selector,可以方便的實現View在不同狀態下的背景。不過&#xff0c;相信大部分開發者遇到過和我一樣的問題&#xff0c;本文會從源碼角度&#xff0c;解釋這些問題。 首先&#xff0c;這里簡單描述一下&#xff0c;我遇到的問題&#xff1a; 界面上有個…

Hbase筆記4 java操作Hbase

暫無轉載于:https://www.cnblogs.com/mrxiaohe/p/6512481.html

【招聘(南京)】 慧咨環球南京研發中心 .NET和Blazor 前端

主要的亮點快速增長的、產品導向型的全球性科技公司設計和開發市場領先的軟件解決方案WLB — 工作生活相平衡澳洲排名前五的軟件公司混合辦公 — 3天在家辦公&#xff0c;2天在辦公室辦公在C#和.NET開發&#xff0c;企業級系統研發&#xff0c;軟件工程方面有長期的優秀實踐和技…

用Python+Django在Eclipse環境下開發web網站【轉】

一、創建一個項目如果這是你第一次使用Django&#xff0c;那么你必須進行一些初始設置。也就是通過自動生成代碼來建立一個Django項目--一個Django項目的設置集&#xff0c;包含了數據庫配置、Django詳細選項設置和應用 特性配置&#xff0c;具體操作步驟如下所示。 1.新建Djan…

[轉]數據結構KMP算法配圖詳解(超詳細)

KMP算法配圖詳解 前言 KMP算法是我們數據結構串中最難也是最重要的算法。難是因為KMP算法的代碼很優美簡潔干練&#xff0c;但里面包含著非常深的思維。真正理解代碼的人可以說對KMP算法的了解已經相當深入了。而且這個算法的不少東西的確不容易講懂&#xff0c;很多正規的書本…

BGP-MED-2

BGP-MED-2如圖&#xff1a;當AS100去往AS300的60、10的網絡時&#xff0c;60走R3&#xff0c;10走R1!使用MED屬性影響選路&#xff01; R2的配置 bgp 200peer 1.1.1.1 as-number 100 peer 1.1.1.1 ebgp-max-hop 255 peer 1.1.1.1 connect-interface LoopBack0peer 4.4.4.4 as-n…

WPF 實現 Gitee 氣泡菜單(一)

WPF 實現 Gitee 氣泡菜單&#xff08;一&#xff09;氣泡菜單&#xff08;一&#xff09;作者&#xff1a;WPFDevelopersOrg原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40&#xff1b;Visual Studio 2022;項目使用 MIT 開…

[轉]LVS負載均衡(LVS簡介、三種工作模式、十種調度算法)

一、LVS簡介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虛擬服務器&#xff0c;是由章文嵩博士主導的開源負載均衡項目&#xff0c;目前LVS已經被集成到Linux內核模塊中。該項目在Linux內核中實現了基于IP的數據請求負載均衡調度方案&#xff0c;其體系結構如圖1…

一張圖看懂微軟Power BI系列組件

一、Power BI簡介 Power BI是微軟最新的商業智能&#xff08;BI&#xff09;概念&#xff0c;它包含了一系列的組件和工具。話不多說&#xff0c;直接上圖吧&#xff1a; Power BI的核心理念就是讓我們用戶不需要強大的技術背景&#xff0c;只需要掌握Excel這樣簡單的工具就能快…