2010-03-02 4 views
5

ASP.NET MVC contiene contorni di percorso inseriti nel codice? se sì, come posso definire un vincolo di data-ora?ASP.NET MVC ha vincoli di route DateTime?

es. url:

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

applausi :)

+0

Che cosa intendi esattamente per vincolo di data e ora? Da dove proviene il valore di tale vincolo? Come vuoi che si instradi in base a tale vincolo? Questo vincolo potrebbe essere semplicemente un parametro per un controller, che reindirizza ulteriormente o chiama algoritmicamente altri metodi di controllo? – jrista

+0

nota come ho uno slot nel percorso per VersionDate? Speravo che se una persona avesse inserito una data non valida, sarebbe un errore. Come tale, ho pensato che sarebbe stato meglio posizionare un percorso - vincolo su quel parametro del percorso .. per evitare che dati cattivi venissero passati. –

risposta

10

Ho finito per creare il mio vincolo di percorso. ci sono voluti solo pochi minuti.

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 
    } 
} 

semplice: P

+0

Bene quella era una soluzione piuttosto elegante. +1 – jrista

+1

È Funky Cold Medina, figliolo. –

+0

E 'ancora sbagliato, haha ​​- Ho provato a cambiare "Funcky" in "Funky" ma ha rifiutato la modifica come <6 caratteri: "- ( – theyetiman

0

tutto il quadro è overide-in grado in modo che sia possibile, con una grande quantità di dolore, per overide il comportamento predefinito del motore percorso, ma sono d'accordo con @jrista nel fatto che si potrebbe desiderare di renderlo un parametro del controller, mvc si aspetta di trovare/search/posts nella cartella 2010-01-20

+0

nella cartella 2010-01-20? non ci sono cartelle. sono solo i controller e i loro punti di vista. Inoltre, non fa parte del metodo di azione. In realtà sto catturando questo nel controller astratto, perché tutte le rotte avranno questo. In questo modo, è KISS. –

+0

Hmmm, quindi potresti voler scaricare l'origine per il framework e vedere se è possibile estenderlo o scoprire come sovrascrivere il comportamento di routing predefinito. – griegs

+0

Ho finito per creare un vincolo del percorso personalizzato. mi ci sono voluti alcuni minuti da fare. risolto. –

2

Si potrebbe anche impostare un vincolo sulla rotta, qualcosa come così. L'espressione regolare utilizzata non è molto robusta, quindi è necessario perfezionarla.

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

Informazioni da here.

+0

ho pensato di utilizzare un regex, inizialmente, ma come tu hai suggerito, non è molto robusto, ed è per questo che volevo utilizzare il potere di 'DateTime.TryParse (...)'. –

+3

@ 37Inizia: non pensi che un'espressione regolare come '" \ d {4} - \ d {2} - \ d {2} "' sarebbe più leggibile e più standard?;) O forse anche scrivendo uno che permetterebbe solo di inserire date corrette (mese non superiore a 12 ecc.) –

+0

+1 Assolutamente sarebbe meglio. Devo sempre tirare fuori il libro delle RegEx quando arrivo a scriverle come faccio di rado. Ho scritto questa risposta mentre stavo uscendo dalla porta, quindi il commento "dovresti perfezionarlo". – 37Stars