Принудительная маршрутизация с учетом регистра в ASP.NET MVC
Этот вопрос был задан аналогичным, но не идентичным образом (и не решен, к моему удовлетворению) ранее в Переполнении стека и в других местах.
Исходя из мира Linux, я хочу использовать ASP.NET MVC, но избегать разрешения одинаковых, но по-разному распределенных маршрутов на одну и ту же страницу. Я не хочу, чтобы все маршруты были на 100% строчными.
например, я хочу /Home/Something
быть действительным маршрутом и /Home/somethingElse
быть действительным маршрутом, но не /Home/something
или же /home/somethingelse
, учитывая две функции под названием Something
а также somethingElse
в HomeController
,
Я не могу найти способ сделать это изнутри RegisterRoutes
функция, но, может быть, я упускаю что-то очевидное? Я могу ответить на это достаточно легко, добавив код в каждую функцию контроллера, но я, очевидно, пытаюсь избежать этого.
Оптимально, решение будет включать в себя перехват всех перестановок определенного маршрута, а затем 301 перенаправление любого, который не в точности соответствует случаю функции контроллера.
1 ответ
Я не смог найти какой-либо способ сделать это после тщательного поиска. В основном, чувствительность к регистру и IIS/ASP.NET явно не сочетаются друг с другом.
Сейчас мы используем немного клуджа, чтобы решить эту проблему. Код был открыт с открытым исходным кодом (лицензия MIT) на github: NeoSmart Web Toolkit, в частности, этот файл содержит код перенаправления SEO.
Использовать его достаточно просто: каждый метод GET в классах контроллера должен добавить только одну строку в начале:
Seo.SeoRedirect(this);
Класс перезаписи SEO автоматически использует атрибуты Caller Info в C# 5.0 для выполнения тяжелой работы, делая приведенный выше код строго копированием и вставкой.
В идеале я хотел бы найти способ превратить эту строку кода в атрибут. Например, префикс методов контроллера с [CaseSensitive]
будет автоматически иметь тот же эффект, что и запись в этой строке, но, увы, я (пока) не знаю, как это сделать.
Я также не могу найти способ выяснить это с Routing
класс / структура. Это какой-то непрозрачный код!