MVC中Controller與View之間資料互傳

來源:互聯網
上載者:User

標籤:

轉自:http://blog.csdn.net/sknice/article/details/42323791

在ASP.NET MVC中,經常會在Controller與View之間傳遞資料,因此,熟練、靈活的掌握這兩層之間的資料傳遞方法就非常重要。本文從兩個方面進行探討:

一、Controller向View傳遞資料

1、使用ViewData傳遞資料

在Controller中定義如下:

ViewData[“Message_ViewData”] = “ Hello ViewData!”;  

在View中讀取Controller中定義的ViewData資料,代碼如下:

@Html.Encode(ViewData["Message_ViewData"])  

js中讀取ViewData中資料如下:

<pre name="code" class="javascript"><script type="text/javascript">      var viewData = ‘@ViewData["Message_ViewData"]‘;  </script>  

2、使用ViewBag傳遞資料

在Controller中定義如下:

ViewBag.Message_ViewBag =  “ Hello ViewBag !”;  

在View中讀取Controller中定義的ViewBag資料,代碼如下:

@Html.Encode(ViewBag.Message_ViewBag)  

js中讀取ViewBag中資料如下:

<script type="text/javascript">      var viewBag= ‘@ViewBag.Message_ViewBag‘;  </script>  

3、使用TempData傳遞資料

在Controller中定義如下:

TempData[“Message”] = “Hello word!”;

然後在View中讀取Controller中定義的TempData資料,代碼如下:

@Html.Encode(TempData["Message_TempData"])  
 

js中讀取TempData中資料如下:

<script type="text/javascript">       var tempData = ‘@TempData["Message"]‘;  </script> 

4、使用Model、傳遞資料

首先要建立Model實體類:

 1 public class HelloModel   2     {   3         private string _name;   4         public string Name   5         {   6             get { return _name; }   7             set { _name = value; }   8         }   9         private string _text;  10         public string Text  11         {  12             get { return _text; }  13             set { _text = value; }  14         }  15     }  

使用Model傳遞資料的時候,通常在建立View的時候我們會選擇建立強型別View如所示:

模型類下拉式清單方塊中選中剛才建立的HelloModel

建立強型別的View以後,View的第一行代碼如下所示:

@model Test.Models.HelloModel

就代表了這個View使用的Model為“Test.Models.HelloModel”
然後在View中讀取Model中定義的資料,代碼如下:

@Html.Encode(Model.Name) 

js中讀取Model中資料如下:

<script type="text/javascript">       var modelName = ‘@Model.Name‘;  </script> 

總結:
1)ViewData與TempData方式是弱類型的方式傳遞資料,而使用Model傳遞資料是強型別的方式。
2)ViewData與TempData是完全不同的資料類型,ViewData資料類型是ViewDataDictionary類的執行個體化對象,而TempData的資料類型是TempDataDictionary類的執行個體化對象。
3)TempData實際上儲存在Session中,控制器每次執行請求時都會從Session中擷取TempData資料並刪除該Session。TempData資料只能在控制器中傳遞一次,其中的每個元素也只能被訪問一次,訪問之後會被自動刪除。
4)ViewData只能在一個Action方法中進行設定,在相關的視圖頁面讀取,只對當前視圖有效。理論上,TempData應該可以在一個Action中設定,多個頁面讀取。但是,實際上TempData中的元素被訪問一次以後就會被刪除。
5)在MVC3開始,視圖資料可以通過ViewBag屬性訪問,在MVC2中則是使用ViewData。MVC3中保留了ViewData的使用,有關他們之間的區別可以參考這個文章。

 MVC3中 ViewBag、ViewData和TempData的使用和區別(http://www.cnblogs.com/bianlan/archive/2013/01/11/2857105.html)

二、View向Controller傳遞資料

在ASP.NET MVC中,將View中的資料傳遞到控制器中,主要通過發送表單的方式來實現。具體的方式有:

1、通過Request.Form讀取表單資料

我們在View層做如下定義:

1 @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))  2 {  3     @Html.TextBox("Name");  4     @Html.TextBox("Text");  5     <input type="submit" value="提交" />  6 } 

