Контроллер не нашел проблему при переписывании URL с восклицательным знаком
-
08-10-2019 - |
Вопрос
В монорельсе я пытаюсь создать правило перезаписи URL, чтобы дать дружественных URL-адреса к сообщениям статьи. Вот как выглядят URL:
http://domain.com/2010/11/29/winter-snow-warning.
И вот код в Global.Asax.cs, чтобы переписать URL-адреса:
RoutingModuleEx.Engine.Add(
new PatternRoute("/<year>/<month>/<day>/<title>")
.DefaultForController().Is("post")
.DefaultForAction().Is("show")
.Restrict("year").ValidInteger
.Restrict("month").ValidInteger
.Restrict("day").ValidInteger
);
Это отлично работает, однако, если в URL есть восклицательный знак:
http://domain.com/2010/11/29/winter-snow-warning.!!
Затем он не соответствует правилу и ошибкам перезаписи, говоря, что контроллер «2010» не может быть найден. Что я здесь не хватает, это ошибка в монорельсе?
Решение
Возможно, механизм сопоставления по умолчанию маршрутизации монорельса не принимает восклицательный знак, поэтому маршрут не совпадает и по умолчанию /controller/action
Вместо этого соответствует правилу, поскольку контроллер № 2010 не существует.
Быстрый обходной путь может заключаться в том, чтобы ограничить название точным выражением, которое соответствует вашим потребностям. например: .Restring("title").ValidRegex("[-_.+!*'() a-zA-Z0-9]+]")