ASP.NET MVC Routing、Areas、URLs
看看global.asax文件里路由的定义:
复制代码
public static void registerroutes(routecollection routes)
{
routes.ignoreroute("{resource}.axd/{*pathinfo}");
routes.maproute(
"default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 url
new { controller = "home", action = "index", id = urlparameter.optional } // 参数默认值
);
}
复制代码
注释掉这个默认的路由,自己重新定义一个路由:
根据vs的只能提示可以看出参数一个是路由名称,一个是路由的模式,定义为这样:
routes.maproute("myroute", "{controller}/{action}");
有了路由了就可以去创建控制器了,新建一个homecontroller:
复制代码
public class homecontroller : controller
{
public actionresult index()
{
return view();
}
}
复制代码
再去创建一个对应的view:
复制代码
@{
layout = null;
}
<!doctype html>
<html>
<head>
<title>index</title>
</head>
<body>
<p>
homecontroller下的index action响应的同名视图index
</p>
</body>
</html>
复制代码
直接运行程序发现报404错误,找不到页面。查看下路由就知道了问题:这个路由指定的是url模式是{controller}/{action}的方式,而浏览器里的url却是localhost:****,既没有写controller,也没有写action,显然不符合路由的定义,自然得报404错了。把url补充完整就可以找到页面了:localhost:****/home/index,当然如果在url后面少一级或者多加一级都会报404错:localhost:****/home、localhost:****/home/index/1,可见url必须严格根据路由的定义来。
当然,也可以在路由定义的时候就给默认值:
routes.maproute("myroute", "{controller}/{action}", new { controller = "home", action = "index" });
这样运行程序就不报错了:localhost:****,根据路由给的默认值就相当于:localhost:****/home/index
再看这两条路由的定义:
routes.maproute("", "customers/{controller}/{action}");
routes.maproute("", "x{controller}/{action}");
第一条路由对应的url是这样的:localhost:****/customers/home/index
第二条是:localhost:****/xhome/index
区别:第一条是静态的路由,第一级目录必须是路由里指定了的customers,而第二条路由则是动态可变的,第一级只要以x开头都可以和本路由匹配上
路由的顺序:
如果同时定义了这么两条路由:
routes.maproute("myroute", "{controller}/{action}");
routes.maproute("", "x{controller}/{action}");
现在浏览器有这么条url请求过来了:localhost:****/xhome/index 看到xhome好像得使第二条路由了,但是不是。这条url同时符合两条路由就优先使用前面的路由。根据第一条路由,这条url过去就是找xhome这个控制器controller里的index action
混合的静态路由,带默认值:
routes.maproute("shopschema", "shop/{action}", new { controller = "home" });
这条名为shopschema的路由没有定义controller,而是给了一个默认值home,但是如果直接请求localhost:****/home/index 虽然有homecontroller,但是还是会报404,因为路由已经限制了controller部分必须是shop,所以url得是这样:localhost:****/shop/index,虽然没有shopcontroller,但是同样会导向到homecontroller下。
注:为了演示路由效果,防止前面定义的路由影响到url请求的控制器,所以得先把之前的所有路由都注释了再运行查看效果。
routes.maproute("shopschema2", "shop/oldaction", new { controller = "home", action = "index" });
url:localhost:1042/shop/oldaction 找的同样是homecontroller下的index这个action
定义额外的参数:
路由当然不光可以定义controller和action,同时也可以定义之后的参数,比如:
routes.maproute("myroute", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = "10086" });
在控制器下可以这么拿到传进来的id参数:viewbag.customvariable = routedata.values["id"];
视图view中这么调用:@viewbag.customvariable
{controller}/{action}/{id} 对应的url是这样的:localhost:****/home/index/10010 视图中输出:10010
当然,因为路由给了默认值,所有一下url都可以:
localhost:****
localhost:****/home
localhost:****/home/index 输出的都是:10086
可选参数:
routes.maproute("myroute", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = urlparameter.optional });
optional这个在ef配置实体之间的一对一、一对多等关系里演示过,表示可选的意思,这里的路由也是一样,表示id部分就是可选的:
localhost:**** => controller = home action = index
localhost:****/customer => controller = home action = index
localhost:****/customer/list => controller = home action = index
localhost:****/customer/list/all => controller = home action = index id = all
可变长度的路由:
routes.maproute("myroute", "{controller}/{action}/{id}/{*catchall}", new { controller = "home", action = "index", id = urlparameter.optional });
localhost:**** => controller = home action = index
localhost:****/customer => controller = home action = index
localhost:****/customer/list => controller = home action = index
localhost:****/customer/list/all => controller = home action = index id = all
localhost:****/customer/list/all/delete => controller = home action = index id = all catchall = delete
localhost:****/customer/list/all/delete/perm => controller = home action = index id = all catchall = delete/perm
指定命名空间:
routes.maproute("myroute", "{controller}/{action}", new { controller = "home", action = "index" });
下一篇: 百度快捷下载安装教程第一时间上百度首页
推荐阅读
-
ASP.NET MVC Routing、Areas、URLs
-
解读ASP.NET 5 & MVC6系列教程(12):基于Lamda表达式的强类型Routing实现
-
解读ASP.NET 5 & MVC6系列教程(11):Routing路由
-
详解ASP.NET Core MVC 源码学习:Routing 路由
-
ASP.NET MVC3 SEO优化:利用Routing特性提高站点权重
-
ASP.NET MVC Routing、Areas、URLs
-
详解ASP.NET Core MVC 源码学习:Routing 路由
-
ASP.NET Core MVC学习教程之路由(Routing)
-
[Asp.net MVC]Asp.net MVC5系列——Routing特性
-
asp.net MVC把Areas区域绑定成二级域名