MVC&WebForm對照學習:傳值方式

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   for   

剛從webform開發轉到mvc,如果說像路由這樣稍微複雜一點的知識點還可以暫時先放一放(前提是預設的路由規則基本滿足大部分需求),那有個問題在快速開發中,我想是必須要當即解決的,那就是webform中的傳值方式是否同樣適用於mvc中。那麼本文照舊分兩部分來闡述。接下來先簡單快速地回顧webform中的傳值方式。

Part 1  WebForm中的傳值方式

 Form表單傳遞(get/post)  

//aspx
<input type="text" id="txtName" name="txtName" runat="server"/>
//aspx.cs
string txtName = Request.Form["txtName"].ToString();

//隱藏欄位(以html伺服器控制項為例)
<input type="hidden" id="hdUserId" runat="server" />
hdUserId.Value = "1";

以上僅僅使用文字標籤和隱藏欄位為例。只要通過Form表單提交的的資料(包含隱藏欄位),不論是什麼標籤。都屬於這種傳值方式。

 URL傳遞

1.超連結(以html標籤為例):

<a href="Default.aspx?param1=1111&param2=2222">Go</a>

 2.PostBackUrl

<asp:Button ID="btnCheckOut" Text="CheckOut" PostBackUrl="~/Default.aspx?UserId=1" runat="Server" />//getvar userId=Request.QueryString["UserId"]

以上僅以<a>標籤和PostBckUrl帶參數傳遞為例。所有的這些通過url地址欄傳遞參數的都是URL傳值。

 內建對象傳遞

1.Response.Redirect

//page1string url = "Default.aspx?p1=" + p1 + "&p2=" + p1;Response.Redirect(url, false);      //page2var p1 = Request.QueryString["p1"].ToString();var p2 = Request.QueryString["p2"].ToString();

2.Server.Transfer

//Default.aspx<input type="text" id="txtName" runat="server" />//Default.aspx.csServer.Transfer("~/Default2.aspx", true);Server.Execute("~/Default2.aspx", true);//Default.aspx.cs  Page_LoadResponse.Write(Request.Form["txtName"])

3.Session:

//setSession["name"] = txtName.Value;//getstring name = Session["name"].ToString();

4.Cookie:

//setHttpCookie cookie = new HttpCookie("MyCookie", aa);Response.Cookies.Add(cookie);//getHttpCookie myCookie = Request.Cookies["MyCookie"];txt1.Value = myCookie.Value;

5.Cache

關於這個我不做敘述,詳細的用法可以看細說 ASP.NET Cache 及其進階用法 

6.Application

//setApplication["count"] = 12;//getint count= (int)Application["count"].;

7.ViewState

關於這個話題,我不做過多敘述,可以看下這篇文章

 Cross Page Posting (ASP.NET 2.0)

兩個概念CrossPageSource.aspx(來源網頁)  CrossPageTarget.aspx(目標網頁)

1.擷取來源網頁的控制項的值

//Default.aspx(來源網頁) <input type="text" id="txtName" runat="server" /><asp:Button Text="test" runat="server" PostBackUrl="~/Default2.aspx" />//Default2.aspx.cs(目標網頁)if (PreviousPage.IsCrossPagePostBack) {     //擷取來源頁的控制項的值    Response.Write(Request.Form["txtName"]);
//or Response.Write((PreviousPage.FindControl("txtName") as System.Web.UI.HtmlControls.HtmlInputText).Value);}

2.擷取源網頁屬性值

//Default.aspx(來源網頁) <input type="text" id="txtName" runat="server" /><asp:Button Text="test" runat="server" PostBackUrl="~/Default2.aspx" />//Default.aspx.cs 公用屬性
public string Name {
    get {
        return txtName.Value;
    }
}
//Default2.aspx(目標網頁)
<%@ PreviousPageType VirtualPath="~/Default.aspx" %>//Default2.aspx.csif (PreviousPage.IsCrossPagePostBack) { //擷取屬性的值  
Response.Write(PreviousPage.Name);}

 註:PreviousPage需要做非空判斷

