MVC TIP2:路由

简介:

1:简单路由

建立MVC的时候会给我们创建默认的路由,如下:

routes.MapRoute(
     "Default" , // Route name
     "{controller}/{action}/{id}" , // URL with parameters
     new  { controller = "Home" , action = "Index" , id = UrlParameter.Optional } // Parameter defaults
);

表示假设你在浏览器的地址栏输入了下面的URL:

/Home/Index/3

默认的路由将这个URL映射为下面的参数:

Controller = Home

Action = Index

id = 3

当你请求URL /Home/Index/3时,将会执行下面的代码:

HomeController.Index(3)

Default路由包含了所有三个参数的默认值。如果你不提供控制器,那么控制器参数默认值为Home。如果你不提供动作,动作参数默认为值Index。最后,如果你不提供id,id参数默认为空字符串。

2:创建一个自定义路由

routes.MapRoute(
     "RouteTemp" , // Route name
     "Archive/{entryDate}" // URL with parameters
     new  { controller = "Archive" , action = "Entry"  } // Parameter defaults
);

上面的代码意味着我们让路由匹配到http://localhost:52588/Archive/1911-1-1这样的URL。

3:下面是设计URL路由的原则

3.1 建立简单清晰的URL

在WEB-FORM中可能得到这样的URL:

events_by_month.aspx/year=2008&month=4

这样的URL没有如下的URL好:

events/2008/04

这也叫永久URL,同样,这也标识了我们可以为路由动作建立多个参数。

3.2 建立可编程的URL

events/2008/04

这表示删除04,能够得到2008年的所有记录是合理的。

3.3 允许URL参数冲突

应该能同时允许

events/2008/04

events/someeventsname

3.4 避免暴露数据库ID

events/17

这样的URL可能暴露了数据库ID,应该做简单的处理,如

events/ID17

这也会比第一个URL要好。

3.5 考虑SEO

可以在路由中加入关键字,如

events/ID17/MVC

3.6 提供CATCH ALL路由

必须为所有未匹配的路由添加的控制器,如下:

routes.MapRoute(
     "catch-all" ,
     "{*catchall}" ,
     new  { controller = "Error" , action = "NotFound"  }
);

经过上面的处理,所有未处理的URL,都会交给ErrorController的NotFound处理,如下:

public  class  ErrorController : Controller
{
     public  string  NotFound()
     {
         return  "not found!" ;
     }
}

3.7 注意路由的次序

路由匹配有先后次序,在3.6中,我们会发现,如果输入http://localhost:52588/xx,结果IE显示:

KP`[6`E{~EJ$YQ90){X`H56

查看我们的路由设置:

WN$FEN$_K``~0XLE@L]E3H3

发现,因为URLhttp://localhost:52588/xx,被路由Default路由走了。将这个默认的路由去掉,一切就OK了。

4:路由约束

有的时候,我们需要,如下的URL

http://localhost:52588/Product/17

被路由到一个处理ID的控制器,而

http://localhost:52588/Product/Rice

则被路由到一个处理商品名称的控制器,这就需要我们建立路由约束。如下:

routes.MapRoute(
     "Product" ,
     "Product/{productId}" ,
     new  { controller = "Product" , action = "Details"  },
     new  { productId = @"\d+"  }
  );
routes.MapRoute(
     "Product2" ,
     "Product/{entryArg}" ,
     new  { controller = "Archive" , action = "Entry"  }
  );

可以看到,前者我们路由到控制器ProductController,而后者则路由到了ArchiveController。

再次强调一遍,在整个项目开始以前,设计好路由是很重要的一个环节。

注意,可以使用实现IRouteConstraint接口来创建自定义路由约束,但是更建议使用像上面这样的正则匹配。

5:Views和Controllers文件夹

这两个文件夹已经成为MVC的默认文件夹,如果我们想创建页面不受MVC控制,则需要新建另外的文件夹。


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/07/27/2118649.html,如需转载请自行联系原作者

相关文章
|
10月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染4
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染4
40 0
|
10月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染2
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染2
35 0
|
10月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染3
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染3
42 0
|
10月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定1
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定1
39 0
|
10月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定2
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定2
30 1
|
11月前
|
开发框架 前端开发 .NET
ASP.NET Core MVC 从入门到精通之路由
ASP.NET Core MVC 从入门到精通之路由
107 0
|
前端开发 网络协议 网络架构
Gin从入门到精通—搭建MVC项目结构学习路由配置
Gin从入门到精通—搭建MVC项目结构学习路由配置
361 0
|
缓存 JavaScript 前端开发
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--路由限制及选择篇(2/8)【route】
文章目录 前情概要 上文中的RouteHandler中有一个重要方法GetActionDescriptor没有贴代码和说,接下来我们就说一说这个方法。 使用controllerName、actionName、httpmethod获得唯一匹配的处理函数描述对象 直接上代码,看代码注释即可 //acti...
947 0
|
缓存 JavaScript 前端开发
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】
文章目录 前情概要 在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有! app.use('/myroute path', (req, res, next) => { //dosomething }) 我们难道不能再智能一点点么,学习后端mvc框架一样,比如加个标记,或者默认规则直接自动映射嘛。
1105 0
|
前端开发
mvc 路由伪静态实现
很多网站都采用伪静态,例如以html、shtml等结尾的url,mvc的路由可以轻松实现。 配置路由 默认路由配置 添加伪静态路由 mvc的路由原理是从上往下匹配的,所以只需要在后面添加自己配置的路由即可 public static void RegisterRoutes(RouteCollection routes) { routes.
1091 0