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;

  如果数据通过了验证,那么通过这行代码可以告知数据上下文该对象在数据库中已存在,所以不需要新建一条数据,而是更新旧的数据

  http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view

  

 

你可能感兴趣的:(ASP.NET MVC系列:控制器的Edit方法)