ASP.NET MVC系列:控制器的Edit方法
在前面我们已经介绍了如何创建控制器、视图和数据模型,运行之前的项目并打开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;
如果数据通过了验证,那么通过这行代码可以告知数据上下文该对象在数据库中已存在,所以不需要新建一条数据,而是更新旧的数据