ASP.NET MVC 入门3、Routing

本系列文章基于Microsoft ASP.NET MVC Beta.

在一个route中,通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候,符号"/"和"."被作为一个定义符来解析,而定义符之间的值则匹配到占位符中。route定义中不在大括号中的信息则作为常量值。
下面是一些示例URL:

Valid route definitions

Examples of matching URL

{controller}/{action}/{id}

/Products/show/beverages

{table}/Details.aspx

/Products/Details.aspx

blog/{action}/{entry}

/blog/show/123

{reporttype}/{year}/{month}/{day}

/sales/2008/1/5

 通常,我们在Global.asax文件中的Application_Start事件中添加routes,这确保routes在程序启动的时候就可用,而且也允许在你进行单元测试的时候直接调用该方法。如果你想在单元测试的时候直接调用它,注册该routes的方法必需是静态的同时有一个RouteCollection参数。
下面的示例是Global.asax中的代码,演示了添加一个包含两个URL参数action 和 categoryName的Route对象:

复制代码
public static void RegisterRoutes(RouteCollection routes)
{
    
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
        
"Category",                                              // Route 的名称
        "Category/{action}/{categoryName}",                           // 带有参数的URL
        new { controller = "Category", action = "Index", categoryName = "4mvc" }  // 设置默认的参数
    ); 



protected void Application_Start()
{
    
//在程序启动的时候注册我们前面定义的Route规则
    RegisterRoutes(RouteTable.Routes);
}
复制代码

更多文章请参考:

  • System.Web.Routing入门及进阶 下篇 By 重典
  • System.Web.Routing入门及进阶 上篇 By 重典
  • ASP.NET MVC URL Routing 学习 By Q.Lee.lulu
  • ASP.NET Routing (官方文档)

    在这里我不打算再详细去讲解。以下只是简单的说明一下。

    忽略对某类URL的Routing:

     

        //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     

    添加约束条件,支持正则表达式。例如我们需要对id参数添加一个必须为数字的条件:

    routes.MapRoute(
        
    "Default",                                              
        
    "{controller}/{action}/{id}",                           
        
    new { controller = "Home", action = "Index", id = "" },  
        
    new { id = @"[\d]*" } //id必须为数字
    ); 

     

    使用星号(*)匹配不确定个数的参数,这会匹配URL后面所有的剩余的参数。例如:

    query/{queryname}/{*queryvalues}

    对于url:query/aspnetmvc/preview5/routing ,则queryvalues参数匹配的参数为 preview5/routing。

    url匹配Route是根据Route的定义顺序来自上而下匹配的。例如我们定义两个Route:

    复制代码
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            
    "Default",                                              // Route 的名称
            "{controller}/{action}/{id}",                           // 带有参数的URL
            new { controller = "Home", action = "Index", id = "" }  // 设置默认的参数
        );
        routes.MapRoute(
            
    "Post",
            
    "Post/{id}",
            
    new { controller = "Post", action = "Index", id = "" }
        );
    复制代码

    不知你看出上面定义的两个Route有什么问题没有?我想你看出来了,URL永远都匹配不了第二个Route,也就是名为Post的Route,因为能匹配第二个Route的url一样也能匹配第一个Route,而url匹配Route是根据Route的定义顺序来自上而下匹配的,所以URL永远都匹配不了第二个Route。所以,在定义Route的时候,要将一些特别的Route放到前面。

    如果你要将ASP.NET MVC部署到IIS6下面,由于IIS6对于http://blog.51mvc.com/index这类没有扩展名的URL是不会交由ASP.NET的aspnet_isapi.dll处理的,所以你的ASP.NET MVC程序部署到IIS6的时候可能会出现404错误。你可以为你的ASP.NET MVC站点添加一个通配符:

    image

    然后点击"通配符应用程序映射"下的"插入"按钮,在弹出的对话框中如下设置:

    image

    你如果担心添加通配符会给出现性能上的问题,那么你可以修改Route为带扩展名的,这个扩展名是完全由你自己定义的,例如我们使用4mvc来做url的扩展名:

    routes.MapRoute(
        
    "Default",                                              // Route 的名称
        "{controller}.4mvc/{action}/{id}",                           // 带有参数的URL
        new { controller = "Home", action = "Index", id = "" }  // 设置默认的参数
    ); 

     

    然后再在IIS6中添加这个扩展名的映射:

    image

    然后我们访问的URL类似于:http://blog.51mvc.com/Home.4mvc/index

    群上有些朋友说希望教程能根据一个示例程序来写,那样更容易他们的学习。所以这里就写一个Blog的示例程序,为了方便,Model就直接使用Blogengine的业务实体部分。在这里我们先定义这个blog的Route:


    public static void RegisterRoutes(RouteCollection routes)
    {
        
    //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

        routes.MapRoute(
            
    "Admin",
            
    "Admin/{action}",
            
    new { controller = "Admin", action = "Index" }
        ); 

        routes.MapRoute(
            
    "PostById",
            
    "Post/{id}",
            
    new { controller = "Home", action = "Post", id = "" },
            
    new { id = @"[\d]+" }
        ); 

        routes.MapRoute(
            
    "PostBySlug",
            
    "Post/{slug}",
            
    new { controller = "Home", action = "Post" }
        ); 

        routes.MapRoute(
            
    "Default",                                              // Route 的名称
            "{controller}/{action}/{id}",                           // 带有参数的URL
            new { controller = "Home", action = "Index", id = "" }  // 设置默认的参数
        ); 

    }
     

     

    暂时就学到这里吧。后面我会给出本示例Blog程序的代码。Enjoy!Post by Q.Lee.lulu。

