public class CustomerRoute : RouteBase
{
     //从路径中解析出controller、action以及其他参数,创建RouteData(其中包括HttpHandler),然后调用HttpHandler处理请求
public override RouteData GetRouteData(System.Web.HttpContextBase httpContext)
{
var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath + httpContext.Request.PathInfo;//获取相对路径 virtualPath = virtualPath.Substring().Trim('/');//此时URL会是~/ca-categoryname,截取后面的ca-categoryname if (!virtualPath.StartsWith("ca-"))//判断是否是我们需要处理的URL,不是则返回null,匹配将会继续进行。
return null; var categoryname = virtualPath.Split('-').Last();//截取ca-前缀后的分类名称 //尝试根据分类名称获取相应分类,忽略大小写
var category = CategoryManager.AllCategories.Find(c => c.CategoeyName.Equals(categoryname, StringComparison.OrdinalIgnoreCase)); if (category == null)//如果分类是null,可能不是我们要处理的URL,返回null,让匹配继续进行
return null; //至此可以肯定是我们要处理的URL了
var data = new RouteData(this, new MvcRouteHandler());//声明一个RouteData,添加相应的路由值
data.Values.Add("controller", "CustomerRoute");
data.Values.Add("action", "ShowCategory");
data.Values.Add("id", category.CategoeyID); return data;//返回这个路由值将调用CategoryController.ShowCategory(category.CategoeyID)方法。匹配终止
}

    //根据RouteValueDictionary转换成url
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
//判断请求是否来源于CategoryController.Showcategory(string id),不是则返回null,让匹配继续
var categoryId = values["id"] as string; if (categoryId == null)//路由信息中缺少参数id,不是我们要处理的请求,返回null
return null; //请求不是CategoryController发起的,不是我们要处理的请求,返回null
if (!values.ContainsKey("controller") || !values["controller"].ToString().Equals("CustomerRoute", StringComparison.OrdinalIgnoreCase))
return null;
//请求不是CategoryController.Showcategory(string id)发起的,不是我们要处理的请求,返回null
if (!values.ContainsKey("action") || !values["action"].ToString().Equals("showcategory", StringComparison.OrdinalIgnoreCase))
return null; //至此,我们可以确定请求是CategoryController.Showcategory(string id)发起的,生成相应的URL并返回
var category = CategoryManager.AllCategories.Find(c => c.CategoeyID == categoryId); if (category == null)
throw new ArgumentNullException("category");//找不到分类抛出异常 var path = "ca-" + category.CategoeyName.Trim();//生成URL return new VirtualPathData(this, path.ToLowerInvariant());
}
}

最新文章

  1. select 选择的制作
  2. 【java】:通用接口
  3. gulp构建前端开发环境
  4. hdu2544 最短路
  5. P137、面试题23:从上往下打印二叉树
  6. Android稳定性测试之Log分析
  7. W3C DOM 事件模型(简述)
  8. hdu 2546 饭卡 (01背包)
  9. window maven批量删除.lastUpdated文件
  10. [转]动态管理视图和函数 (Transact-SQL)
  11. hadoop任务监控页面namenode:50030(在hadoop配置中查找集群jobtracker的ip,访问50030)
  12. Redis 实现安全队列
  13. VirtualBox使用入门
  14. python目录遍历文件名称替换
  15. kubenets installation--ranchor-mesos
  16. python开发day03
  17. 绑定方式开始服务&调用服务的方法
  18. gitlab数据迁移
  19. 【Leetcode】179. Largest Number
  20. ajax的一些实用技巧

热门文章

  1. Android中的Matrix(矩阵)
  2. log4j.properties中的这句话“log4j.logger.org.hibernate.SQL=DEBUG ”该怎么写在log4j.xml里面呢?
  3. IOS view拖拽(触摸事件)
  4. C++之RAII惯用法
  5. CUDA && GPU中dim3介绍
  6. ambari过程中要求各个节点时间同步
  7. HttpServletRequest HttpServletResponse ServletException 重新打开后报红解决方法
  8. Tomcat启动xxx.keystore文件找不到
  9. dataTable 自定义排序
  10. mysql 查询 7天内的数据