2010-03-02 18 views
5

¿contiene ASP.NET MVC cualquier contraints de ruta introducidos en el código? si es así, ¿cómo puedo definir una restricción de fecha y hora?¿Tiene ASP.NET MVC alguna restricción de ruta de DateTime?

por ejemplo. url:

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

aplausos :)

+0

¿Qué quiere decir exactamente con una restricción de fecha y hora? ¿De dónde vendría el valor de esa restricción? ¿Cómo quieres que se rutee según esa restricción? ¿Podría esa restricción ser simplemente un parámetro para un controlador, que además redirige o llama a otros métodos de control algorítmicamente? – jrista

+0

observe cómo tengo un espacio en la ruta para VersionDate? Esperaba que si una persona pusiera una fecha inválida allí, sería un error. Como tal, pensé que sería mejor colocar una ruta: restricción en ese parámetro de ruta ... para evitar que se pasen datos incorrectos. –

Respuesta

10

Terminé haciendo mi propia restricción de ruta. solo tomó unos minutos.

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

namespace Whatever.Your.Funky.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

+0

Bueno, esa fue una solución bastante elegante. +1 – jrista

+1

Es Funky Cold Medina, hijo. –

+0

Todavía está mal, jaja - Intenté cambiar "Funcky" por "Funky" pero rechazó la edición como <6 chars: '- ( – theyetiman

0

todo el marco es overide-poder por lo que es posible, con una gran cantidad de dolor, a overide el comportamiento por defecto del motor de ruta, pero estoy de acuerdo con @jrista en el que podría querer convertirlo en un parámetro del controlador, de lo contrario, mvc esperará encontrar/buscar/publicar en la carpeta 2010-01-20

+0

dentro de la carpeta 2010-01-20? no hay carpetas solo son controladores y sus puntos de vista. Además, no es parte del método de acción. De hecho, estoy capturando esto en el controlador abstracto, porque todas las rutas tendrán esto. De esa forma, es KISS. –

+0

Hmmm, entonces es posible que desee descargar el código fuente del marco y ver si puede ampliarlo o averiguar cómo anular el comportamiento de enrutamiento predeterminado. – griegs

+0

Terminé haciendo una restricción de ruta personalizada. me tomó unos minutos para hacer. resuelto –

2

También podría establecer una restricción en la ruta, algo como tal. La expresión regular utilizada no es muy robusta, por lo que debe refinarla.

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

Información de here.

+0

pensé en usar una regex, initally, pero como sugirió, no es muy robusto. Por eso quería utilizar el poder para 'DateTime.TryParse (...)'. –

+3

@ 37Inicio: ¿no cree que una expresión regular como '" \ d {4} - \ d {2} - \ d {2} "' sería más legible y más estándar?;) O tal vez incluso escribiría uno que solo dejara en las fechas correctas (mes no más de 12, etc.) –

+0

+1 Absolutamente eso sería mejor. Siempre tengo que sacar el libro de RegEx cuando escribo esto, ya que lo hago con poca frecuencia. Escribí esa respuesta cuando me dirigía a la puerta, de ahí el comentario "debes refinarlo". – 37Stars

Cuestiones relacionadas