楼主,我这有个急需解决的问题想请救你. 
我的view下面有个admin文件夹,在admin下面可能还有子文件夹或者是孙文件夹,那我要怎么配置路由规则才能够让他能正常的指向正确的文件夹下的页面?还有controller文件夹下面的可能有多个文件夹保存不同的控制文件,这些又该如何处理,想尽快知道答案,还请LZ赐教:
这不应该是由路由规则来配置的,而是应该由ViewEngine来控制的。路由规则只是负责把URL路由到指定的Controller,至于Congroller要返回哪一个View,这就不关路由的事了

 

1。关于路由选择:既然是从上到下进行选择,那么定义Route类的名字有什么作用吗?
2。routes.MapRoute(
"PostById",
"Post/{id}",
new { controller = "Home", action = "Post", id = "" },
new { id = @"[\d]+" }
); 

routes.MapRoute(
"Default", // Route 的名称
"{controller}/{action}/{id}", // 带有参数的URL
new { controller = "Home", action = "Index", id = "" } // 设置默认的参数
); 

关于这两个匹配,假如有一个带参数的请求,参数不是整数,是不是先去检查第一个的表达式,不符合再检查第二个。为什么不去Controller中进行参数约定呢?这两种方式哪一种效率高呢?

 

这个方便搜索引擎收录的.更友好的路径

 

#24楼 2012-09-27 12:17 | VAllen 

博主,你的2群加不了。3群被QQ屏蔽了,搜索不到
2群:1214648
3群:47788243

 

#26楼 2013-01-14 00:30 | 规定 

routes.MapRoute(
"Post",
"Post/{id}",
new { controller = "Post", action = "Index", id = "" }
);
为什么就匹配不上呢?第二个参数是URL,反应到网址上就是http://XXXX/Post/??。这是怎么匹配不上的?

 


@ 规定
我也发现了,看到code了之后我就在想,怎么会匹配不到,然后试了一下是可以匹配的。估计LZ说的是http://XXXX/ 这样就永远不会匹配到后面的route。但是这样的话就没意义呢。

仔细想了一下:
我好像明白了,要是route写成这样:

1

2

3

4

5

routes.MapRoute(

       "PostBySlug",

       "Post/{slug}",

       new { controller = "Home", action = "Post" }

   );


再加上前面的那个default的route,那么永远不会匹配到Home这个controller.

 

 

 

1。关于路由选择:既然是从上到下进行选择,那么定义Route类的名字有什么作用吗?
2。routes.MapRoute(
"PostById",
"Post/{id}",
new { controller = "Home", action = "Post", id = "" },
new { id = @"[\d]+" }
);

routes.MapRoute(
"Default", // Route 的名称
"{controller}/{action}/{id}", // 带有参数的URL
new { controller = "Home", action = "Index", id = "" } // 设置默认的参数
);

