ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
2015-08-23 08:13
585 查看
http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html
引言--
在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由。也介绍了它本身的局限性-依赖于路由信息中的键值对:
如果键值对中没有的值,我们无法将其利用凑出我们想要的URL表达式。
初级篇传送门:使用Global路由表定制URL
在进阶篇中,我们将介绍ASP.NET 路由相关类的基类-抽象类RouteBase,并演示如何通过继承它,让URL重写和优化变成Free Style。
一,老板的需求
假设我们是手机销售网站的一名程序猿(承接初级篇),经过第一次的URL重写之后,我们的手机分类页面的URL的改变:
引言--
在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由。也介绍了它本身的局限性-依赖于路由信息中的键值对:
如果键值对中没有的值,我们无法将其利用凑出我们想要的URL表达式。
初级篇传送门:使用Global路由表定制URL
在进阶篇中,我们将介绍ASP.NET 路由相关类的基类-抽象类RouteBase,并演示如何通过继承它,让URL重写和优化变成Free Style。
一,老板的需求
假设我们是手机销售网站的一名程序猿(承接初级篇),经过第一次的URL重写之后,我们的手机分类页面的URL的改变:
http://www.xxx.com/category/showcategory?categoryid=0001&view=list&orderby=price&page=1 => http://www.xxx.com/category/0001[/code]
现在老板又提出了新的需求,URL的语义化,从而更好的反应网站的结构:http://www.xxx.com/ca-categoryname
比如Nokia是一个分类,那么对应URL为 /ca-nokia,如果是iPhone分类,URL则对应 /ca-iphone。ca前缀的意思是分类category。
对于这个需求简单的配置Global文件是无法做到的。首先我们来介绍一下ASP.NET 路由的所有类的基类RouteBase。
二,RouteBase类简介与运行机制
1. RouteBase类位于System.Web.Routing命名空间,结构如下:public abstract class RouteBase { protected RouteBase(); public abstract RouteData GetRouteData(HttpContextBase httpContext); public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values); }
GetRouteData:根据Http请求信息返回一个对象-包含路由定义的值(如果该路由与当前请求匹配)或 null(如果该路由与请求不匹配)。
GetVirtualPath:检查路由值是否与某个规则匹配,返回一个对象(包含生成的 URL 和有关路由的信息)或 null(如果路由与 values 不匹配)。
RouteBase:初始化该类供继承的类实例使用。此构造函数只能由继承的类调用。
看完以上定义,可能大家会晕忽忽。我们来弄一个简单的例子说明这几个方法是如何运作的。
首先我们新建一个类库JohnConnor.Routing,并且继承抽象类RouteBase:@model List<JohnConnor.Models.Category> @{ ViewBag.Title = "主页"; } <h2><a href="@Url.Action("Index", "Home")">首页</a></h2> <p> @foreach (var item in Model) { <a href="@Url.Action("ShowCategory", "Category", new { id = item.CategoeyID })">@item.CategoeyName</a> } </p>
三个分类连接会得到这样的结果<a href="/ca-nokia">Nokia</a> <a href="/ca-iphone">iPhone</a> <a href="/ca-anycall">Anycall</a>
点击每一个连接都会先进入我们的处理程序,生成相应的路由值-调用CategoryController.Showcategory(string id)方法根据id显示相应的分类页面。
------------------------------------------------------进阶篇完---------------------------------------------------
这一篇我花费了不少时间去构思如何用简单的例子讲述继承RouteBase来进行URL重写与优化。
希望能帮助到有用的人。
需要程序源代码朋友点这里:JohnConnor.UrlRewrite.rar
如有任何问题,欢迎指正和讨论。
相关文章推荐
- Asp.net mvc5 解析route源码实现自己的route系统
- asp.net MVC helper 和自定义函数@functions小结
- asp.net给DropDownList添加ToolTip(title)属性
- Asp.Net 一个请求的处理流程
- 毕业设计 ASP.Net+EasyUI开发 X X露天矿调度管理信息系统(一)
- ASP.NET mvc中session
- ASP.NET——生成验证码
- ASP.NET 动态创建文本框 TextBox (add TextBox to page dynamically)
- asp.net过滤数据中有异常数据字符串
- 理解SVG的viewport,viewBox,preserveAspectRatio
- 【.Net码农】[asp.net]自定义控件(支持模板)2
- ApsCMS AspCms_SettingFun.asp、AspCms-qqkfFun.asp、AspCms_Slide.asp、AspCms_StyleFun.asp、login.asp、AspCms_CommonFun.asp Vul
- ASP.NET文件上传大小II限制修改
- 【.Net码农】ASP.NET数据控件的自定义模板
- Jasper Report(3)--- 用JavaBean Collection做为数据源
- asp.net ajax
- Jasper Report (2)--- 用JDBC做为数据源
- Asp.net mvc项目分页功能
- Jasper Report (1)--- Eclipse集成Ireport插件
- asp.net图片分布式存储