2010-03-02 6 views
5

ASP.NET MVC содержит какие-либо обозначения маршрута, запеченные в коде? если да, то как определить ограничение по дате?Имеет ли ASP.NET MVC ограничения маршрута DateTime?

например. URL:

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

ура :)

+0

Что именно вы подразумеваете под ограничением дат-времени? Откуда взялось значение для этого ограничения? Как вы хотите, чтобы маршрут был основан на этом ограничении? Может ли это ограничение просто быть параметром контроллера, который далее перенаправляет или вызывает другие методы контроллера алгоритмически? – jrista

+0

обратите внимание, как у меня есть слот в пути для VersionDate? я надеялся, что если кто-то поставит туда недействительную дату, это будет ошибкой. Как таковой, я подумал, что лучше всего установить ограничение маршрута на этот параметр маршрута .. чтобы предотвратить передачу плохих данных. –

ответ

10

Я закончил тем, что сделал свой собственный маршрут. только заняло несколько минут.

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

просто: P

+0

Ну, это было довольно элегантное решение. +1 – jrista

+1

Это Веселая Холодная Медина, сын. –

+0

Это все еще неправильно, ха-ха - я попытался изменить «Funcky» на «Funky», но он отклонил изменение как <6 символов: '- ( – theyetiman

0

все структур является overide-состояния, так что это возможно, с большой болью, чтобы overide поведения по умолчанию маршрута двигателя, но я согласен с @jrista в том, что вы можете захотеть сделать это параметром контроллера, иначе mvc будет ожидать поиска/поиска/сообщений в папке 2010-01-20

+0

в папке 2010-01-20? нет папок. это просто контроллеры и их взгляды. Кроме того, это не часть метода действия. Я действительно фиксирую это в абстрактном контроллере, потому что все маршруты будут иметь это. Таким образом, это KISS. –

+0

Хммм, тогда вы можете загрузить источник для фреймворка и посмотреть, можете ли вы его расширить или узнать, как переопределить поведение маршрутизации по умолчанию. – griegs

+0

Я закончил создание пользовательского ограничения маршрута. взял меня на несколько минут. решена. –

2

Вы также можете настроить ограничение на маршруте, что-то вроде этого. Используемое регулярное выражение не очень надежное, поэтому вы должны его уточнить.

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

Информация от here.

+0

Я думал об использовании regex, initally, но, как вы и предполагали, он не очень надежный, поэтому я хотел использовать силу для 'DateTime.TryParse (...)'. –

+3

@ 37Начём: вам не кажется, что регулярное выражение типа ' \ d {4} - \ d {2} - \ d {2} "' было бы более читаемым и более стандартным?;) Или, может быть, даже написать тот, который позволил бы только ввести правильные даты (месяц не более 12 и т. д.), –

+0

+1 Совершенно верно, что было бы лучше. Мне всегда приходится вырываться из книги RegEx, когда я общаюсь с этим, потому что я делаю это нечасто. Я написал этот ответ, когда я направлялся в дверь, поэтому комментарий «вы должны уточнить». – 37Stars