日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

MVCWebForm对照学习:传值方式

發(fā)布時(shí)間:2025/4/14 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVCWebForm对照学习:传值方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

剛從webform開(kāi)發(fā)轉(zhuǎn)到mvc,如果說(shuō)像路由這樣稍微復(fù)雜一點(diǎn)的知識(shí)點(diǎn)還可以暫時(shí)先放一放(前提是默認(rèn)的路由規(guī)則基本滿足大部分需求),那有個(gè)問(wèn)題在快速開(kāi)發(fā)中,我想是必須要當(dāng)即解決的,那就是webform中的傳值方式是否同樣適用于mvc中。那么本文照舊分兩部分來(lái)闡述。接下來(lái)先簡(jiǎn)單快速地回顧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服務(wù)器控件為例) <input type="hidden" id="hdUserId" runat="server" /> hdUserId.Value = "1"; 1 頁(yè)面間鏈接和數(shù)據(jù)傳遞的三種方式 2 (1)通過(guò)form將數(shù)據(jù)提交到下一個(gè)頁(yè)面; 3 (2)通過(guò)鏈接將數(shù)據(jù)提交到下一個(gè)頁(yè)面; 4 (3)通過(guò)Session將數(shù)據(jù)提交到后續(xù)頁(yè)面,session是一次會(huì)話只要瀏覽器不關(guān)閉就不會(huì)關(guān)閉會(huì)話,一般默認(rèn)保存30分鐘可以根據(jù)自己的需要更改 。 5 例: 6 01.html 7 <html> 8 <head> 9 <title>利用表單傳遞數(shù)據(jù)</title> 10 </head> 11 <body> 12 <h3>利用表單傳遞數(shù)據(jù)</h3> 13 <form name="form1" method="post" action="02.jsp"> 14 <p>你的姓名: 15 <input type="text" name="name"> 16 </p> 17 <p>你的愛(ài)好: 18 <input type="text" name="hobby"> 19 </p> 20 <p>你所從事的行業(yè): 21 <select name="work"> 22 <option></option> <!--默認(rèn)為空,從下拉菜單中選擇--> 23 <option value="學(xué)生">學(xué)生</option> 24 <option value="IT業(yè)">IT業(yè)</option> 25 <option value="商業(yè)">商業(yè)</option> 26 <option value="制造業(yè)">制造業(yè)</option> 27 <option value="服務(wù)業(yè)">服務(wù)業(yè)</option> 28 </select> 29 </p> 30 <p> 31 <input type="Submit" value="提交"> 32 <input type="Reset" value="重置"> 33 </p> 34 </form> 35 </body> 36 </html> 37 38 39 02.jsp 40 <html> 41 <head> 42 <title>從表單中獲取數(shù)據(jù)</title> 43 </head> 44 <%@ page contentType="text/html;charset=GB2312"%> 45 <body> 46 <h3>從表單中獲取數(shù)據(jù)</h3> 47 <p> 48 <% 49 //從表單中獲取數(shù)據(jù) 50 String name= request.getParameter("name"); 51 String hobby=request.getParameter("hobby"); 52 String work= request.getParameter("work"); 53 //驗(yàn)證"名字(name)"的長(zhǎng)度是否符合要求 54 if(name.length()<3||name.length()>8) 55 out.println("你輸入的名字長(zhǎng)度不符合要求"); 56 else 57 { 58 out.println("你的姓名是:"+name+"<br>"); 59 out.println("你的愛(ài)好是:"+hobby+"<br>"); 60 out.println("你所從事的工作是:"+work+"<br>"); 61 //"名字(name)"保存到session對(duì)象中,讓后續(xù)頁(yè)面(下個(gè)頁(yè)面、下下個(gè)頁(yè)面、……)引用 62 session.setAttribute("name",name); 63 } 64 %> 65 <br> 66 <!--將"愛(ài)好(hobby)"和"工作(work)"以鏈接的形式傳遞給下個(gè)頁(yè)面--> 67 <a href="03.jsp?hobby=<%=hobby%>&work=<%=work%>">提交</a> 68 </p> 69 <hr> 70 <p><font size="2">*將"名字(name)"保存到session對(duì)象中,讓后續(xù)頁(yè)面(下個(gè)頁(yè)面、下下個(gè)頁(yè)面、……)引用</font></p> 71 <p><font size="2">*將"愛(ài)好(hobby)"和"工作(work)"以鏈接的形式傳遞給下個(gè)頁(yè)面</font></p> 72 </body> 73 </html> 74 75 03.jsp 76 <html> 77 <head> 78 <title>從session對(duì)象中獲取"名字(name)"的值;從鏈接中獲取"愛(ài)好(hobby)"和"工作(work)"</title> 79 </head> 80 <%@ page contentType="text/html;charset=GB2312"%> 81 <SCRIPT language="JavaScript"> 82 function submit1() 83 { 84 document.forms["form1"].action="04.jsp"; 85 document.form1.submit(); 86 } 87 88 function edit1() 89 { 90 document.forms["form1"].action="01.jsp"; 91 document.form1.submit(); 92 } 93 </SCRIPT> 94 <%@ page contentType="text/html;charset=GB2312" %> 95 <body> 96 <h3>從session對(duì)象中獲取"名字(name)"的值;從鏈接中獲取"愛(ài)好(hobby)"和"工作(work)"</h3> 97 <% 98 String name=(String)session.getAttribute("name"); 99 String hobby=request.getParameter("hobby"); 100 String work= request.getParameter("work"); 101 out.println("你的姓名是:"+name+"<br>"); 102 out.println("你的愛(ài)好是:"+hobby+"<br>"); 103 out.println("你所從事的工作是:"+work+"<br>"); 104 //"愛(ài)好(hobby)""工作(work)"保存在session對(duì)象中 105 session.setAttribute("hobby",hobby); 106 session.setAttribute("work",work); 107 %> 108 <form name="form1" method="post"> 109 <input type="hidden" name="name" value="<%=name%>"> 110 <input type="hidden" name="hobby" value="<%=hobby%>"> 111 <input type="hidden" name="work" value="<%=work%>"> 112 <p><h3>確認(rèn)提交這些信息嗎?</h3></p> 113 <input type="Button" name="Submit" value="確認(rèn)" onClick="javascript:submit1()"> 114 <input type="Button" name="Edit" value="修改" onClick="javascript:edit1()"> 115 </form> 116 <hr> 117 <p><font size="2">*將"愛(ài)好(hobby)"和"工作(work)"保存在session對(duì)象中,讓后續(xù)頁(yè)面(下個(gè)頁(yè)面、下下個(gè)頁(yè)面、……)引用</font></p> 118 <p><font size="2">*由于"名字(name)"在上個(gè)頁(yè)面中已經(jīng)保存在session對(duì)象中了,這里沒(méi)必要再次保存</font></p> 119 </body> 120 </html> 121 122 04.jsp 123 <html> 124 <head> 125 <title>從sessoin對(duì)象中獲取數(shù)據(jù)</title> 126 </head> 127 <%@ page contentType="text/html;charset=GB2312" %> 128 <body> 129 <h3>從sessoin對(duì)象中獲取數(shù)據(jù)</h3> 130 <% 131 //從sessoin對(duì)象中獲取數(shù)據(jù) 132 String name=(String)session.getAttribute("name"); 133 String work=(String)session.getAttribute("work"); 134 String hobby=(String)session.getAttribute("hobby"); 135 %> 136 <p> 137 <font color="#0000FF"><%=name%></font>,你好!你所從事的工作是<font color="#0000FF"><%=work%></font>,在業(yè)余時(shí)間喜歡<font color="#0000FF"><%=hobby%></font>138 </p> 139 </body> 140 </html> 141 142 01.jsp 143 <html> 144 <head> 145 <title>利用表單傳遞數(shù)據(jù)</title> 146 </head> 147 <%@ page contentType="text/html;charset=GB2312" %> 148 <% 149 String name=request.getParameter("name"); 150 String hobby=request.getParameter("hobby"); 151 String work=new String(request.getParameter("work").getBytes("ISO8859_1"),"GBK"); 152 %> 153 <body> 154 <h3>利用表單傳遞數(shù)據(jù)</h3> 155 <form name="form1" method="post" action="02.jsp"> 156 <p>你的姓名: 157 <input type="text" name="name" value="<%=name%>"> 158 </p> 159 <p>你的愛(ài)好: 160 <input type="text" name="hobby" value="<%=hobby%>"> 161 </p> 162 <p>你所從事的行業(yè): 163 <select name="work"> 164 <%if(work.equals("學(xué)生")){%> 165 <option value="學(xué)生" selected>學(xué)生</option> 166 <option value="IT業(yè)">IT業(yè)</option> 167 <option value="商業(yè)">商業(yè)</option> 168 <option value="制造業(yè)">制造業(yè)</option> 169 <option value="服務(wù)業(yè)">服務(wù)業(yè)</option> 170 <%}else if(work.equals("IT業(yè)")){%> 171 <option value="學(xué)生">學(xué)生</option> 172 <option value="IT業(yè)" selected>IT業(yè)</option> 173 <option value="商業(yè)">商業(yè)</option> 174 <option value="制造業(yè)">制造業(yè)</option> 175 <option value="服務(wù)業(yè)">服務(wù)業(yè)</option> 176 <%}else if(work.equals("商業(yè)")){%> 177 <option value="學(xué)生">學(xué)生</option> 178 <option value="IT業(yè)">IT業(yè)</option> 179 <option value="商業(yè)" selected>商業(yè)</option> 180 <option value="制造業(yè)">制造業(yè)</option> 181 <option value="服務(wù)業(yè)">服務(wù)業(yè)</option> 182 <%}else if(work.equals("制造業(yè)")){%> 183 <option value="學(xué)生">學(xué)生</option> 184 <option value="IT業(yè)">IT業(yè)</option> 185 <option value="商業(yè)">商業(yè)</option> 186 <option value="制造業(yè)" selected>制造業(yè)</option> 187 <option value="服務(wù)業(yè)">服務(wù)業(yè)</option> 188 <%}else if(work.equals("服務(wù)業(yè)")){%> 189 <option value="學(xué)生">學(xué)生</option> 190 <option value="IT業(yè)">IT業(yè)</option> 191 <option value="商業(yè)">商業(yè)</option> 192 <option value="制造業(yè)">制造業(yè)</option> 193 <option value="服務(wù)業(yè)" selected>服務(wù)業(yè)</option> 194 <%}%> 195 </select> 196 </p> 197 <p> 198 <input type="Submit" value="提交"> 199 <input type="Reset" value="重置"> 200 </p> 201 </form> 202 </body> 203 </html>

