控制器方法獲取View頁面傳送的數據有多種方法,以Edit方法為例:
1、Form表單請求收集方式
包括Request.Form或者FormCollection。
如下:
[HttpPost] public ActionResult Edit(FormCollection collection) { var album = new Album(); if (ModelState.IsValid) { // EntityState.Modified表示這條數據是修改的,已有的,而不是新建的 album.Title=collection["Title"]; album.Title = Request.Form["Title"]; db.Entry(album).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); return View(album); }
這樣直接獲取表單請求的數據,代碼會變得冗長乏味。上面只是設置了兩個屬性,如果有10個或者更多個,寫起來太累。而且任何不是字符串類型的屬性還需要自己進行類型轉換。
注意:Request.Form["Title"],必須在頁面的有可編輯標簽的name值為”Title”,根據html標簽的name值獲取該標簽的數據。
2、 DefaultModelBinder
通過View頁面上的類型對象作為參數傳遞數據
如Edit頁面頭部引用:@model MusicStore.Models.Album
Edit方法代碼如下:
[HttpPost] public ActionResult Edit(Album album) { if (ModelState.IsValid) { // EntityState.Modified表示這條數據是修改的,已有的,而不是新建的 db.Entry(album).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); return View(album); }
當操作帶有一個參數時,MVC機制就會使用一個模型綁定器來構建這個參數對象。在Album對象的情形中,默認的模型綁定檢查Album類,並查找能用於綁定的所有Album屬性。因為MVC視圖的命名都是非常規范的, 標簽的name值和實體類的屬性值一樣。這樣,遵照命名約定,默認的模型綁定器能自動將請求中的值轉換和移入到一個Album對象中。如當模型綁定器看到Album有Title屬性時,它就在請求中查找名為”Title”的參數,查到就加進來。
3、顯示模型綁定
使用UpdataModel和TryUpdataModel方法顯式調用模型綁定.如果使用UpdataModel方法,如在模型綁定期間出現錯誤或者模型無效,則會拋出一個異常。而TryUpdataModel方法則不會拋出異常,它返回的是一個布爾類型的值:true or false,true表示成功。
以TryUpdataModel為例:
[HttpPost] public ActionResult Edit() { var album = new Album(); if (ModelState.IsValid) { TryUpdateModel(album); // EntityState.Modified表示這條數據是修改的,已有的,而不是新建的 db.Entry(album).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } else { ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); return View(album); } }