ASP.NET MVC 学习之路由(URL Routing)

在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请求 来自本地。

示例代码下载

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

时间: 2024-11-01 20:22:26

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

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

原文:ASP.NET MVC学习之路由篇(1) 一.前言 作为一个从ASP.NET转入到ASP.NET MVC的开发人员而言,可能在开发ASP.NET网站的时候就已经开始在使用路由了. 只不过在ASP.NET MVC中路由是关键部分,而在ASP.NET中需要自行加进去.下面我们将学习ASP.NET MVC中的路由 系统. 二.准备工作 1.新建一个ASP.NET MVC4项目 2.模板选择空 3.在Controllers中添加一个Home控制器 4.打开App_Start中的RouteConfi

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

根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 namespace MvcStudy 2 { 3 public class RouteConfig 4 { 5 public static void RegisterRoutes(RouteCollection routes) 6 { 7 routes.Add(new Route("MyTest&q

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

7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法,而不是直接将这个物理文件返回.那么我们就需要这节知识.下面我们先在网站根目录中新建一个 Test.html ,在其中随便写上一些内容,然后访问.再在RouteConfig.cs中写入如下代码: 1 public class RouteConfig 2 { 3 public static void R

ASP.NET MVC学习之路由篇

1.URL路径和路由配置中的路径对比 2.由上面的图,我们可以得出下面的一组路由数据 3.二义性 如果我们在Models中也新建一个Home控制器,那么你会发现重新刷新之后报错了.而这个是因为无法确定到底选择哪个控制器来响应该请求的缘故,当然你认为只要我们不新建重名的控制器就可以了,这样你只能控制你的项目中不出现,但是你却无法控制你加载的类库中不会出现,但是ASP.NET MVC已经提供了解决方案给我们,如下改正 RouteConfig.cs: public class RouteConfig

ASP.NET MVC学习之控制器篇

一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MVC学习之路由篇幅(2) ASP.NET MVC学习之路由篇幅(3) 二.正文 1.IController的使用 这个接口可能很多人都没有使用过,但是我们常用的Controller类实现了这个接口,而且只要实现这个接口就可以作为一个控制器,当然很多的内部的处理就要我们自己去做了. 下面我利用ICont

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

一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发ajax十分的简单,而ASP.NET MVC学习到现在页面都是刷新的,所以这节就是ASP.NET MVC的最后一节,通过这节的学习我们将能够实现通过ajax提交表单,下面我们开始继续学习. 二.准备工作 1.首先确保引用了以下js库在_Layout中: 2.新建一个HomeController,然后在其

跟我学ASP.NET MVC之十一:URL路由

跟我学ASP.NET MVC之十一:URL路由摘要: 在MVC框架之前,ASP.NET假定在请求的URLs和服务器硬盘文件之间有直接的关系.服务器的职责是接收浏览器请求,从相应的文件发送输出. 这种方法只能工作于Web表单,每一个ASPX页面既是一个文件,也是一个对应请求的自包含响应.而这对于MVC应用程序来说就无效了,因为请求是由控制器类里的行为方法处理的,而且没有磁盘上一对一关系的文件. ASP.NET平台使用路由系统处理MVC URLs.在这篇文章中,我将向你展示怎样为你的工程使用路由系统

ASP.NET MVC 学习一之路由

  本次学习的所有开发环境皆为VS2012+MVC4 一:什么是MVC:      假设你是第一次学习MVC,好吧我们不去理解它内部是如何去实现功能的,我们只从它表面的字母意思先去入门理解吧      M:models(模型)  V:view(视图)  C:controllers(控制器)     先不要去纠结这三个字母是什么东西吧,以及这三个东西有什么用!我们所要用的就是先记下这个三个字母!呵呵,是不是有点死记硬背的赶脚,我也是这么觉得的,有点想扔砖的感觉!(麻痹,博主想讲的啥!!!-__-!

ASP.NET MVC 学习

ASP.NET MVC 学习 一. 学习MVC基础 MVC的三个字母分别代表什么意思? M—Model(模型).V—View(视图).C—Controller(控制器) VS2010 中建立MVC应用程序会自动生成哪些文件夹? Controllers – 放置Controller 类,处理URL 请求. Models – 放置业务实体类,表示和操作数据. Views – 放置UI 模板文件,负责展示输出结果. Scripts – 放置Javascript 类库文件和.js 文件. Content