Я хочу, чтобы в моих URL-адресах были отдельные слова. Поэтому вместо:
/MyController/MyAction
Мне бы хотелось:
/My-Controller/My-Action
Возможно ли это?
Я хочу, чтобы в моих URL-адресах были отдельные слова. Поэтому вместо:
/MyController/MyAction
Мне бы хотелось:
/My-Controller/My-Action
Возможно ли это?
Вы можете использовать атрибут ActionName следующим образом:
[ActionName("My-Action")]
public ActionResult MyAction() {
return View();
}
Обратите внимание, что вам нужно будет вызвать ваш файл View "My-Action.cshtml" (или соответствующее расширение). Вам также нужно будет ссылаться на "мое действие" в любых методах Html.ActionLink.
Не существует такого простого решения для контроллеров.
Теперь с MVC5 Маршрутизация атрибутов была поглощена проектом. Теперь вы можете использовать:
[Route("My-Action")]
О методах действий.
Для контроллеров вы можете применить атрибут RoutePrefix
, который будет применяться ко всем методам действий в этом контроллере:
[RoutePrefix("my-controller")]
Одно из преимуществ использования RoutePrefix
- параметры URL-адреса также будут переданы любым методам действий.
[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....
Снип..
[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client
Вы можете создать собственный обработчик маршрута, как показано в этом блоге:
http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/
public class HyphenatedRouteHandler : MvcRouteHandler{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
... и новый маршрут:
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Default", action = "Index", id = "" }),
new HyphenatedRouteHandler())
);
Здесь был задан очень похожий вопрос: Поддержка ASP.NET MVC для URL-адресов с дефисами
Я разработал библиотеку с открытым исходным кодом NuGet для этой проблемы, которая неявно преобразует EveryMvc/Url в каждый-mvc/url.
Верхние URL-адреса являются проблематичными, поскольку пути cookie чувствительны к регистру, большая часть Интернета на самом деле чувствительна к регистру, в то время как технологии Microsoft обрабатывают URL-адреса без учета регистра. (Подробнее о моем сообщении в блоге)
Пакет NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/
Чтобы установить его, просто откройте окно NuGet в Visual Studio, щелкнув правой кнопкой мыши Project и выбрав NuGet Package Manager, а на вкладке "Онлайн" введите "Строчный штрихованный маршрут", и он должен появиться.
В качестве альтернативы вы можете запустить этот код в консоли диспетчера пакетов:
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
Здесь то, что я делал с использованием областей в ASP.NET MVC 5, и это сработало, понравилось очарование. Мне также не нужно было переименовывать мои взгляды.
В RouteConfig.cs выполните следующее:
public static void RegisterRoutes(RouteCollection routes)
{
// add these to enable attribute routing and lowercase urls, if desired
routes.MapMvcAttributeRoutes();
routes.LowercaseUrls = true;
// routes.MapRoute...
}
В своем контроллере добавьте это до определения вашего класса:
[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
// ...
[Route("my-action")]
public ViewResult MyAction()
{
// do something useful
}
}
URL-адрес, отображаемый в браузере, если тестирование на локальном компьютере: localhost/sample-area/my-action. Вам не нужно переименовывать файлы просмотра или что-то еще. Я был вполне доволен конечным результатом.
После включения атрибутов маршрутизации вы можете удалить любые файлы регистрации области, которые у вас есть, например SampleAreaRegistration.cs.
Эта статья помогла мне прийти к такому выводу. Надеюсь, это вам полезно.
Asp.Net MVC 5 будет поддерживать маршрутизацию атрибутов, позволяя более явный контроль над именами маршрутов. Пример использования будет выглядеть так:
[RoutePrefix("dogs-and-cats")]
public class DogsAndCatsController : Controller
{
[HttpGet("living-together")]
public ViewResult LivingTogether() { ... }
[HttpPost("mass-hysteria")]
public ViewResult MassHysteria() { }
}
Чтобы получить это поведение для проектов с использованием Asp.Net MVC до версии v5, аналогичную функциональность можно найти с помощью проекта AttributeRouting (также доступно как nuget). Фактически, Microsoft обратилась к автору AttributeRouting, чтобы помочь им в их реализации для MVC 5.
Вы можете написать собственный маршрут, который выводится из класса Route класса GetRouteData, чтобы разделить тире, но когда вы вызываете API-интерфейсы для создания URL-адреса, вам нужно будет запомнить тире для имени действия и имени контроллера.
Это не должно быть слишком сложно.
Вы можете определить конкретный маршрут, например:
routes.MapRoute(
"TandC", // Route controllerName
"CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
new {
controller = "Home",
action = "Terms_and_Conditions"
} // Parameter defaults
);
Но этот маршрут должен быть зарегистрирован ПЕРЕД вашим маршрутом по умолчанию.
Если у вас есть доступ к модулю Rewrite URL-адреса IIS (http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx), вы можете просто переписать URL-адреса.
Запросы/my-controller/my-action могут быть переписаны в /mycontroller/myaction, а затем нет необходимости писать пользовательские обработчики или что-то еще. Посетители получают привлекательные URL-адреса, и вы можете понять их MVC.
Вот пример для одного контроллера и действия, но вы можете изменить это как более общее решение:
<rewrite>
<rules>
<rule name="Dashes, damnit">
<match url="^my-controller(.*)" />
<action type="Rewrite" url="MyController/Index{R:1}" />
</rule>
</rules>
</rewrite>
Возможный недостаток этого заключается в том, что вам придется переключить свой проект на использование IIS Express или IIS для перезаписи для работы во время разработки.
Я все еще довольно новичок в MVC, поэтому возьмите его с солью. Это не изящное решение для всех, но помогло в MVC4:
routes.MapRoute(
name: "ControllerName",
url: "Controller-Name/{action}/{id}",
defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);