?

以上僅僅使用文本標(biāo)簽和隱藏域?yàn)槔V灰ㄟ^(guò)Form表單提交的的數(shù)據(jù)(包含隱藏域),不論是什么標(biāo)簽。都屬于這種傳值方式。

?URL傳遞

1.超鏈接(以html標(biāo)簽為例):<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" /> //get var userId=Request.QueryString["UserId"]

?

以上僅以<a>標(biāo)簽和PostBckUrl帶參數(shù)傳遞為例。所有的這些通過(guò)url地址欄傳遞參數(shù)的都是URL傳值。

?內(nèi)置對(duì)象傳遞

1.Response.Redirect//page1 string url = "Default.aspx?p1=" + p1 + "&p2=" + p1; Response.Redirect(url, false); //page2 var 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.cs Server.Transfer("~/Default2.aspx", true); Server.Execute("~/Default2.aspx", true);//Default.aspx.cs Page_Load Response.Write(Request.Form["txtName"]) 3.Session://set Session["name"] = txtName.Value; //get string name = Session["name"].ToString(); 4.Cookie://set HttpCookie cookie = new HttpCookie("MyCookie", aa); Response.Cookies.Add(cookie);//get HttpCookie myCookie = Request.Cookies["MyCookie"]; txt1.Value = myCookie.Value; 5.Cache關(guān)于這個(gè)我不做敘述,詳細(xì)的用法可以看 細(xì)說(shuō) ASP.NET Cache 及其高級(jí)用法 6.Application//set Application["count"] = 12; //get int count= (int)Application["count"].;

