在上一篇的文章中,我们大概理解MVC 的模式后,我们应该是从基础入手:

1.我们先理解一下程序的入口

使用了URL重写. ASP.NET中叫做UrlRouting,对应的程序集是System.Web.Routing, 打开项目的Global.asax.cs文件, 会找到我们建立的页面重写规则

publicstaticvoidRegisterRoutes(RouteCollectionroutes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default",//Routename"{controller}/{action}/{id}",//URLwithparametersnew{controller="Users",action="Index",id=UrlParameter.Optional}//Parameterdefaults);}protectedvoidApplication_Start(){AreaRegistration.RegisterAllAreas();System.Data.Entity.Database.SetInitializer(newMvcApplication1.Models.UsersInitializer());RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);}

2.查找 Controller

在Controllers文件夹下我们可以找到UsersController.cs, 这里使用了一个约定, 就是如果URL中获取到的Controller名字是Users, 则他的Controller类名就是UsersController. 在URL中的名字后加上”Controller”.

实例中Controller都放在Controllers文件夹, 所以我们可以按照命名约定很容易就可以找到HomeController类

3.查找 Action

一个Controller可以包含多个Action, MVC模式中Controller角色的具体实现逻辑都是在Action中的.

因为我们的Action是Index, 所以自然就要调用Index()方法.这里将"Webcome to ASP.NET MVC!",

privateUsersDbContextdb=newUsersDbContext();////GET:/Users/publicViewResultIndex(){returnView(db.Users.ToList());}////GET:/Users/Details/5publicViewResultDetails(intid){Usersusers=db.Users.Find(id);returnView(users);}////GET:/Users/CreatepublicActionResultCreate(){returnView();}////POST:/Users/Create[HttpPost]publicActionResultCreate(Usersusers){if(ModelState.IsValid){db.Users.Add(users);db.SaveChanges();returnRedirectToAction("Index");}returnView(users);}////GET:/Users/Edit/5publicActionResultEdit(intid){Usersusers=db.Users.Find(id);returnView(users);}////POST:/Users/Edit/5[HttpPost]publicActionResultEdit(Usersusers){if(ModelState.IsValid){db.Entry(users).State=EntityState.Modified;db.SaveChanges();returnRedirectToAction("Index");}returnView(users);}////GET:/Users/Delete/5publicActionResultDelete(intid){Usersusers=db.Users.Find(id);returnView(users);}////POST:/Users/Delete/5[HttpPost,ActionName("Delete")]publicActionResultDeleteConfirmed(intid){Usersusers=db.Users.Find(id);db.Users.Remove(users);db.SaveChanges();returnRedirectToAction("Index");}protectedoverridevoidDispose(booldisposing){db.Dispose();base.Dispose(disposing);}

4.查找view 视图

View方法中可以带一个名字, 这个名字就是View的名字.如果把index改成Edit,那么访问/Users/Edit就会跳转到Edit页!

5. 页面展示

接下来ViewEngine即页面引擎会将aspx中的HTML部分以及上面的数据部分和在一起返回给浏览器.

关于View对象我注意到此页面是继承自System.Web.Mvc.ViewPage而不是直接继承自System.Web.UI.Page, 而这个ViewData对象就是ViewPage中的一个属性. 这里的ViewData一定是页面级别的,当页面编译完毕这个对象就会被注销(HTTP是无状态的协议,每次请求其实都是生成一个新的ViewPage对象).

@modelIEnumerable<MvcApplication1.Models.Users>@{ViewBag.Title="Index";}<h3>Index</h3><p>@Html.ActionLink("CreateNew","Create")</p><table><tr><th>UserID</th><th>UserName</th><th>Password</th><th>RegTime</th><th>IsTest</th><th>IsEnable</th><th></th></tr>@foreach(variteminModel){<tr><td>@Html.DisplayFor(modelItem=>item.UserID)</td><td>@Html.DisplayFor(modelItem=>item.UserName)</td><td>@Html.DisplayFor(modelItem=>item.Password)</td><td>@Html.DisplayFor(modelItem=>item.RegTime)</td><td>@Html.DisplayFor(modelItem=>item.IsTest)</td><td>@Html.DisplayFor(modelItem=>item.IsEnable)</td><td>@Html.ActionLink("Edit","Edit",new{id=item.ID})|@Html.ActionLink("Details","Details",new{id=item.ID})|@Html.ActionLink("Delete","Delete",new{id=item.ID})</td></tr>}</table>效果图: