当前位置 > 首页 > 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 (


  • 使用Spring.Net 1.3.2 + NHibernate 3.2的mapping by code和default convention

    2011-9-6 10:15:00

    NH的官网今天出了两篇blog,讲如何使用NH3.2的mapping by code,不过都弱爆了,推荐直接看Fabio Maulo的blog去( 一 、 二 ) 简单的说,NH的mappin

  • Win32编程点滴2

    2009-8-31 17:48:00

    摘要: 带有font linking技术的TextOut函数 ------------------------------------------------------------------

  • ASP.NET QA Podcast – Episode 2

    2009-3-21 11:58:00

    Download : Episode 2 In the second installment of the ASP.NET QA Podcast Federico and Matt

  • 有限自动机与建模

    2009-6-6 12:33:00

    前言 在学校学程序设计语言的时候,能接触到的所有例子没有一个跟现实世界是有关系的。大多是关注于语言的细节层次,根本没有模型的概念,而我认为,要真正的让别人理解模型是如何建立的,最好的方法是从一

  • WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]

    2009-11-24 0:37:00

    阅读: 85 评论: 4 作者: Artech 发表于 2009-11-23 22:59 原文链接 WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理

  • 在Silverlight中使用Socket进行通信(3)简单的文本聊天工具

    2010-7-15 10:48:00

    作者: Leon Weng 发表于 2010-07-15 01:21 原文链接 阅读: 692 评论: 16 在上一篇的基础上,晚上我又尝试了一下做个聊天工具,有个定时取消息的过程解决不好

  • MOSS 直接动态安装webPart到页面

    2007-7-5 11:37:00

    在现在开发的项目中,发现一个好玩的东西,就是动态把WebPart自动的加载到指定的页面上的指定的位置? 感觉是不是很神奇?其实也很简单,主要用到SPLimitedWebPartManager这个类就

  • 信息系统开发平台OpenExpressApp - AutoUI自动生成界面

    2009-11-11 15:25:00

    阅读: 484 评论: 2 作者: 快乐学习 发表于 2009-11-11 11:49 原文链接 在 《信息系统开发平台OpenExpressApp - 理解核心元素ObjectView

  • Building a REST Web Service, day 1

    2007-8-15 22:02:00

    My first project at Cozi is to build a simple REST -style Web Service. Nobody here h

  • 【asp.net】三层架构就是好吗?

    2011-7-1 0:01:00

    对于这个问题我有点想不透。三层架构就是好吗?我一般做项目就用到了两个类。一个是Application.cs //应用类,主要是对页面各种功能的封装 OperateDB.cs // 数据库类,主要