Part 2 MVC傳值方式

在開始瞭解asp.net mvc各種傳值方式之前,我們先來看下面這張圖。它很形象的闡明了各個層級之間傳遞值的方式。

(來自互連網)

從圖上不難看出asp.net mvc中專屬的傳值方式有ViewData、ViewBag、TempData。當然還有ViewModel和Model。當然細心的你可能發現這個圖並不完美。稍作改動如下:

 ViewData\ViewBag

關於它們兩個我們先來看一組對照:

(圖片來自互連網)

雖然ViewBag在asp.net mvc 3才出現,但它實質上它其實是一個包了一層Dynamic的ViewData(關於這個,可以看看這個,這裡就不再細述),也就是對ViewData的封裝,這樣再看它們之間的差異時,我們就不難理解了。接下來看樣本:

Action:

public ActionResult Index() {    ViewData["Message1"] = "This Message is coming from ViewData";    ViewBag.Message = "This Message is coming from ViewBag";       return View();}

View:

<div>    @ViewData["Message1"]</div><div>    @ViewBag.Message</div>


結果:

上面講到VieBag實質上其實是一個包了一層Dynamic的ViewData,而我們對ViewBag的動態屬性進行賦值,值實際上是存到了ViewData中,動態屬性的名存成了ViewDataDictionary的鍵,動態屬性的值存成了ViewDataDictionary的值。為了論證這一點,我們將上面的代碼做下的改動,再看運行結果:

果不其然,如同變數被重新賦值。由於實際上它們key同名了,而最終又是都是ViewDataDictionary的方式來儲存的,所以後來的值將原先的給覆蓋掉了。同樣的道理,即使後台不做改動,我們在前台通過@ViewData["Message"]取到的是ViewBag.Message的值:

小結:ViewData、ViewBag主要是將資料從控制器層級傳遞到視圖層級

 TempData

TempData是TempDataDictionary的字典類型。它不僅可以將資料從action傳遞到視圖,還可以傳遞到後續請求的action操作。接下來看樣本:

(控制器)

(視圖)

為了直接說明TempData可以將資料從一次請求傳遞到後續請求以及從控制器傳遞到視圖,我直接在TestTempData操作中建立TempData["BookData"],然後傳遞到Index操作中,然後在Index的視圖中展現資料。運行結果如下:

接下來,我們嘗試重新整理頁面,很不幸的事情發生了:未將對象引用到對象的執行個體。調試發現TempData的值已經變為null:

之所以會這樣這是由TempData的生命週期決定的:TempData只能儲存資料到它的下一次請求。這其實是由TempData的儲存機制有關。關於TempData的實現機制可以看下下面這篇文章:淺談ASP.NET MVC中TempData的實現機制。當然asp.net mvc同樣為我們提供了TempDaa持續儲存資料的實現方式:

public ActionResult Index(){    Book book = TempData["BookData"] as Book;    TempData.Keep("BookData");    //儲存tempdate的值     return View(book);}
View Code

這也是基於TemData的實現機制,在下一次請求之前會移除TempData中任何沒有被更新的索引值對。於是我們通過keep對響應的key進行更新。

 ViewModel

public ActionResult Index(){    Book book = TempData["BookData"] as Book;    TempData.Keep("BookData");    //儲存tempdate的值     return View(book);}

視圖:

<div>    ID: @Model.ID<br />    BookName:@Model.BookName<br />    Author: @Model.Author<br />    ISBN: @Model.ISBN</div>

運行結果:

其它的像Session、Application、Cookie、Cache因為是基於asp.net架構的,和webform中使用的方式是一樣的,這裡就不做贅述。

註:由於個人技術有限,對某些概念的理解可能會存在偏差,如果你發現本文存在什麼bug,請指正。謝謝!

完。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MVC&WebForm對照學習:傳值方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.