巨大轉變!教你使用ASP.NET MVC2新功能

來源: it168  發布時間: 2010-08-30 22:27  閱讀: 1962 次  推薦: 0   原文鏈接   [收藏]  
摘要:在本系列文章中,我們將針對微軟最新推出的ASP.NET MVC 2.0中提供的新特征相關的基礎性編程問題進行全面的探討。在本文(第一篇)中,我們將通過對比ASP.NET MVC框架與ASP.NET Web表單框架的方式來學習ASP.NET MVC 2.0提供的新功能。

  在本系列文章中,我們將針對微軟最新推出的ASP.NET MVC 2.0中提供的新特征相關的基礎性編程問題進行全面的探討。在本文(第一篇)中,我們將通過對比ASP.NET MVC框架與ASP.NET Web表單框架的方式來學習ASP.NET MVC 2.0提供的新功能。

  在2010年4月,微軟正式發布了Visual Studio的下一個版本2010。ASP.NET MVC 2.0也作為其中的一個新框架成員一同發行。ASP.NET MVC如今已是一個成熟的產品,采用了全新的設計,大大提高了開發效率。

  從因特網上你可以輕易找到專家們給出的這樣的結論:ASP.NET Web表單仍然是基于微軟.NET平臺開發Web應用的首選-其成熟性、穩定性和高效性是經過實踐檢驗的,而且現成和將來會繼續被微軟所支持。另一方面,ASP.NET MVC雖然是一個新框架,但是其針對大型應用提供了更清晰的框架支持。因此,你可以把ASP.NET MVC框架可以作為開發Web應用的另一種替代方案。

  一、回顧ASP.NET Web表單框架的主要特征

  ASP.NET 1.0的發布成為ASP開發人員的極大期待。從此以后,開發人員基本上實現了HTML標記與服務器端代碼的分離管理。HTML標記部分可以置于一個ASPX頁面中,而所有的后臺邏輯駐留在一個后綴為ASPX.CS或ASPX.VB的單獨的代碼隱藏文件中。而且,在代碼隱藏文件中可以充分地控制服務器端控件,例如標簽,文本框和其他控件,等等。

  代碼隱藏文件中提供了一系列的事件供觸發之用,從而讓您的代碼以一種有序的方式執行。開發人員可以響應各種UI事件(如按鈕點擊,回寄到服務器端的下拉列表框選擇,超鏈接重定向,等等)。開發人員可以訪問各種設施來實現緩存數據,并實現跨頁面回寄保留這些數據,因為每一個到服務器端的請求都是唯一且無狀態的。

  最后,ASP.NET Web表單框架中提供了很多現成的內置的服務。ViewState結構能夠為您跨越表單回寄保留數據,所以你不需要把數據存儲在例如文本框和下拉列表框等各種控件內。表單數據在提交前能夠被充分地驗證,從而確保用戶沒有提交任何HTML內容(避免潛在的XSS腳本或注入式攻擊)。

  二、代碼隱藏文件與控制器

  ASP.NET MVC版本的代碼隱藏文件就是控制器類。但是,控制器類的工作方式有所不同。在ASP.NET MVC中,沒有使用任何服務器控件、頁面生命周期以及其他那些ASP.NET Web表單程序員所熟悉的組件。我們不妨來看一下清單1中給出的ASP.NET Web表單框架下的隱藏代碼。

  清單1—ASP.NET Web表單頁面示例

 
public class CustomerPage : Page
{

//protected withevents TextBox FirstName;
//protected withevents TextBox LastName;
//protected withevents GridView OrdersGrid;
protected override void OnLoad(EventArgs e)
{
UserInformation info
= (UserInformation)Session["User"];
this.FirstName.Text = info.FirstName;
this.LastName.Text = info.LastName;
var dal
= new OrdersDAL();
this.OrdersGrid.DataSource = dal.GetOrders(info.ID);
this.OrdersGrid.DataBind();
}


protected void OrdersGrid_RowDataBound(
object sender, GridViewRowEventArgs e)
{

if (e.Row.ItemType == DataRowControlState.DataItem)
{
e.Row.Cells[
3].Text = ((Order)e.Row.DataItem).HasShipped
? "Yes" : "No";
}
}
}

在這個示例頁面中,我們從一個存儲了UserInformation對象的會話變量中提取姓名信息。接下來,調用數據訪問層提供的一個方法GetOrders來獲取針對特定的用戶ID的訂單信息,并把結果綁定到網格控件中。

  因此,在上面這個簡單的例子中,代碼隱藏文件的作用是負責把數據賦給頁面中的控件,如把數據加載到一個網格控件中,并實現對數據訪問層的訪問。

  下面,我們來觀察MVC框架中通過控制器提供的實現思路。

  清單2—ASP.NET MVC控制器示例

 
public class CustomerModel
{

public UserInformation User { get; set; }
public IEnumerable<Order> Orders { get; set; }
}

