MVC3控制器方法獲取Form數據方法


控制器方法獲取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);
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM