MVCWebForm对照学习:传值方式
剛從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"; 1 頁面間鏈接和數據傳遞的三種方式 2 (1)通過form將數據提交到下一個頁面; 3 (2)通過鏈接將數據提交到下一個頁面; 4 (3)通過Session將數據提交到后續頁面,session是一次會話只要瀏覽器不關閉就不會關閉會話,一般默認保存30分鐘可以根據自己的需要更改 。 5 例: 6 01.html 7 <html> 8 <head> 9 <title>利用表單傳遞數據</title> 10 </head> 11 <body> 12 <h3>利用表單傳遞數據</h3> 13 <form name="form1" method="post" action="02.jsp"> 14 <p>你的姓名: 15 <input type="text" name="name"> 16 </p> 17 <p>你的愛好: 18 <input type="text" name="hobby"> 19 </p> 20 <p>你所從事的行業: 21 <select name="work"> 22 <option></option> <!--默認為空,從下拉菜單中選擇--> 23 <option value="學生">學生</option> 24 <option value="IT業">IT業</option> 25 <option value="商業">商業</option> 26 <option value="制造業">制造業</option> 27 <option value="服務業">服務業</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>從表單中獲取數據</title> 43 </head> 44 <%@ page contentType="text/html;charset=GB2312"%> 45 <body> 46 <h3>從表單中獲取數據</h3> 47 <p> 48 <% 49 //從表單中獲取數據 50 String name= request.getParameter("name"); 51 String hobby=request.getParameter("hobby"); 52 String work= request.getParameter("work"); 53 //驗證"名字(name)"的長度是否符合要求 54 if(name.length()<3||name.length()>8) 55 out.println("你輸入的名字長度不符合要求"); 56 else 57 { 58 out.println("你的姓名是:"+name+"<br>"); 59 out.println("你的愛好是:"+hobby+"<br>"); 60 out.println("你所從事的工作是:"+work+"<br>"); 61 //將"名字(name)"保存到session對象中,讓后續頁面(下個頁面、下下個頁面、……)引用 62 session.setAttribute("name",name); 63 } 64 %> 65 <br> 66 <!--將"愛好(hobby)"和"工作(work)"以鏈接的形式傳遞給下個頁面--> 67 <a href="03.jsp?hobby=<%=hobby%>&work=<%=work%>">提交</a> 68 </p> 69 <hr> 70 <p><font size="2">*將"名字(name)"保存到session對象中,讓后續頁面(下個頁面、下下個頁面、……)引用</font></p> 71 <p><font size="2">*將"愛好(hobby)"和"工作(work)"以鏈接的形式傳遞給下個頁面</font></p> 72 </body> 73 </html> 74 75 03.jsp 76 <html> 77 <head> 78 <title>從session對象中獲取"名字(name)"的值;從鏈接中獲取"愛好(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對象中獲取"名字(name)"的值;從鏈接中獲取"愛好(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("你的愛好是:"+hobby+"<br>"); 103 out.println("你所從事的工作是:"+work+"<br>"); 104 //將"愛好(hobby)"和"工作(work)"保存在session對象中 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>確認提交這些信息嗎?</h3></p> 113 <input type="Button" name="Submit" value="確認" onClick="javascript:submit1()"> 114 <input type="Button" name="Edit" value="修改" onClick="javascript:edit1()"> 115 </form> 116 <hr> 117 <p><font size="2">*將"愛好(hobby)"和"工作(work)"保存在session對象中,讓后續頁面(下個頁面、下下個頁面、……)引用</font></p> 118 <p><font size="2">*由于"名字(name)"在上個頁面中已經保存在session對象中了,這里沒必要再次保存</font></p> 119 </body> 120 </html> 121 122 04.jsp 123 <html> 124 <head> 125 <title>從sessoin對象中獲取數據</title> 126 </head> 127 <%@ page contentType="text/html;charset=GB2312" %> 128 <body> 129 <h3>從sessoin對象中獲取數據</h3> 130 <% 131 //從sessoin對象中獲取數據 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>,在業余時間喜歡<font color="#0000FF"><%=hobby%></font>。 138 </p> 139 </body> 140 </html> 141 142 01.jsp 143 <html> 144 <head> 145 <title>利用表單傳遞數據</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>利用表單傳遞數據</h3> 155 <form name="form1" method="post" action="02.jsp"> 156 <p>你的姓名: 157 <input type="text" name="name" value="<%=name%>"> 158 </p> 159 <p>你的愛好: 160 <input type="text" name="hobby" value="<%=hobby%>"> 161 </p> 162 <p>你所從事的行業: 163 <select name="work"> 164 <%if(work.equals("學生")){%> 165 <option value="學生" selected>學生</option> 166 <option value="IT業">IT業</option> 167 <option value="商業">商業</option> 168 <option value="制造業">制造業</option> 169 <option value="服務業">服務業</option> 170 <%}else if(work.equals("IT業")){%> 171 <option value="學生">學生</option> 172 <option value="IT業" selected>IT業</option> 173 <option value="商業">商業</option> 174 <option value="制造業">制造業</option> 175 <option value="服務業">服務業</option> 176 <%}else if(work.equals("商業")){%> 177 <option value="學生">學生</option> 178 <option value="IT業">IT業</option> 179 <option value="商業" selected>商業</option> 180 <option value="制造業">制造業</option> 181 <option value="服務業">服務業</option> 182 <%}else if(work.equals("制造業")){%> 183 <option value="學生">學生</option> 184 <option value="IT業">IT業</option> 185 <option value="商業">商業</option> 186 <option value="制造業" selected>制造業</option> 187 <option value="服務業">服務業</option> 188 <%}else if(work.equals("服務業")){%> 189 <option value="學生">學生</option> 190 <option value="IT業">IT業</option> 191 <option value="商業">商業</option> 192 <option value="制造業">制造業</option> 193 <option value="服務業" selected>服務業</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>?
以上僅僅使用文本標簽和隱藏域為例。只要通過Form表單提交的的數據(包含隱藏域),不論是什么標簽。都屬于這種傳值方式。
?URL傳遞
1.超鏈接(以html標簽為例):<a href="Default.aspx?param1=1111¶m2=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>標簽和PostBckUrl帶參數傳遞為例。所有的這些通過url地址欄傳遞參數的都是URL傳值。
?內置對象傳遞
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關于這個我不做敘述,詳細的用法可以看 細說 ASP.NET Cache 及其高級用法 6.Application//set Application["count"] = 12; //get int 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"]);//orResponse.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.cs if (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,請指正。謝謝!
完。
?
轉載于:https://www.cnblogs.com/zyh-club/p/4941644.html
總結
以上是生活随笔為你收集整理的MVCWebForm对照学习:传值方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fragment官方解析
- 下一篇: 使用Grunt搭建自动化的web前端开发