?

7.ViewState

關(guān)于這個(gè)話題,我不做過(guò)多敘述,可以看下這篇文章

?Cross Page Posting (ASP.NET 2.0)

兩個(gè)概念CrossPageSource.aspx(來(lái)源網(wǎng)頁(yè)) CrossPageTarget.aspx(目標(biāo)網(wǎng)頁(yè))1.獲取來(lái)源網(wǎng)頁(yè)的控件的值//Default.aspx(來(lái)源網(wǎng)頁(yè))<input type="text" id="txtName" runat="server" /> <asp:Button Text="test" runat="server" PostBackUrl="~/Default2.aspx" />//Default2.aspx.cs(目標(biāo)網(wǎng)頁(yè)) if (PreviousPage.IsCrossPagePostBack) { //獲取來(lái)源頁(yè)的控件的值Response.Write(Request.Form["txtName"]);//orResponse.Write((PreviousPage.FindControl("txtName") as System.Web.UI.HtmlControls.HtmlInputText).Value); } 2.獲取源網(wǎng)頁(yè)屬性值//Default.aspx(來(lái)源網(wǎng)頁(yè))<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(目標(biāo)網(wǎng)頁(yè)) <%@ PreviousPageType VirtualPath="~/Default.aspx" %> //Default2.aspx.cs if (PreviousPage.IsCrossPagePostBack) { //獲取屬性的值  Response.Write(PreviousPage.Name); } 注:PreviousPage需要做非空判斷

?

Part?2?MVC傳值方式