public class CustomerController : Controller
{

public ActionResult Index()
{
var dal
= new OrdersDAL();
var user
= (UserInformation)Session["User"];
return View(new CustomerModel
{
User
= user,
Orders
= dal.GetOrders(user.ID)
});
}
}

怎么樣?在MVC控制器和前面的ASP.NET Web表單之間的確存在一些相當大的變化。首先,CustomerModel類包含了將要在視圖中顯示的實際數據。在Web表單中,由代碼隱藏文件把數據分配給視圖;而在MVC中,由控制器為視圖創建模型,進行數據訪問操作,以及從會話中訪問數據。 那么,我們是如何與在Web表單環境下熟悉的文本框、網格及其他控件打交道呢?下面清單3給出了一個在MVC框架下顯示用戶界面的視圖的示例。

  清單3—MVC視圖舉例

 
<@Page … >
<html>
<body>
<% Html.BeginForm(); %>
<div>
<span>First</span>
<%= Html.TextBox("FirstName", Model.User.FirstName)%>
</div>
<div>
<span>Last</span>
<%= Html.TextBox("LastName", Model.User.LastName)%>
</div>
<div>
<table>
<thead>
<tr>
<th>Date</th>
<th>Amount</th>
<th># Products</th>
<th>Has Shipped?</th>
</tr>
</thead>
<tbody>
<% foreach (var order in Model.Orders){%>
<tr>
<td><%= order.Date %></td>
<td><%= order.Amount.ToString("C")%></td>
<td><%= order.ProductCount %></td>
<td><%= order.HasShipped ? "Yes" : "No" %></td>
</tr>
<%}%>
</tbody>
</table>
</div>
<% Html.EndForm(); %>
</body>
</html>

與Web表單相比,這里顯然發生了巨大改變。MVC視圖更多地控制著數據在用戶界面上的顯示。盡管其工作方式類似于Web表單,但還要由它指定要加載的數據,而且由視圖來管理用戶界面的顯示方式,而不必涉及到Web表單框架下代碼隱藏文件的干預。

  歸納來看,上面清單1中在GridView的最后一個單元格中顯示Yes/No數據時,是通過代碼隱藏文件把一個布爾值轉換成一個Yes/No值。但是,在MVC中框架下,上述這種方式的轉換都是以內聯方式發生的,而不需要添加事件處理器。盡管這僅僅是小例一個,但已經初步展示了Web表單框架與MVC框架渲染數據方式的不同。

  三、資源問題

  在ASP.NET窗體下,開發人員可以使用廣泛的外部資源來存儲數據。用戶可以使用如Session,Cache和Application及其他集合來存儲數據,甚至能夠跨越頁面回寄。在ASP.NET MVC框架中仍然可以使用這些結構來保留數據,但是又得到了更好的改善。

  伴隨ASP.NET動態數據的出現,系統引入了一個新的System.Web.Abstractions程序集,其中,針對Session、Cache、Request、Response等重要組件均提供了基類支持。這些基類的形式類似于HttpContextBase,HttpRequestBase,等等。這真是一個好消息,因為ASP.NET針對這類對象都提供了相應的具體的實現類(分別命名為HttpContextWrapper,HttpRequestWrapper,等等)以便提供實際服務。出于測試目的,您可以創建自己的測試類,這個測試類可以是繼承自HttpContextBase類,也可以是其他上述基類。

  在ASP.NET Web表單框架下,訪問頁面的Request屬性總會返回一個針對HttpRequest的引用。這個HttpRequest類是不可擴展的,而且與Web表單框架高度耦合到一起。相比之下,在MVC框架中請求對象是HttpRequestBase基類的引用。ASP.NET MVC框架使用HttpRequestWrapper包裝類來實現這個基類,以便實際使用底層的HttpRequest對象。但是,出于測試目的,您可以創建一個繼承自HttpRequestBase的虛構類,由它來實現測試一些方法,以便包含你要測試的代碼并使用NUnit、MBUnit或其他測試框架加以測試。

  四、生命周期

  使用ASP.NET Web表單時,頁面將觸發Init,Load,PreRender,和Unload等事件。但是,在ASP.NET MVC中,并沒有利用這個生命周期,而是對行為方法發出請求。這對于習慣了Web表單框架的開發人員可能需要一個不斷熟悉的過程。

 五、小結

  可以說,ASP.NET MVC框架是傳統型ASP.NET Web表單框架的巨大轉變。本文主要從代碼隱藏文件和用戶界面角度對這兩個框架進行了比較。在后面其他文章中,我們還要通過對比的方式來學習這兩個框架的其他重要區別,當然重點還在于學習MVC 2.0框架的新特征。

  【相關文章】:巨大轉變!ASP.NET MVC2用戶界面新實踐

                             巨大轉變!ASP.NET MVC2調用AJAX新特征

                             巨大轉變!ASP.NET MVC2行為方法新改進

0
0
 
標簽:ASP.NET MVC html .NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()