Asp.Net MVC: как включить тире в моих URL? - PullRequest
74 голосов
/ 27 августа 2008

Мне бы хотелось, чтобы в моих URL-адресах были тире отдельные слова. Так что вместо:

/MyController/MyAction

Я бы хотел:

/My-Controller/My-Action

Возможно ли это?

Ответы [ 9 ]

150 голосов
/ 12 февраля 2009

Вы можете использовать атрибут ActionName следующим образом:

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

Обратите внимание, что тогда вам нужно будет вызвать ваш файл View "My-Action.cshtml" (или соответствующее расширение). Вам также нужно будет ссылаться на «my-action» в любых методах Html.ActionLink.

Не существует такого простого решения для контроллеров.

Редактировать: Обновление для MVC5

Включить маршруты по всему миру:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

Теперь с 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
15 голосов
/ 16 марта 2010

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

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 с дефисами

11 голосов
/ 03 августа 2013

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

Прописные URL-адреса проблематичны, потому что пути к файлам cookie чувствительны к регистру, большая часть интернета фактически чувствительна к регистру, а технологии Microsoft рассматривают URL-адреса как регистрозависимые. ( Больше на моем блоге )

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

Чтобы установить его, просто откройте окно NuGet в Visual Studio, щелкнув правой кнопкой мыши Project и выбрав диспетчер пакетов NuGet, и на вкладке «Онлайн» введите «Строчный пунктирный маршрут», и он должен появиться.

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

Install-Package LowercaseDashedRoute

После этого вы должны открыть App_Start / RouteConfig.cs и закомментировать существующий маршрут. Вызов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

7 голосов
/ 17 января 2014

Вот что я делал, используя области в 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.

Эта статья помогла мне прийти к такому выводу. Я надеюсь, что это полезно для вас.

3 голосов
/ 04 августа 2013

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.

1 голос
/ 08 мая 2012

Вы можете определить конкретный маршрут, например:

routes.MapRoute(
    "TandC", // Route controllerName
    "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
    new {
        controller = "Home",
        action = "Terms_and_Conditions"
    } // Parameter defaults
);

Но этот маршрут должен быть зарегистрирован ДО вашего маршрута по умолчанию.

1 голос
/ 27 августа 2008

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

Это не должно быть слишком сложно.

0 голосов
/ 03 июля 2013

Я все еще довольно новичок в MVC, так что возьмите его с крошкой соли. Это не элегантное, всеобъемлющее решение, но оно помогло мне в MVC4:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
0 голосов
/ 08 декабря 2012

Если у вас есть доступ к модулю перезаписи 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 для переписывания для работы во время разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...