在開(kāi)始了解asp.net mvc各種傳值方式之前,我們先來(lái)看下面這張圖。它很形象的闡明了各個(gè)級(jí)別之間傳遞值的方式。

(來(lái)自互聯(lián)網(wǎng))

從圖上不難看出asp.net mvc中獨(dú)有的傳值方式有ViewData、ViewBag、TempData。當(dāng)然還有ViewModel和Model。當(dāng)然細(xì)心的你可能發(fā)現(xiàn)這個(gè)圖并不完美。稍作改動(dòng)如下:

?ViewData\ViewBag

關(guān)于它們兩個(gè)我們先來(lái)看一組對(duì)照:

(圖片來(lái)自互聯(lián)網(wǎng))

雖然ViewBag在asp.net mvc 3才出現(xiàn),但它實(shí)質(zhì)上它其實(shí)是一個(gè)包了一層Dynamic的ViewData(關(guān)于這個(gè),可以看看這個(gè),這里就不再細(xì)述),也就是對(duì)ViewData的封裝,這樣再看它們之間的差異時(shí),我們就不難理解了。接下來(lái)看示例:

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實(shí)質(zhì)上其實(shí)是一個(gè)包了一層Dynamic的ViewData,而我們對(duì)ViewBag的動(dòng)態(tài)屬性進(jìn)行賦值,值實(shí)際上是存到了ViewData中,動(dòng)態(tài)屬性的名存成了ViewDataDictionary的鍵,動(dòng)態(tài)屬性的值存成了ViewDataDictionary的值。為了論證這一點(diǎn),我們將上面的代碼做下的改動(dòng),再看運(yùn)行結(jié)果:

果不其然,如同變量被重新賦值。由于實(shí)際上它們key同名了,而最終又是都是ViewDataDictionary的方式來(lái)存儲(chǔ)的,所以后來(lái)的值將原先的給覆蓋掉了。同樣的道理,即使后臺(tái)不做改動(dòng),我們?cè)谇芭_(tái)通過(guò)@ViewData["Message"]取到的是ViewBag.Message的值:

小結(jié):ViewData、ViewBag主要是將數(shù)據(jù)從控制器級(jí)別傳遞到視圖級(jí)別

???TempData

TempData是TempDataDictionary的字典類(lèi)型。它不僅可以將數(shù)據(jù)從action傳遞到視圖,還可以傳遞到后續(xù)請(qǐng)求的action操作。接下來(lái)看示例:

(控制器)

(視圖)

為了直接說(shuō)明TempData可以將數(shù)據(jù)從一次請(qǐng)求傳遞到后續(xù)請(qǐng)求以及從控制器傳遞到視圖,我直接在TestTempData操作中創(chuàng)建TempData["BookData"],然后傳遞到Index操作中,然后在Index的視圖中展現(xiàn)數(shù)據(jù)。運(yùn)行結(jié)果如下:

接下來(lái),我們嘗試刷新頁(yè)面,很不幸的事情發(fā)生了:未將對(duì)象引用到對(duì)象的實(shí)例。調(diào)試發(fā)現(xiàn)TempData的值已經(jīng)變?yōu)閚ull:

之所以會(huì)這樣這是由TempData的生命周期決定的:TempData只能保存數(shù)據(jù)到它的下一次請(qǐng)求。這其實(shí)是由TempData的存儲(chǔ)機(jī)制有關(guān)。關(guān)于TempData的實(shí)現(xiàn)機(jī)制可以看下下面這篇文章:?淺談ASP.NET MVC中TempData的實(shí)現(xiàn)機(jī)制?。當(dāng)然asp.net mvc同樣為我們提供了TempDaa持續(xù)保存數(shù)據(jù)的實(shí)現(xiàn)方式:

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

這也是基于TemData的實(shí)現(xiàn)機(jī)制,在下一次請(qǐng)求之前會(huì)移除TempData中任何沒(méi)有被更新的鍵值對(duì)。于是我們通過(guò)keep對(duì)響應(yīng)的key進(jìn)行更新。

?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>

運(yùn)行結(jié)果:

其它的像Session、Application、Cookie、Cache因?yàn)槭腔赼sp.net框架的,和webform中使用的方式是一樣的,這里就不做贅述。

注:由于個(gè)人技術(shù)有限,對(duì)某些概念的理解可能會(huì)存在偏差,如果你發(fā)現(xiàn)本文存在什么bug,請(qǐng)指正。謝謝!

完。

?

轉(zhuǎn)載于:https://www.cnblogs.com/zyh-club/p/4941644.html

總結(jié)

以上是生活随笔為你收集整理的MVCWebForm对照学习:传值方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。