Принудительная маршрутизация с учетом регистра в 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 класс / структура. Это какой-то непрозрачный код!

Другие вопросы по тегам