什么是路由

通过【路由】配置,路由可以规定URL的特殊格式,使其达到特殊效果。

在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法中,执行相应操作,并接受URL中传过来的参数,

在MVC5框架中,在【RouteConfig.cs】类中进行路由规则的配置

 public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

参数的含义

(1) name:  要映射的路由的名称。

(2) url:  路由的 URL 模式,可以自定义路由的格式,可以写静态路由,也可以写动态路由、组合路由等。

(3) defaults:  一个包含默认路由值的对象,书写路由的默认值。

(4) constraints: 一组表达式,可以使用正则指定 url 参数值的约束。

(5) namespaces: 应用程序的一组命名空间,可以缩小检索路由对象匹配的范围。

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
{
if (routes == null)
{
throw new ArgumentNullException("routes");
}
if (url == null)
{
throw new ArgumentNullException("url");
}
Route route = new Route(url, new MvcRouteHandler()) {
Defaults = CreateRouteValueDictionaryUncached(defaults),
Constraints = CreateRouteValueDictionaryUncached(constraints),
DataTokens = new RouteValueDictionary()
};
ConstraintValidation.Validate(route);
if ((namespaces != null) && (namespaces.Length > ))
{
route.DataTokens["Namespaces"] = namespaces;
}
routes.Add(name, route);
return route;

MVC中的几类路由及其规则

 动态路由

        routes.MapRoute(
name: "Default", //路由名称
url: "{controller}/{action}/{id}", //路由规则
defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional } //默认值,当Controller或action为空(省略)的时候调用
);

静态路由

        routes.MapRoute(
name: "Default2", //路由名称
url: "Ypf", //路由规则,不区分大小写,当输入“ypf”时,会自动跳转到下面的地址
defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional } //默认值,当Controller或action为空的时候调用
);

组合路由

       routes.MapRoute(
"Default4", //路由名称
"Ypf/{action}", //路由规则,不区分大小写,规则相符的时候,会自动跳转到下面的地址
new { controller = "First", action = "Index1" }
);

正则约束

        routes.MapRoute(
"Default5",
"{controller}/{action}_{Year}_{Month}_{Day}",
new { controller = "First", action = "Index1", id = UrlParameter.Optional },
new { Year = @"^\d{4}", Month = @"\d{2}", Day = @"\d{2}" }
);//正则路由

所谓的正则约束,是指可以对URL中的参数使用正则表达式进行约束,上述代码约束了Year必须是四位数字,Month和Day必须是两位数字。

 命名空间约束

         routes.MapRoute(
name: "Default6",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Third", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "Ypf.MVC5" }
);

所谓的命名空间约束,即限定匹配范围路由的检索范围,提高检索速度。

特别注意:不能从外层控制器直接跳转到内层Area内的控制器!!

Area区域内的路由

public override void RegisterArea(AreaRegistrationContext context)
{
//原路由
//context.MapRoute(
// "TestOne_default",
// "TestOne/{controller}/{action}/{id}",
// new { action = "Index", id = UrlParameter.Optional }
//); //结合命名空间进行路由改造
context.MapRoute(
this.AreaName + "_default",
this.AreaName + "/{controller}/{action}/{id}",
new { area = this.AreaName, controller = "Sys_Admin", action = "Index", id = UrlParameter.Optional },
new string[] { "Ypf.MVC5.Areas." + this.AreaName + ".Controllers" }
); }

其他

1.URL路径和路由配置中的路径对比

2.由上面的图,我们可以得出下面的一组路由数据

 3.二义性

如果我们在Models中也新建一个Home控制器,那么你会发现重新刷新之后报错了。而这个是因为无法确定到底选择哪个控制器来响应该请求的缘故,当然你认为只要我们不新建重名的控制器就可以了,这样你只能控制你的项目中不出现,但是你却无法控制你加载的类库中不会出现,但是ASP.NET MVC已经提供了解决方案给我们,如下改正

RouteConfig.cs:

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MvcStudy.Controllers" }
);
}
}

我们可以看到namespaces参数,通过将命名空间的名称传进去就可以起到排除二义性的问题了。

 4.约束路由

上面我们有一个{id}用来捕获参数的,但是你也发现了它可以捕捉任何字符串等等,但是我们有时需要限制它,比如让它只能输入数字,那么我们就可以使用正则表达式去约束它。

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new{id = @"^\d*$"},
namespaces: new[] { "MvcStudy.Controllers" }
);
}
}

