views:

176

answers:

3

Hi folks,

does ASP.NET MVC contain any route contraints baked into the code? if so, how do i define a date-time constraint?

eg. url:

http://mydomain.com/{versionDate}/{controller}/{action}
http://mydomain.com/2010-01-20/search/posts

cheers :)

A: 

all of the framework is overide-able so it's possible, with a great deal of pain, to overide the default behaviour of the route engine but i agree with @jrista in that you might want to make it a parameter of the controller else mvc will expect to find /search/posts within the 2010-01-20 folder

griegs
within the 2010-01-20 folder? there are no folders. it's just controllers and their views. Also, it's not part of the action method. I'm actually capturing this in the abstract controller - because all routes will have this. That way, it's KISS.
Pure.Krome
Hmmm, then you may want to download the source for the framework and see if you can either extend it or find out how to overide the default routing behaviour.
griegs
I've ended up making a custom route constraint. took me a few mins to do. solved.
Pure.Krome
+1  A: 

I ended up making my own route constraint. only took a few mins.

using System;
using System.Web;
using System.Web.Routing;

namespace Whatever.Your.Funcky.Cold.Medina.Namespace.Is
{
    public class DateTimeRouteConstraint : IRouteConstraint
    {
        #region IRouteConstraint Members

        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
                          RouteDirection routeDirection)
        {
            DateTime dateTime;

            return DateTime.TryParse(values[parameterName] as string, out dateTime);
        }

        #endregion
    }
}

simple :P

Pure.Krome
Well that was a rather elegant solution. +1
jrista
It's Funky Cold Medina, son.
Mike Powell
Corrected, Dad. http://en.wikipedia.org/wiki/Funky_Cold_Medina (OMG, i even had a typo in there. Fucky instead of Funky .. haha)
Pure.Krome
A: 

You could also set up a constraint on the route, something like so. The regular expression used is not very robust, so you should refine it.

routes.MapRoute( 
    "Version", "
    {versionDate}/{controller}/{action}", 
    new {controller="Search", action="Posts"}, 
    new {versionDate= @"\d\d\d\d-\d\d-\d\d" } 
    ); 

Information from: http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-24-cs.aspx

37Stars
i thought of using a regex, initally, but like you suggested, it's not very robust. which is why i wanted to utilise the power to `DateTime.TryParse(...)`.
Pure.Krome
@37Start: don't you think a regular expression like `"\d{4}-\d{2}-\d{2}"` would be more readable and more standard? ;) Or maybe even writing one that would only let in correct dates (month not greater than 12 etc.)
Robert Koritnik
+1 Absolutely that would be better. I always have to break out the RegEx book when I get around to writing these as I do it infrequently. I wrote that response as I was heading out the door, hence the "you should refine it" comment.
37Stars