在前面我們已經介紹了如何創建控制器、視圖和數據模型,運行之前的項目并打開Movies主頁,將鼠標懸停在“編輯”菜單上,你會看到瀏覽器右下角顯示了“編輯”鏈接的地址
首先我們查看視圖代碼,找到“編輯”項對應的代碼
通過代碼提示我們知道ActionLink方法返回包含指定操作的虛擬路徑的定位點元素(a 元素);HTML輔助方法簡化了視圖的編碼,所有模型值在渲染前都會被這些輔助方法對值進行HTML編碼;在瀏覽器中我們可以查看輔助方法生成對應的HTML代碼
回到之前在瀏覽器右下角看到的地址,它是通過RouteConfig類(你可以在解決方案中的App_Start文件夾下找到它)生成的;ASP.NET將URL請求地址轉換成對應的調用方法
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
向下圖中,你可以直接在瀏覽器中提交http://localhost:51894/movies/Edit?Id=2,然后頁面會轉到編輯頁面
現在讓我們來看看控制器中的Edit方法都做了些什么操作
在代碼中我們看到了兩個Edit方法,其中一個標記了[HttpPost]屬性,而其中一個沒有,其實系統已經默認為它提供了 [HttpGet]屬性,從生成的代碼注釋中我們也能看得出來;在一般的Web程序來說,Get請求用于讀取數據,而Post用于寫入數據;Post請求通常會改變服務器上的狀態,重復提交Post請求可能會產生重復數據,而Get請求不會改變服務器狀態,所以重復向服務器發送Get請求并不會造成什么影響;關于更多的get和post可以參看這篇文章GET和POST有什么區別
從Get請求的Edit方法中,我們看到它通過傳遞過來的參數(id)從數據庫上下文查找對應的數據,如果有數據就將該數據返回給視圖,在創建視圖的時候通過 @model MvcMovie.Models.Movie 聲明了該視圖指定的類型,并生成該類型的視圖模板;如果沒有查詢到數據的話,它就直接通過HttpNotFound方法返回了一個HttpNotFoundResult對象
對于Post請求的Edit方法來說,它接收了一個對象參數(用戶更新的數據),然后然后對數據進行驗證是否可以更新到數據庫中,最后通過數據上下文的SaveChanges方法更新數據庫中的數據
db.Entry(movie).State = EntityState.Modified;
如果數據通過了驗證,那么通過這行代碼可以告知數據上下文該對象在數據庫中已存在,所以不需要新建一條數據,而是更新舊的數據
文章列表