今天有时间认真来学习mvc,记录一点基础的知识。
1. Global.asax.cs文件夹中的一个RegisterRoutes()方法,如下图定义。
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 "Default", // 路由名称 7 "{controller}/{action}/{id}", // 带有参数的 URL 8 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 9 ); 10 11 }
其中id是定义网址路径如何对应MVC参数。
MapRoute() 方法是定义MVC网址路由最主要的方式。每一特路由都定义了一下3个参数。
- 路由名称。
- 对网址路径如何对应到控制器、动作与路由值的设定。
- 控制器、动作和其他路由值的默认值。
通过这个默认的MapRoute()方法可以得知,在浏览器地址栏输入"http://localhost/Home/About"时,通过Routing的对应,由于网址路径一部分为"Home/About",所以会对应出"{controller}"为"Home","{action}"为"About"。因此,MVC会先进入"Controllers"目录,找到Home控制器(也就是HomeController.cs文件),然后再找到这个控制器内的About公开方法(Public Method)。这个公开方法就是MVC的Action,也是实际执行网页主要 程序的入口。
TIP:在定义Routing时,你可能会注意到有一堆大括号"{}"包裹着一个变量,这个变量就是路由变量。在所有路由变量中最重要的就是controller变量和action变量,而且它们必须存在。就算没有设置网址路径,也必须制定路由变量的默认值才能使MVC正常运作。这两个变量在执行MVC动作时,会先被传送到System.Web.Mvc.MvcHandler类中,然后再被传送到DefaultControllerFactory类中,以建立Controller实体并执行制定的Action。其他的路由变量则可以由你自定义,而且也能被适当的用于Action中。
2.HomeController类的默认内容,如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace MvcApplication1.Controllers 8 { 9 [HandleError] 10 public class HomeController : Controller 11 { 12 public ActionResult Index() 13 { 14 ViewData["Message"] = "欢迎使用 ASP.NET MVC!"; 15 ViewData["data"] = "小猫咪~ 喵喵~"; 16 return View(); 17 } 18 19 public ActionResult About() 20 { 21 return View(); 22 } 23 } 24 }
Controller类在开发的时候必须符合一下规范。
- 类名称一定要以"Controller"结尾,例如"GuestbookController"代表Guestbook控制器。
- 继承于Controller基类(或实现IController接口的类)。
- 类中须包含数个返回值为"ActionResult"的公开方法,这些方法在MVC中称为Action。
在默认的Index动作中,第一行的"ViewData"表示一个Dictionary对象,可以再View中读取改对象被设定的数据,示例如下:
ViewData["Message"] = "欢迎使用 ASP.NET MVC!";
利用VS功能新建切换至改动作的试图。如图:
我们看到ViewData["Message"]对象被设定对了一个字符串。
而在此试图中通过以下语法将数据读出并显示在网页中。
<%: ViewData["Message"] %>
TIP: "<%: ViewData["Message"] %>"语法是在Asp.NET 4.0中新增加的。在此之前的版本中,可以用"<% =Html.Encode(ViewData["Message"]) %>"语法替代它。这两种语法输出的结果完全相同。