ASP.NET MVC Routing 概述
在本篇教程中,你将会了解到 ASP.NET MVC 中一个重要的组件。这个组件叫做 ASP.NET Routing,它负责将客户端请求的路径映射到特定的一个类(Controller)的一个函数(Action)。并且在教程的结尾,你将会掌握一个标准路由是如何映射到特定类的特定函数。
使用默认的路由表
当你创建一个新的 ASP.NET MVC 应用程序的时候,就已经默认地在两个地方配置了 ASP.NET Routing。
首先,你可以在应用程序的配置文件(Web.config)找到与 ASP.NET Routing 有关的配置。这些节点如下所示:
l system.web.httpModules
l system.web.httpHandlers
l system.webserver.modules
l system.webserver.handlers section
在没有了解他们之前,请不要随意的更改或删除他们,否则可能导致你的应用程序或 ASP.NET Routing无法正常的工作。
其次更为重要的是,一张路由表是在全局文件(Global.asax)中创建的。这个特殊文件包含了ASP.NET 应用程序生命周期以及一些HTTP处理的事件。例如我们关注的路由表就是在 Application_Start事件中创建的。
Listing 1 – ~/Global.asax.cs
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCTestDemo
{
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名
"{controller}/{action}/{id}", // URL参数
new { controller = "Home", action = "Index", id = "" } // 默认值
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
当你的 ASPNET MVC应用程序首次启动的时,Application_Start()将会被系统自动调用。这个函数调用了一个静态函数RegisterRoutes(),从代码中可以看出,这个函数创建了一个路由表。
让我们来分析下 RegisterRoutes() 函数,这个函数包含了一个名为 Default 的路由器,这个路由器映射的第一部分是 Url的 Controller 名称。第二个部分将指示要访问这个 Controller下的哪一个 Action。而最后一个 id,则是指示要传递给 Action 的参数。
想像一下,当你在浏览器中键入如下所示的 URL 地址(除了主机和端口):
/Home/Index/3
聪明的你可能已经看出,这样的地址意味着如下:
controller = Home
action = Index
id = 3
没错,参照上面的代码,当你请求这样的URL时,就是这样的“解释”的。更深一步,这样的URL地址,就像是客户端调用了这样的函数。
HomeController.Index(3)
当然,这样只是一个示例。准确的说,前面的HomeController是一个我们定义的类,这个类包含一个Index( int id ) 函数。当运行的时候,ASP.NET MVC将会实例化一个HomeController,从而调用,并传递参数。
再来尝试一下,当你在请求这样的地址呢?
/Home
很显然,你并没有给予系统Action和id部分。这个时候,我们回顾下上面的Listing 1的代码清单。是的,很清晰的告诉系统:
l 当没有Controller时,将这个部分默认Home;
l 当没有Action时,将这个部分默认Index;
l 最后,当没有给定id时,将会默认一个空的字符串。
如果你没有理解这个部分,你参考下Listing 2的代码。
Listing 2 – ~/Controllers/HomeController.cs
using System.Web.Mvc;
namespace MVCTestDemo.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(string id)
{
return View();
}
}
}
代码 Listing 2 部分,便是ASP.NET MVC 的 C 。C,就是Controller。ASP.NET 的命名规则就是NameController。
请求 /Home/Index/3 这样的 URL ,则调用的是 HomeController.Index( 3 ) 。
同理,倘若请求 /Test/About/3,自然调用的是TestController.About(3)。
不过,当你请求 /Home/Index/3 时,不一定要对这个参数3“负责”。你可以完全无视参数。Listing 3 可以清晰的表示。对于非Controller和Action的部分,你可以选择“爱理不理”。
Listing 3 – ~/Controllers/HomeController.cs
using System.Web.Mvc;
namespace MVCTestDemo.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
根据我们注册的路由表,可以得知:在默认的情况下,当我们请求/Home路径的时候,视同调用了这样的函数(当参数为string数据类型时,参考代码Listing 2):
HomeController.Index(String.Empty)
当然,从字面上可以理解配置的参数(id)明显是一个整型。你完全可以选择使用int来作为数据类型。但是请注意,我们所配置的是一个默认为空字符串的id,如果你仅仅使用整型,将会抛出异常(无法将null转换为Int32),你完全可以使用可空类型(int?)。
转载于:https://www.cnblogs.com/sofire/articles/1603541.html