在ASP.NET MVC中,一个URL请求是由对应的一个Controller中的Action来处理的,由URL Routing来告诉MVC如何定位到正确的Controller和Action。

默认路由表

当我们在VS中创建一个新的 ASP.NET MVC程序,程序将会自动使用默认的路由表。

        public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",//默认路由名称
url: "{controller}/{action}/{id}",//URL 和参数
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }//默认参数
);
}

上面的代码是向路由表添加一个名为(Default)的路由。

url 中

{controller} 对应的也就是控制器名称,

{action} 对应的是控制器中的action,

{id} 对应为参数,

defaults 为默认值 controller = "Home"  action = "Index" 。

当你在地址栏输入/Home 因为action 有对应的默认值 ,程序也就会执行HomeController.Index()。

当你在地址栏输入/Home/Index/6 时,路由会自动对应参数

controller = Home

action = Index

id = 6

程序也就会去执行 HomeController.Index(6)。

示例展示:

上面的静态方法RegisterRoutes是在Global.asax.cs文件中的Application_Start方法中被调用的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing; namespace MvcApplication
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
}

同时也包含了其他的一些方法。

自定义路由表

下面增加一个自己定义的路由表

        public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",//默认路由名称
url: "{controller}/{action}/{id}",//URL 和参数
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },//默认参数
constraints: new { action = @"[a-zA-Z]+" }//只匹配字母
); routes.MapRoute(
name: "MyRoute",//路由名称
url: "News/{newsid}",//URL不带参数
defaults: new { controller = "News", action = "Index" },//默认指定action到Index
constraints: new { newsid = @"\d+" }//newsid必须为数字
);
}

当你在地址栏输入/News/Index?newsid=1 和 /News/1 效果是一样的。

访问/News/1 它会默认 访问 controller=News  action=Index 然后参数为1 。

我把默认的路由规则,加了一下限制,让其action 只执行字母,以免覆盖新加的路由规则。

这样我们可以缩短URL 地址,让URL 更加直观友好。

路由约束:

正则表达式约束

通过正则来约束相关路由规则。

routes.MapRoute(
name: "MyRoute",//路由名称
url: "News/{newsid}",//URL不带参数
defaults: new { controller = "News", action = "Index" },//默认指定action到Index
constraints: new { newsid = @"\d+" }//newsid必须为数字
);

上面为约束 newsid为 数字。

routes.MapRoute(
name: "Default",//默认路由名称
url: "{controller}/{action}/{id}",//URL 和参数
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },//默认参数
constraints: new { action = @"[a-zA-Z]+" }//只匹配字母
);

上面为约束 action 只为字母,不允许其他规则。

Http请求方式约束

            routes.MapRoute(
name: "MyRoute",//路由名称
url: "News/{newsid}",//URL不带参数
defaults: new { controller = "News", action = "Index" },//默认指定action到Index
constraints: new { newsid = @"\d+", httpMethod = new HttpMethodConstraint("POST") }//newsid必须为数字 并且请求必须为POST
);

上面为约束 http请求 为POST

自定义路由约束

如果标准的路由约束满足不了你的需求,那么可以通过实现 IRouteConstraint 接口来定义自己的路由约束规则。

下面就是实现了一个请求是否来自本地的约束。

public class LocalhostConstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
return httpContext.Request.IsLocal;
}
}

在路由表中的应用:

routes.MapRoute(
name: "Default",//默认路由名称
url: "{controller}/{action}/{id}",//URL 和参数
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },//默认参数
constraints: new { action = @"[a-zA-Z]+", isLocal = new LocalhostConstraint() }//只匹配字母 并且请求只允许本地
);

上面为约束 http请求 来自本地。

示例代码下载

如果你觉得本文对你有帮助,请点击“推荐”,谢谢。

ASP.NET MVC 学习之路由(URL Routing)的更多相关文章

  1. ASP.NET MVC学习之路由篇(3)

    根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 ...

  2. ASP.NET MVC学习之路由篇(2)

    7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法, ...

  3. ASP.NET MVC学习之路由篇(1)

    1.基本路由 RouteConfig.cs: 1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteColle ...

  4. ASP.NET MVC学习之路由篇

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

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

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

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

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

  7. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  8. ASP.NET MVC的运行机制--url的全局分析

    全局 首先我们来看一副图片       首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...

  9. 【翻译】ASP.NET MVC 5属性路由(转)

    转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...

随机推荐

  1. MySQL--使用xtrabackup进行备份还原

    使用rpm包安装xtrabackup ## 安装依赖包 yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl- ...

  2. Linux head和tail命令

    200 ? "200px" : this.width)!important;} --> 介绍 head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. ...

  3. django开发个人简易Blog——数据模型

    提到数据模型,一定要说一下MVC,MVC框架是现代web开发中最流行的开发框架,它将数据与业务逻辑分开,减小了应用之间的高度耦合.个人非常喜欢MVC开发框架,除了具有上述特性,它使得web开发变得非常 ...

  4. 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现

    [OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球 (本文PDF版在这里.) 在3D程序中,轨迹球(ArcBall)可以让你只用鼠标来控制模型(旋转),便于观察.在这里(http://w ...

  5. Azure China (9) 在Azure China配置CDN服务

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China Update 2015-11-20:Azure China CDN服 ...

  6. 基于Task的异步模式--全面介绍

    今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...

  7. 我心中的核心组件(可插拔的AOP)~调度组件quartz.net续~任务管理器的开发

    回到目录 对于任务调度来说,越来越多的团队选择了quartz,它在java和.net环境下表现都十分优秀,配置简单,功能强大,时间表达式配置灵活,但在使用时,还是感觉缺点什么,怎么说,你在服务器上安装 ...

  8. Atitit 教育与培训学校 的计划策划 v2

    Atitit 教育与培训学校 的计划策划 1. 历史大趋势,教育的普及化1 2. 我们的目标,人人可以接受硕士博士教育,确保全球60亿人的普世化教育1 3. 学校的注册,可以选择在全球费用最优惠的地方 ...

  9. 一条Select语句丛生到死的处理过程

    以一条普通的“select * from table order by …”语句为例.图2-21中显示为该语句在数据库中各个组件之间的处理过程,各个步骤分别代表: (1)select语句通过网络传送给 ...

  10. fir.im Weekly - 600个 Android 开源项目汇总

    本期 Weekly 收集了一些热度资源,包含 Android.iOS 开发工具与源码分享,程序员也应该了解的产品运营.设计等 Tips ,希望对你有帮助. 600个Android开源项目汇总 勤劳的 ...