【MVC】View與Control之間數據傳遞
1、 Controller向View傳遞數據
- 使用ViewData傳遞數據【弱類型,字典型ViewDataDictionary】
ViewData[“Message_ViewData”] = “ Hello ViewData!”;
在View中讀取Controller中定義的ViewData數據,代碼如下:
@Html.Encode(ViewData["Message_ViewData"])
- 使用ViewBag傳遞數據 【動態型,dynamic】
我們在Controller中定義如下:ViewBag.Message_ViewBag = “ Hello ViewBag !”;
- 使用TempData傳遞數據 【弱類型,臨時存儲,一次性獲取就沒了,實際上保存在Session中】
我們在Controller中定義如下:TempData[“Message”] = “Hello word!”;
- 使用Model傳遞數據 【強類型】
創建強類型的View以後,View的第一行代碼如下所示:@model Test.Models.HelloModel
就代表了這個View使用的Model為“Test.Models.HelloModel”
然後在View中讀取Model中定義的數據,代碼如下:@Html.Encode(Model.Name)
2、View向Controller傳遞數據
主要通過 發送表單的方式來實現。具體的方式有:
- 通過Request.Form讀取表單數據【post】
@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post)) { @Html.TextBox("Name"); @Html.TextBox("Text"); <input type="submit" value="提交" /> }
控制器中
[HttpPost]public ActionResult HelloModelTest() { string name= Request.Form["Name"]; string text= Request.Form["Text"]; return View(); }
或者
[HttpPost] public ActionResult HelloModelTest(FormCollection fc) { string name= fc["Name"]; string text = fc["Text"]; return View(); }
- 模型綁定
@*為了下面的submit可以post提交到eidt*@ @using (Html.BeginForm("Edit", "TestMovie", FormMethod.Post)) { //為了防止“過多發布”攻擊,請啟用要綁定到的特定屬性,控制器中加特性[ValidateAntiForgeryToken] @Html.AntiForgeryToken() <div> <input type="submit" value="保存" class="btn btn-default" /> </div> } 也可以 @using (Html.BeginForm()) { <input type="submit" value="刪除" class="btn btn-default" /> }
控制器中
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include = "ID,Title,Director,Date")] MovieDB movieDB) 或者 public ActionResult Edit(MovieDB movieDB) //這個默認的模型綁定 { if (ModelState.IsValid) { db.Entry(movieDB).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(movieDB); }
當你的Action方法是以一個模型對象充當參數時,MVC運行時將會用模型綁定來構建該參數。
默認用於模型綁定的是 DefaultModelBinder,以上述的HelloModel為例,DefaultModelBinder將會檢索出所有可用的HelloModel屬性用於綁定模型。
根據命名約定,DefaultModelBinder能夠自動地在請求中獲取相應的值來填充HelloModel對象(它還能創建一個對象的實例來填充)
換句話說:假設HelloModel有一個Name屬性,那麽模型綁定就會在請求中查找名為Name的參數。註意我說的是在“請求中”,而不是“表單集合”中。
模型綁定會在請求中的各個方面進行值查找,這裏面包括路由數據,查詢字符串,表單集合。有必要的話你還可以添加自定義的值提供信息。
模型綁定不並局限於Http Post及復雜參數(如HelloModel),你完全可以傳入一個原始的簡單參數:
public ActionResult HelloModelTest( string name,string text)
// ….
在該場景中,模型綁定將會在請求中查找名。
【MVC】View與Control之間數據傳遞