5.URL路由机制

6.MVC Area出现找到多个与名为Home的控制器匹配的类型错误的解决方法

第一种方式:在RouteConfig中添加路由

 public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Admin",
url: "Admin/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "ASP.NETMVCProject.Areas.Admin.Controllers" }//添加命名空间
); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "ASP.NETMVCProject.Controllers" }//添加命名空间
);
}
}

第二种方式:在AdminAreaRegistration中添加命名空间

public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
} public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "ASP.NETMVCProject.Areas.Admin.Controllers" }//添加命名空间
);
}
}

7.显示禁用路由

 8.自定义路由

routes.MapRoute(
"Detail",// Route name
"Expert/Detail/{q}.htm",// URL with parameters
new { controller = "Expert", action = "Detail", q = "" }// Parameter defaults
);

ASP.NET MVC学习(一)之路由篇Route的更多相关文章

  1. ASP.NET MVC学习之模型验证篇

    一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们.慢慢的已经在博客园中度过一年半了,伊始只是将博客园作为自己学习的记录本一样使用,也不敢将自己的随笔发表到博客园首页,生怕自己的技艺不高,反 ...

  2. ASP.NET MVC学习之模型模板篇

    一.前言 如果你使用ASP.NET MVC制作后台一定会爱上它的EditorForModal.DisplayForModal和LabelForModal方法,因为这些方法可以将模型直接变成对应的标签, ...

  3. ASP.NET MVC学习之Ajax(完结)

    一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...

  4. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  5. ASP.NET MVC学习之控制器篇

    一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...

  6. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  7. ASP.NET MVC学习之控制器篇扩展性

    原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名 ...

  8. ASP.NET MVC学习之视图篇(2)

    继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...

  9. (转)ASP.NET MVC 学习第一天

    天道酬勤0322   博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习as ...

  10. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

随机推荐

  1. centos 7部署ELK

    一.ELK介绍 Elasticsearch 是基于 JSON 的分布式搜索和分析引擎,专为实现水平扩展.高可用和管理便捷性而设计.Logstash 是动态数据收集管道,拥有可扩展的插件生态系统,能够与 ...

  2. RPG游戏开发基础教程

    RPG游戏开发基础教程 第一步 下载RPG Maker 开发工具包 1.RPG Maker 是什么? RPG Maker 是由Enterbrain公司推出的RPG制作工具. 中文译名为RPG制作大师. ...

  3. 微软职位内部推荐-SW Engineer II for WinCE

    微软近期Open的职位: Do you have a passion for embedded devices and services? &nbsp Does the following m ...

  4. 主流蓝牙芯片盘点,Nordic/TI/博通哪家强?

    无线通信技术自19世纪中期诞生以来,从使用狼烟.火炬.闪光镜.信号弹等在视距内传输信息,到1838年塞缪尔・莫尔斯发明电报网,再到电报网被电话取代,再到几十年后的1895年马可尼首次从英国怀特岛到30 ...

  5. Final互评------《弹球学成语》---- 杨老师粉丝群

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题;  N(Need,需求):本产品面相青少年及小学生,基于这些用户数量再加上一些休闲玩家,需求量还是比较大的.   A ...

  6. alpha发布排序结果

    友组所做排序 其中有一组是教师排序. 序号 组名 组长 项目简称 匿名1组 匿名2组 匿名3组 匿名4组 匿名5组 匿名6组 匿名7组 匿名8组 平均 1 新蜂 武志远 俄罗斯 2 3 3 4 4 5 ...

  7. LINUX内核分析第六周学习总结——进程的描述和进程的创建

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  8. RYU 灭龙战 third day

    RYU 灭龙战 third day 前言 传统的交换机有自学习能力.然而你知道在SDN的世界里,脑子空空的OpenFlow交换机是如何学习的吗?今日说法带你领略SDN的mac学习能力. RYUBook ...

  9. Team抢救最后一下

    Team抢救最后一下 Task1:Team抢救的总结 秦玉:       非常荣幸能以团队的方式获得这次的小黄衫,这件衣服的意义不仅是这门课的奖励,也会是我们整个抢救团队的一个见证和回忆~       ...

  10. final评论1

    1-约跑APP 小组准备的非常的充分,还带了摄像头,发布过程清晰.团队的约跑项目界面相较于Beta版本进行了美化,增加了背景图片,使项目看起来更美观.同时项目支持聊天信息的接收和发送,个人觉得他们组的 ...