Принудительная маршрутизация с учетом регистра в ASP.NET MVC

Этот вопрос был задан аналогичным, но не идентичным образом (и не был разрешен к моему удовлетворению) ранее на Stack Overflow и в другом месте.

Исходя из мира Linux, я хочу использовать ASP.NET MVC, но избегать разрешения идентичных, но разных маршрутов на одну и ту же страницу. Я не хочу, чтобы все маршруты были на 100% строчными.

например Я хочу, чтобы /Home/Something был допустимым маршрутом, а /Home/somethingElse также был допустимым маршрутом, но не /Home/something или /home/somethingelse, учитывая две функции, называемые Something и somethingElse в HomeController.

Я не могу найти способ сделать это из функции RegisterRoutes, но, может быть, мне не хватает чего-то очевидного? Я могу достаточно легко ответить на этот вопрос, добавив код к каждой функции контроллера, но я, очевидно, стараюсь этого не делать.

Оптимально, решение будет включать в себя перехват всех перестановок определенного маршрута, а затем 301 перенаправление любых, которые не совсем соответствуют случаю функции контроллера.


person Mahmoud Al-Qudsi    schedule 23.10.2012    source источник
comment
Веб-формы MVC и ASP.NET могут использовать один и тот же механизм маршрутизации.   -  person George Stocker    schedule 23.10.2012
comment
Стоит отметить, что вы не указали C # или VB.Net - VB.Net по своей сути нечувствителен к регистру.   -  person Basic    schedule 23.10.2012


Ответы (1)


После тщательного поиска мне не удалось найти какой-либо способ сделать это. По сути, чувствительность к регистру и IIS / ASP.NET явно несовместимы.

Чтобы решить эту проблему, мы сейчас используем кое-какой кладж. Код был открыт (лицензия MIT) на github: NeoSmart Web Toolkit, в частности, этот файл, содержащий код перенаправления SEO.

Использовать его достаточно просто: каждый метод GET в классах контроллера должен добавлять только одну строку в начале:

Seo.SeoRedirect(this);

Класс перезаписи SEO автоматически использует атрибуты Caller Info C # 5.0 для выполнения тяжелой работы, делая приведенный выше код строго копированием и вставкой.

В идеале я хотел бы найти способ превратить эту строку кода в атрибут. Например, добавление к методам контроллера префикса [CaseSensitive] автоматически будет иметь тот же эффект, что и запись в этой строке, но, увы, я (пока) не знаю, как это сделать.

Я также не могу найти способ выяснить это с помощью классов / структур Routing. Какой-то непрозрачный код!

person Mahmoud Al-Qudsi    schedule 06.11.2012