MVC TIP2:路由
1:简单路由
建立MVC的时候会给我们创建默认的路由,如下:
1 2 3 4 5 | 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:创建一个自定义路由
1 2 3 4 5 | 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路由
必须为所有未匹配的路由添加的控制器,如下:
1 2 3 4 5 | routes.MapRoute( "catch-all" , "{*catchall}" , new { controller = "Error" , action = "NotFound" } ); |
经过上面的处理,所有未处理的URL,都会交给ErrorController的NotFound处理,如下:
1 2 3 4 5 6 7 | public class ErrorController : Controller { public string NotFound() { return "not found!" ; } } |
3.7 注意路由的次序
路由匹配有先后次序,在3.6中,我们会发现,如果输入http://localhost:52588/xx,结果IE显示:
查看我们的路由设置:
发现,因为URLhttp://localhost:52588/xx,被路由Default路由走了。将这个默认的路由去掉,一切就OK了。
4:路由约束
有的时候,我们需要,如下的URL
http://localhost:52588/Product/17,
被路由到一个处理ID的控制器,而
http://localhost:52588/Product/Rice
则被路由到一个处理商品名称的控制器,这就需要我们建立路由约束。如下:
1 2 3 4 5 6 7 8 9 10 11 | 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控制,则需要新建另外的文件夹。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器