注意:
HelloModelTest為對應的Action名,Home為對應的Controller名稱。
然後在Controller層,通過Request.Form讀取表單資料的代碼如下所示:

1 [HttpPost]  2        public ActionResult HelloModelTest()  3        {  4            string name= Request.Form["Name"];  5            string text= Request.Form["Text"];  6            return View();  7        } 

2、通過FormCollection讀取表單資料

我們在View層做如下定義:

1 @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))  2 {  3     @Html.TextBox("Name");  4     @Html.TextBox("Text");  5     <input type="submit" value="提交" />  6 }
 

然後在Controller層,通過FormCollection讀取表單資料的代碼如下所示:

1 [HttpPost]  2         public ActionResult HelloModelTest(FormCollection fc)  3         {  4             string name= fc["Name"];  5             string text  = fc["Text"];  6             return View();  7         }

3、模型繫結

我們在View層做如下定義:

1 @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))  2 {  3     @Html.TextBox("Name");  4     @Html.TextBox("Text");  5     <input type="submit" value="提交" />  6 }  

預設的模型繫結:

相較於從請求中擷取表單值,下面的Edit Action則是簡單地以一個模型對像為參數(Album):

[HttpPost]  public ActionResult HelloModelTest( HelloModel model)  {      // ...  }  

當你的Action方法是以一個模型對象充當參數時,MVC運行時將會用模型繫結來構建該參數。預設用於模型繫結的是 DefaultModelBinder,以上述的HelloModel為例,DefaultModelBinder將會檢索出所有可用的HelloModel屬性用於綁定模型。根據命名規範,DefaultModelBinder能夠自動地在請求中擷取相應的值來填充HelloModel對象(它還能建立一個對象的執行個體來填充)
換句話說,假設HelloModel有一個Name屬性,那麼模型繫結就會在請求中尋找名為Name的參數。注意我說的是在“請求中”,而不是“表單集合”中。模型繫結會在請求中的各個方面進行值尋找,這裡麵包括路由資料,查詢字串,表單集合。有必要的話你還可以添加自訂的值提供資訊。
模型繫結不並局限於Http Post及複雜參數(如HelloModel),你完全可以傳入一個原始的簡單參數:

public ActionResult HelloModelTest( string name,string text)       // …. 

在該情境中,模型繫結將會在請求中尋找名為name,text 的參數。

顯示模型繫結:

當Action有參數的時候,會隱式地執行模型繫結。你還可以在控制器裡面使用UpdateModel和 TryUpdateModel來顯式調用模型繫結。調用UpdateModel的時候,如果模型對象是無效的或者綁定期間發生錯誤則會拋出異常。TryUpdateModel則不會拋出異常,它返回一個布爾值:如果綁定成功並且模型驗證通過則返回true,否則返回false。

 
[HttpPost]  public ActionResult HelloModelTest( )  {      HelloModel model = new HelloModel();                    if (this.TryUpdateModel(model))      {          //綁定成功      }      else      {      //綁定失敗      }  }  

模型狀態是模型繫結產生的副產物。每次綁定器綁定值到模型時,都會在模型狀態中進行記錄。你可以在模型繫結之後查看模型狀態來判斷綁定是否成功:

[HttpPost]  public ActionResult HelloModelTest( )  {      HelloModel model = new HelloModel();      this.TryUpdateModel(model);      if (ModelState.IsValid)      {          //綁定成功      }      else      {  <pre code_snippet_id="569649" snippet_file_name="blog_20150102_21_3590846" name="code" class="csharp"><span style="white-space:pre">    </span>//綁定失敗  }}

如果在模型繫結過程中發生異常,模型狀態裡面就會包含導致異常的那個屬性名稱,綁定值以及錯誤資訊。

 

MVC中Controller與View之間資料互傳

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.