关于这两个匹配,假如有一个带参数的请求,参数不是整数,是不是先去检查第一个的表达式,不符合再检查第二个。为什么不去Controller中进行参数约定呢?这两种方式哪一种效率高呢? As the name implies, argumentative essays handle a conflict. An argumentative essay is composed of such a point that it can make a dispute.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇教你xftp连接阿里云轻量级应用服务器。超级详细,避免踩坑

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🍗关注➕点赞➕评论➕收藏 😄 🙏博主水平有限,如有错误,欢迎各位大佬纠正! &#x1f52…

ASP.NET MVC 入门4、Controller与Action

本系列文章基于ASP.NET MVC Preview5. Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据。在ASP.NET MVC Preview5中,将原来的Controller类一分为二,分为了Controller类和ControllerBase类…

Postman下载与安装操作步骤【超详细】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~🍗关注➕点赞➕评论➕收藏 😄🙏博主水平有限,如有错误,欢迎各位大佬纠正 Postman下载与安装&#x1…

C#异步编程模型

什么是异步编程模型 异步编程模型(Asynchronous Programming Model,简称APM)是C#1.1支持的一种实现异步操作的编程模型,虽然已经比较“古老”了,但是依然可以学习一下的。通过对APM的学习,我总结了以下三点: 1. APM的…

不会卸载MySQL?我连夜肝了一篇教你如何干干净净地卸载掉MySQL

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

设计模式篇

一. 什么是设计模式 纠结了好久,今天终于下定决心开始写设计模式系列,因为这个系列章节确实不好写,在这之前,也看了好多关于设计模式的博客、视频、书籍等,大多数用的例子要么猫啊狗啊、大雁等动物类;要么就…

Navicat15安装笔记

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🔎关注➕🤞点赞➕📋评论➕😄收藏 📅创作日期:2021年12月29日 📅修改日期…

MySQL5安装配置笔记【超详细】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

IDEA常用快捷键大合集

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

KnockoutJs篇:快速掌握KnockoutJs

一、引言 之前这个系列文章已经介绍Bootstrap。由于最近项目中,前端是Asp.net MVC KnockoutJs Bootstrap来做的。所以我又重新开始写这个系列。今天就让我们来看看Web前端的MVVM框架——KnockoutJs。 二、KnockoutJs是什么? 做.NET开发的人应该都知道…

IDEA常用设置【很实用】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

【git下载安装与配置】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

git 连接gitee时报错 Auth error: Access deined: authorize failure

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &#x1…

C#多线程编程系列(五)- 使用任务并行库

目录 1.1 简介1.2 创建任务1.3 使用任务执行基本的操作1.4 组合任务1.5 将APM模式转换为任务1.6 将EAP模式转换为任务1.7 实现取消选项1.8 处理任务中的异常1.9 并行运行任务1.10 使用TaskScheduler配置任务执行参考书籍笔者水平有限,如果错误欢迎各位批评指正&…

【VSCode快捷键大合集】

👨‍🎓 博主介绍:大家好,我是超梦梦梦梦,很高兴认识大家~ 🙏如果本博文对小伙伴们有帮助的话,欢迎🔎关注➕🤞点赞➕📋评论➕😄收藏一波哦~ &…

浅谈Vue.js的优势

写在前面 今天小梦跟小伙伴们简简单单聊一下Vue.js的优势。小梦也是刚刚接触Vue.js,在学习一门新的技术之前,我们当然要了解其优势,知道优势在哪更加有利于我们去学习并转换为自己的储备。 浅谈Vue.js的优势 首先Vue.js是一个轻巧、高性能、…

async await 的前世今生(Updated)

async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug&…

MySQL八大约束

MySQL约束MySQL约束主键约束(primary key)自增长约束(auto_increment)非空约束(not null)唯一约束(unique)默认约束(default)零填充约束(zerofill)外键约束(foreign key)MySQL约束 概念 约束英文:constraint约束实际上就是表中数据的限制条件 作用 表在设计的时…

ASP.NET使用管道模型(PipleLines)处理HTTP请求

大多数人认为ASP.NET仅仅只是页面——使用模板来创建HTML页面然后返回给浏览器。但是这仅仅只是ASP.NET使用HTTP管道模型处理WEB程序很小的一方面。管道模型是类似于Web Services的一种在服务器端处理ASP.NET页面的框架技术。作为一名高级的ASP.NET的开发者,你必须清…

【LeetCode-SQL每日一练】——1.组合两个表

🎈写在前面 🙋‍♂️大家好呀,我是超梦梦梦梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好…