2010-12-05 3 views
0

В монорельсе Я пытаюсь создать правило перезаписи URL-адресов, чтобы дать дружеские URL-адреса в сообщениях о статьях. Вот то, что URLs выглядеть следующим образом:Контроллер не обнаружен при переписывании URL-адреса с восклицательным знаком

http://domain.com/2010/11/29/Winter-snow-warning

А вот код в Global.asax.cs переписать URLs:

RoutingModuleEx.Engine.Add(
       new PatternRoute("/<year>/<month>/<day>/<title>") 
        .DefaultForController().Is("post") 
        .DefaultForAction().Is("show") 
        .Restrict("year").ValidInteger 
        .Restrict("month").ValidInteger 
        .Restrict("day").ValidInteger 
      ); 

Это прекрасно работает, однако если Eсть восклицательный знак в url:

http://domain.com/2010/11/29/Winter-snow-warning !!

Тогда это не соответствует правилу перезаписи и ошибкам, говоря, что контроллер «2010» не найден. Что мне здесь не хватает, это ошибка в монорельсе?

ответ

0

Возможно, механизм согласования по умолчанию для маршрутизации монорельса не принимает восклицательный знак, поэтому маршрут не соответствует, а по умолчанию используется правило /controller/action, что не работает, поскольку контроллер 2010 года не существует.

Быстрое обходное решение может заключаться в том, чтобы ограничить заголовок точным выражением, которое соответствует вашим потребностям. например: .Restring("title").ValidRegex("[-_.+!*'() a-zA-Z0-9]+]")