在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. 为jQuery的$.ajax设置超时时间

    jQuery的ajax模块封装了非常强大的功能,有时候我们在发送一个ajax请求的时候希望能有一个超时的时间,想让程序在一段时间请求不到数据时做出一些反馈.幸运的是jQuery为我们提供了这样的参数: ...

  2. 项目开发之使用 maven

    本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...

  3. Unity3D热更新全书-脚本(三) C#LightEvil语法与调试

    调试,这是一个无法规避的问题 C#Light 由于有 词法解释.语法解释.运行时三种情况 所以和C#也是有类似的问题 出错大致可以分为编译错误和运行时错误 拼写出莫名的东西或者语法不正确,会在编译阶段 ...

  4. 自定义Image自动切换图像控件

    做这么一个控件,图片自动切换,形成动画效果. 随便的码码,码完发现东西太少了,不过还算完善. public class MyPictureBox : PictureBox { Timer timer ...

  5. java基础—继承题目:编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish

    编写一个Animal类,具有属性:种类:具有功能:吃.睡.定义其子类Fish package zhongqiuzuoye; public class Animal { //属性 private Str ...

  6. JavaScript 模板引擎实现原理解析

    1.入门实例 首先我们来看一个简单模板: <script type="template" id="template"> <h2> < ...

  7. Android入门(十七)Android多线程

    原文链接:http://www.orlion.ga/670/ 一.在子线程中更新UI Android中不允许在子线程中更新UI,只能在主线程中更新,但是我们有时候必须在子线程中执行一些耗时的任务,然后 ...

  8. 前端学PHP之基础语法

    × 目录 [1]代码标识 [2]注释 [3]输出 [4]计算表达式 [5]大小写 [6]空白符 前面的话 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言.PHP能够包含文本.HTML.CSS ...

  9. NodeJs连接Oracle数据库

    nodejs连接oracle数据库,各个平台的官方详情文档:https://github.com/oracle/node-oracledb/blob/master/INSTALL.md 我的nodej ...

  10. Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC不仅是在架构上改变了项目,使代码变得可复用.可维护与可扩展,其实在功能上也加强了不少. 验证与文件上传是许多项目中不可缺少的一部分.在项目中验证非常重要,首先是安全性考虑,如防止注 ...