ASP.NET MVC 4 - разрешить тире / дефисы в URL-адресах

Я изо всех сил пытаюсь разрешить тире / дефисы в URL-адресе в моем приложении MVC 4 / ASP.NET 4.5 ... по какой-то причине MVC преобразует тире в подчеркивания, чего я не хочу.

Я немного поискал, прежде чем опубликовать вопрос, но до сих пор не могу найти простого решения. Все, что я нашел, кажется не в порядке для такой простой конфигурации.

В принципе, я хотел бы иметь доступ к следующему URL-адресу:

www.mysite.com/dashes-in-url

Так, например, я создал контроллер с именем:

тире-в-urlController.cs

Контроллер был назван нормально и допускал дефисы в имени контроллера.

Однако, когда я создал представление для индекса для вышеуказанного контроллера, оно создало представление как:

Папка: / Views / dashes_in_url

С файлом Index.cshtml в этой папке - но он заменил мои дефисы на подчеркивания.

Поэтому мне нужно получить доступ к URL-адресу как:

www.mysite.com/dashes_in_url

с подчеркиванием вместо тире в URL-адресе.

Кто-нибудь знает какое-нибудь элегантное и простое решение для достижения того, что я пытаюсь сделать?

Любая помощь в этом вопросе будет принята с благодарностью, спасибо!


person KabanaSoft    schedule 15.09.2012    source источник
comment
Глупый вопрос ... Вы пытались переименовать свое представление как dashes-in-url.cshtml?   -  person Pablo Claus    schedule 15.09.2012
comment
Вам необходимо реализовать HyphenatedRouteHandler - к счастью, многие люди уже сделали это, поэтому ознакомьтесь с принятым ответом здесь stackoverflow.com/questions/2070890/ или поиск в Google по запросу HyphenatedRouteHandler для получения дополнительных примеров   -  person Luke Baughan    schedule 20.09.2012


Ответы (1)


Для решения этой проблемы я разработал библиотеку NuGet с открытым исходным кодом, которая неявно преобразует EveryMvc / Url в every-mvc / url.

Пунктирные URL-адреса намного удобнее для SEO и легче читаются. (Подробнее в моем сообщении в блоге)

Пакет NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/

Чтобы установить его, просто откройте окно NuGet в Visual Studio, щелкнув правой кнопкой мыши Project и выбрав NuGet Package Manager, а на вкладке «Online» введите «Lowercase Dashed Route», и он должен появиться.

Кроме того, вы можете запустить этот код в консоли диспетчера пакетов:

Install-Package LowercaseDashedRoute

После этого вы должны открыть App_Start / RouteConfig.cs и закомментировать существующий вызов route.MapRoute (...) и добавить вместо него следующее:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

Вот и все. Все URL-адреса в нижнем регистре, пунктирные и неявно конвертируются без каких-либо дополнительных действий.

URL-адрес проекта с открытым исходным кодом: https://github.com/AtaS/lowercase-dashed-route

person Ata S.    schedule 03.08.2013
comment
Идеальный приятель по упаковке. Спасибо! - person Shane LeBlanc; 04.09.2013
comment
Когда я использую javascript для ссылки на адрес, например window.location.href = / MyController / Index / Id / ArbitraryText, контроллер не выделяется пунктиром. Как я могу это исправить? - person Shane LeBlanc; 20.09.2013
comment
Можете ли вы прислать образцы кодов, чтобы я мог ясно увидеть проблему? Пожалуйста, откройте проблему здесь: github.com/AtaS/lowercase-dashed-route/issues - person Ata S.; 20.09.2013
comment
Еще вопрос по этому пакету. Когда я набираю URL-адрес localhost: 5038 / MyHomeAction, он отлично работает. Но как насчет того, чтобы использовать другой контроллер, например, имя моего контроллера CodesController, и я хочу перейти на localhost: 5038 / Коды Я получаю 404, потому что он, похоже, ищет коды действий в HomeController, а не осознает, что их нет 't one и нажмите CodesController, а затем Index Action такого контроллера. - person Shane LeBlanc; 25.09.2013
comment
Что ж, для меня это не так. Например, у меня есть AdminController, и я могу ввести его, набрав / admin. Даже Html.ActionLink () генерирует ссылку / admin. У меня он работает одинаково с пакетом Lowercase Dashed Route или без него. Вы можете привести другой пример, если считаете, что проблема все еще существует. - person Ata S.; 26.09.2013