數據傳遞也就是控制器和視圖之間的交互,比如在視圖中提交的數據,在控制器怎麼獲取,或者控制器從業務層獲得一些數據,怎麼傳遞到視圖中,讓視圖顯示在客戶端呢?帶着這些疑問,我們接着看。。
下面分別講解asp.net mvc框架中有三種數據傳遞方式,分別是:ViewData,TempData,Model
ViewData:只能在一個動作方法中設置,在相關視圖頁面讀取,說得再白一點就是隻能在一個頁面中使用。
例 在Action方法中設置:ViewData["Message"]="Test";
在視圖中讀取: <%=Html.Encode(ViewData["Message"]) %>
TempData:TempData和ViewData有一點區別,ViewData只是單個視圖有效,而TempData則是兩個視圖有效,就是說TempData是可以在兩個視圖中傳遞的,如果中間沒有更新TempData的值的話,那麼從第二個視圖顯示之後,TempData所保存的數據就會丟失。(注:也就是說,只有更新過的,以及新添加的鍵值對才能再下次request中繼續使用),微軟爲什麼要這樣做呢,應該是爲了節省資源吧!因爲我們都知道http是無狀態的,每次請求的時候,他都要重新保存TempData的值(利用session保存,順便提一下,asp.net
mvc裏面的session對象和web from是一樣的),但他又爲了不想浪費資源,所以就只保存一次!使用方式和ViewData一致,就把ViewData關鍵字換成TempData即可,在這裏就不列出代碼了!
Model:通過設置,讀取ViewData和TempData屬性,可以將數據從視圖傳到控制器,也可以從控制器傳到視圖,看起來好像已經夠用了,但必需說明的是ViewData和TempData都是弱類型的,所以編碼的時候極容易出錯。這時我們可以通過在控制器的View()方法中,傳遞實例化的對象(例:View(類型)),傳遞實例化對象,由於是強類型原因,在視圖讀書時就有代碼智能感應,有利於代碼的書寫和減少錯誤!除了在Action裏面View的返回時需要帶上實例化對象外,在頁面還需要設置,在Add View時,會彈出以下這個窗口
在用紅色的線圈出來的下拉菜單中輸入對象的類型即可,在頁面使用的時候就直接[Model.屬性]就可以了!
例:<%=Html.Encode(Model.Name) %>
接着我們看看怎麼從視圖把數據傳到控制器,有好幾種方式
第一:通過Request.Form讀取表單
讀取視圖中文本框的值
例: <% =Html.TextBox("Name") %> 視圖代碼
Request.Form["Name"] ; 控制器中Action代碼
第二:通過FormCollection讀取
讀取視圖文本框的值
例: 視圖代碼
<% using (Html.BeginForm("About","Home"))
{ %>
<%=Html.TextBox("Name")%>
<input type="submit" value="submit" name="submit" />
<%}%>
控制器代碼
public ActionResult About(FormCollection form)
{
string s = form["Name"];
return View();
}