以上是默认的情况, 执行顺序我们这样理解:
1:首先定位到HomeController类。
2:然后定位到Index方法。
关于类的映射:
路由设置中,controller = "Home" 会映射到HomeController类, 而HomeController类的类名,我们需要拆分为两个单词去理解: "Home"+"Controller"。 路由会查找到前面的那个词语,并绑定之,在这里是属于名称半匹配。
关于方法的映射:
action = "Index" 映射到 Index 方法,是属于全名匹配。
默认的例子可能会带来一个误会:让我们认为 "{controller}/{action}/{id}" ,这条规则一定会匹配 HomeController 类,实际不是这样。
我们在 Controllers 文件夹中添加一个另一个Controller类:TagsController
public class TagsController : Controller
{
//
// GET: /Tags/
public ActionResult Index()
{
return View();
}
}
并且添加对应的View:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
this is tags
</div>
</body>
</html>
然后在浏览器中输入: http://localhost:13812/tags/index/2 ,主机名称部分根据你的实际情况修改,关键是后面的/tags/index/2
看到了不? 浏览器中显示的是我们新添加的View的内容。
所以: 路由的匹配是动态的,它绑定的只是某一条地址规则: {controller}/{action}/{id}
地址中的 controller 部分你输入 home,它就映射到 homecontroller ,你输入tags, 它就映射到tagscontroller (只要它们已经存在就行)
action部分也是一样的道理,如果你输入 /home/about, 那么它就映射都homecontroller类的abut方法。
但是执行顺序是一定的: 首先映射类,然后映射方法。
然后我们来说说路由设置中的的那个匿名对象, 它的作用是指定默认情况下应该映射到哪个类的哪个方法,什么是默认情况呢? 看下面的地址:
/home
/hone/index
/home/index/1
它们都会映射到:controller = "Home", action = "Index"
如果我们把匿名对象去掉,把路由修改成这样:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}"
);
这时候我们就只能访问 /home/index/1 ,也就是/类名/方法名/id,三个参数一个都不能少,id可以修改为任意字符串 。 因为此时就是严格匹配路径参数