当前位置 > 首页 > Asp.net

扩展URL Routing:处理URL中的日期参数

2009-6-5 16:06:00来源:Asp.net

对URL中的日期参数,老赵提供了一个非常经典的解决方案。但是这里的日期参数是以yyyy-MM-dd的形式出现的,用户往往会有这样的需求,即URL中的参数一定要为Demo/Date/2009/06/05的形式。由于RouteData是以/来划分segment的,老赵的方案似乎就不适用了。

国外的大牛们大多推崇将日期分隔为年、月、日,通过扩展IRouteConstraint来对年月日分别进行判断。引用老赵的话来说,“无论从易用性还是通用性等角度来看,这种做法都是下下之策。说实话,这样的做法其实并没有跳出框架既有功能给定的圈子,它只是通过“迎合框架”来满足自己的需求,而不是让框架为我们的需求服务。”

其实要实现这样的需求也不难,只需要对老赵的方案稍微修改一下就可以了。我们将URL定义为Demo/Date/{year}/{month}/{day},然后在生成RouteData时,将year、month、day组合成date;生成路径时,再将date划分为year、month、day。

新建一个DateFormatRoute类,让它继承自RouteBase。在GetRouteData方法中拼接年月日,其余方法与老赵的相同。

public override RouteData GetRouteData(HttpContextBase httpContext)
{
    var routeData = route.GetRouteData(httpContext);
    if (routeData.Values["year"] != null)
    {
        string date = routeData.Values["year"].ToString() + routeData.Values["month"].ToString() + routeData.Values["day"].ToString();
        routeData.Values.Remove("year");
        routeData.Values.Remove("month");
        routeData.Values.Remove("day");
        routeData.Values["date"] = date;
    }
    else
    {
        return null;
    }

    var valuesModified = new Dictionary<string, object>();
    foreach (var pair in routeData.Values)
    {
        var key = pair.Key;
        IRouteFormatter formatter = null;
        if (this.formatters.TryGetValue(key, out formatter))
        { 
            object o;
            if (formatter.TryParse(pair.Value, out o))
            {
                valuesModified[key] = o;
            }
            else
            {
                return null;
            }
        }
    }

    foreach (var pair in valuesModified)
    {
        routeData.Values[pair.Key] = pair.Value;
    }
    return routeData;
}

在GetVirtualPath方法中,再将年月日分解到各个segment中。

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
    var routeValues = new RouteValueDictionary();
    foreach (


  • Adding, Changing & Finding buttons in the ASP.NET Wizard Control

    2009-11-4 13:53:00

    A comment was recently left on a previous post of mine asking how to go about adding a button to

  • 基于.NET技术的监控应用分析(二)

    2010-9-23 23:48:00

    作者: 野男人 发表于 2010-09-23 23:35 原文链接 阅读: 12 评论: 0 在上一篇的 基于.NET技术的监控应用分析(一) 中,讲了数据采集和通信技术的分析,其实

  • 在UI线程执行代码(.Net)

    2012-6-22 19:31:00

    好久没写博客了。最近在重构代码,碰到了很多了有意义的问题,在此和大家分享。 大家知道,在使用异步IO或者大量多线程代码时,总会碰到同步问题,例如在其他线程调用Winform的Control相关代码

  • ComponentArt TreeView 树型控件父子联动实现 (CheckBox 全选)

    2007-6-28 21:13:00

    摘要: 很多情况下,当选择一个节点的时候,需要将节点下面的所有子节点全选,相应的,当取消的时候,也要将节点下面的子节点全部取消选择。而在有的时候选择一个节点,需要将节点的父节点选中,不是吗。 阅读全

  • 调用WindowsAPI显示帮助提示

    2009-8-10 10:33:00

    导言 前一段时间,在编写程序的过程中,需要一个帮助功能按钮。这个按钮众所周知,按下按钮以后,鼠标变成带有问号的鼠标,然后点击画面上的控件,然后就回出现一个提示的文本,该处是什么含意

  • Objective-C 2.0 with Cocoa Foundation--- 6,NSObject的奥秘

    2009-4-13 12:59:00

    摘要: 6,NSObject的奥秘本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,为了更好的理解本章内容,笔者建议你最好从本系列讲座的第1章开始阅读,请点击这里。在上一章里面,笔者向大家

  • And tonight on the History Channel, hummm, Channel 9: Visual Studio

    2009-9-30 20:05:00

    Microsoft has published on the History Channel Channel 9 a two part documentary on the history of

  • ASP.NET自定义控件 第十天 实现分页功能的DataList(附该系列文章PDF版本)

    2009-4-2 12:42:00

    摘要: 1. 引言 在ASP.NET中DataList可以实现数据展示,我们可以通过定制其模版实现丰富的格式,但是美中不足的时DataList默认情况下不支持分页,我们当然可以编写一个用户控件以实现

  • flash缓动类

    2009-7-12 1:12:00

    原文地址: http://www.laaan.cn/?p=972 昨天研究了会缓动类, 可以看一个应用》》 ,今天整理了一下,这里简单介绍一下: 一个简单例子:

  • ESBasic 可复用的.NET类库(03) -- 圈 Circle

    2009-8-29 20:11:00

    摘要: 1.缘起: 假设我们要开发一个多人跳棋游戏。在跳棋游戏中,当一个人走一步棋之后,控制权就轮到下一家,如此轮询,一圈之后控制权又回到自己,然后再继续轮圈下去。我们可以使用数组或列表等数据结构来