2010-03-02 4 views
5

enthält ASP.NET MVC irgendwelche Beschränkungen, die in den Code eingebunden sind? Wenn ja, wie definiere ich eine Datum-Zeit-Einschränkung?Hat ASP.NET MVC irgendwelche Einschränkungen der DateTime-Route?

z. url:

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

cheers :)

+0

Was genau meinen Sie mit einer Datum-Zeit-Einschränkung? Woher kommt der Wert für diese Einschränkung? Wie soll es basierend auf dieser Einschränkung routen? Könnte diese Einschränkung einfach ein Parameter für einen Controller sein, der algorithmisch weitere Controller-Methoden weiterleitet oder aufruft? – jrista

+0

Beachten Sie, wie ich einen Slot in der Route für VersionDate habe? Ich hatte gehofft, dass, wenn eine Person dort ein ungültiges Datum eingibt, es ein Fehler wäre. Als solche dachte ich, dass es am besten wäre, eine Route - Einschränkung auf diesen Routenparameter zu platzieren .. um zu verhindern, dass schlechte Daten übergeben werden. –

Antwort

10

Ich landete meine eigene Route Constraint. dauerte nur ein paar Minuten.

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

einfach: P

+0

Nun, das war eine ziemlich elegante Lösung. +1 – jrista

+1

Es ist Funky Cold Medina, mein Sohn. –

+0

Es ist immer noch falsch, haha ​​- Ich habe versucht, "Funcky" zu "Funky" zu ändern, aber es lehnte die Bearbeitung als <6 Zeichen: '- ( – theyetiman

0

alle Rahmen ist overide-fähig, so ist es möglich, mit einem sehr viel Schmerz, das Standardverhalten der Streckenauswahl außer Kraft zu setzen, aber ich stimme mit @jrista Vielleicht möchten Sie es zu einem Parameter des Controllers machen, sonst wird mvc erwarten,/Suche/Beiträge innerhalb des 2010-01-20 Ordners zu finden

+0

im Ordner 2010-01-20? Es gibt keine Ordner. es sind nur Controller und ihre Ansichten. Außerdem ist es nicht Teil der Aktionsmethode. Ich fange das tatsächlich im abstrakten Controller ein - denn alle Routen haben das. So ist es KISS. –

+0

Hmmm, dann möchten Sie vielleicht die Quelle für das Framework herunterladen und sehen, ob Sie es entweder erweitern können oder herausfinden, wie Sie das Standard-Routing-Verhalten übersteuern können. – griegs

+0

Ich habe am Ende eine benutzerdefinierte Route Einschränkung gemacht. nahm mich ein paar Minuten zu tun. gelöst. –

2

Sie könnten auch eine Einschränkung auf der Strecke, so etwas wie so eingerichtet. Der verwendete reguläre Ausdruck ist nicht sehr robust, daher sollten Sie ihn verfeinern.

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

Informationen von here.

+0

Ich dachte an eine Regex, initial, aber wie du vorgeschlagen hast, ist es nicht sehr robust, weshalb ich die Power zu 'DateTime.TryParse (...)' nutzen wollte. –

+3

@ 37Start: Denkst du nicht einen regulären Ausdruck wie '' " \ d {4} - \ d {2} - \ d {2} "' wäre besser lesbar und standardmäßiger?;) Oder vielleicht sogar einen schreiben, der nur korrekte Daten einleitete (Monat nicht größer als 12 usw.) –

+0

+1 Absolut, das wäre besser. Ich muss immer das RegEx-Buch auspacken, wenn ich dazu komme, diese zu schreiben, da ich es selten mache. Ich schrieb diese Antwort, als ich aus der Tür ging, daher der Kommentar "Du solltest es verfeinern". – 37Stars

Verwandte Themen