ASP.NET MVC 入门3、Routing

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:

ContractedBlock.gif
ExpandedBlockStart.gif
BlogRoute

ASP.NET MVC 入门3、Routingpublic static void RegisterRoutes(RouteCollection routes)
ExpandedBlockStart.gifContractedBlock.gif
ASP.NET MVC 入门3、Routing{

ASP.NET MVC 入门3、Routing    
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
ASP.NET MVC 入门3、Routing
    routes.IgnoreRoute({resource}.axd/{*pathInfo}); 
ASP.NET MVC 入门3、Routing
ASP.NET MVC 入门3、Routing    routes.MapRoute(
ASP.NET MVC 入门3、Routing        
Admin,
ASP.NET MVC 入门3、Routing        
Admin/{action},
ExpandedSubBlockStart.gifContractedSubBlock.gif        
new ASP.NET MVC 入门3、Routing{ controller = Admin, action = Index }
ASP.NET MVC 入门3、Routing    ); 
ASP.NET MVC 入门3、Routing
ASP.NET MVC 入门3、Routing    routes.MapRoute(
ASP.NET MVC 入门3、Routing        
PostById,
ASP.NET MVC 入门3、Routing        
Post/{id},
ExpandedSubBlockStart.gifContractedSubBlock.gif        
new ASP.NET MVC 入门3、Routing{ controller = Home, action = Post, id = “” },
ExpandedSubBlockStart.gifContractedSubBlock.gif        
new ASP.NET MVC 入门3、Routing{ id = @”[\d]+ }
ASP.NET MVC 入门3、Routing    ); 
ASP.NET MVC 入门3、Routing
ASP.NET MVC 入门3、Routing    routes.MapRoute(
ASP.NET MVC 入门3、Routing        
PostBySlug,
ASP.NET MVC 入门3、Routing        
Post/{slug},
ExpandedSubBlockStart.gifContractedSubBlock.gif        
new ASP.NET MVC 入门3、Routing{ controller = Home, action = Post }
ASP.NET MVC 入门3、Routing    ); 
ASP.NET MVC 入门3、Routing
ASP.NET MVC 入门3、Routing    routes.MapRoute(
ASP.NET MVC 入门3、Routing        
Default,                                              // Route 的名称
ASP.NET MVC 入门3、Routing
        {controller}/{action}/{id},                           // 带有参数的URL
ExpandedSubBlockStart.gifContractedSubBlock.gif
        new ASP.NET MVC 入门3、Routing{ controller = Home, action = Index, id = “” }  // 设置默认的参数
ASP.NET MVC 入门3、Routing
    ); 
ASP.NET MVC 入门3、Routing
ASP.NET MVC 入门3、Routing}
 

 

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

———————————————————————

更多内容,请关注http://blog.51mvc.com/http://bbs.51mvc.com/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110986.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微创业平台

    一种专为大学生创业服务的平台。主旨是,让大学生创业创新,在某种比较简单,比较容易的环境里进行。让大学生创业创新,不要太多的风险,比较容易达成创业目标。云电话,一种5G新电话。特别适合大学生微创业,更需要大学生微创新。将云电话平台,建设成湖铁微创业平台,是深圳云电话平台,与湖铁职院创新创业学院,合作打造的专为湖铁职院大学生,创新创业服务的平台。建设好湖铁微创业平台,具有重大的社会意义。√成功示范作用。先在创新创业学院,打造标杆试点MVP。√便…

    2022年4月4日
    89
  • 简述Python垃圾回收机制「建议收藏」

    简述Python垃圾回收机制「建议收藏」引言许多高级语言都具有自己的垃圾回收机制,以管理计算机内存,Python也不例外。对于垃圾回收机制的了解程度,成了开发人员是否真正了解Python的检验手段,在面试的时候许多面试官也喜欢以此作为题目考察面试者Garbagecollection(GC)概述现在的高级语言如java,c#等,都采用了垃圾回收机制,而不再是c,c++里用户自己管理维护内存的方式。自己管理内存极其自由,可…

    2022年6月15日
    26
  • tomcat服务启动,但是无法访问网站_java获取request的所有参数

    tomcat服务启动,但是无法访问网站_java获取request的所有参数废话不说,真接上代码。HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestProperty(“Content-Length”,”0″);中的第二句没有起作用(发出去的http头里,未含有Content-Length字段)。但是这个代码在android平台上跑的时候,第二句是起了作用的。为…

    2025年10月21日
    4
  • AngularJS简介

    AngularJS简介AngularJS简介AngularJS是一个JavaScript矿建,他是一个JavaSscript编写的库。可以通过<script>标签添加到HTML页面。AngularJS是通过指令扩展了HTML,且通过表达式绑定数据到HTML。地址:<scriptsrc="http://apps.bdimg.com/libs/angular.js/1.4.6/angul…

    2022年7月25日
    8
  • 最详细eclipse汉化插件安装教程

    最详细eclipse汉化插件安装教程教程作者:阿良,欢迎转载,转载请说明出处!本人QQ:583393588,欢迎广大安卓朋友交流!本文与《最详细安卓ADT装教程》是兄弟篇,欢迎查阅:http://blog.csdn.net/dai_zhenliang/article/details/8490837我鄙视那些中文不好而鄙视我用中文的人离线安装中文包方式一:使用下载单独的语言包比如汉化eclipseindig

    2022年6月1日
    36
  • db browser连接数据库_dbbrowserforsqlite使用教程

    db browser连接数据库_dbbrowserforsqlite使用教程这几天在写一个程序,需要用到SQLITE,但是对于SQLITE不熟悉,在网上找了一个SQLITE查看器这个查看器叫做:www./database/118822.html这个查看器可以新建SQLITE文件数据库,可以建立表索引,写SQL语句,编辑表数据不过这个查看器支持的SQLITE数据库引擎版本低了一点,先介绍一下SQLiteDatabaseBrowser2.0是怎么用的?主界面将SQLIT…

    2025年10月15日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号