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


  • AFramework程序集说明

    2009-10-2 0:36:00

    摘要: 文件名:AFramework.dll命名空间:AFrameworkAFramework是持久层的一种实现,封装了应用程序常用的数据库操作。运用该组件时,主要运用两个类:Persistence

  • 和我一起学VSTA(Visual Studio Tools for Applications )(四)

    2009-6-23 11:15:00

    前三篇简单介绍了VSTA的用途以及开发前期准备,这一篇将介绍具体的开发。 我们先实现一个最简单的功能,打开VSTA IDE编程环境。 首先在VSTASAMPLE项目中,添加如下引用:

  • Application running in localhost and debugging mode

    2009-9-7 15:50:00

    Hi, Most of the time (If not all) when working on the project we view the website with the hel

  • Asp.Net MVC 把PartialView、View转换成字符串

    2012-1-15 8:55:00

    在开发中有时要在后台获得某个View 或者 PartialView 生成的字符串,只要你熟悉Asp.Net MVC 生命周期就能理解和敲出下面的代码。没什么高深的,直接上代码:

  • 分享之数据库实体关系图 DotNetNuke 5.6.1

    2012-3-26 21:20:00

    下图所示是DotNetNuke 5.6.1社区版的ERD(Entity-Relationship Diagram). 找了好久只找到这个版本的,估计不是官方的,是一个叫 R2i 的公司在维护的。但我

  • asp.net 动态编译与禁止

    2011-8-24 17:07:00

    当创建一个ASP.NET 页面的时候,其实就是创建一个.NET 的类的源代码,创建System.Web.UI.Page 类的一个实例(instance)。Asp.net 页面的所有内容包括脚本(Sc

  • asp.net对连接字符串加密解密

    2012-4-9 21:34:00

    在部署项目的时候,我们总是需要加密配置文件中的ConnectionStrings或者appSettings配置节,从而防止用户数据库被泄漏。.NET Framework使用提供程序模型来加密配置节,

  • What’s new in Internet Explorer 9?

    2011-5-7 15:58:00

    Microsoft has recently launched the Microsoft Internet Explorer 9 and I have just installed it on i

  • 基于CodeGenerator的Emit代码生成辅助类源码及演示

    2007-10-10 13:35:00

    摘要: 本文介绍一组NBearV4中的基于Emit动态生成代码的辅助类,部分概念在本人的blog之前的文章中或多或少都有介绍,这里包含最新的更新及演示、测试。主要是两个类:CodeGenerator

  • Two ways to use T4 templates: support code vs. one-time generation

    2009-7-17 20:13:00

    T4 templates have proven to be useful is a whole range of scenarios, and more and more developers a