Asp.Net MVC:Как включить тире в URL-адресах?

StackOverflow https://stackoverflow.com/questions/30310

  •  09-06-2019
  •  | 
  •  

Вопрос

Я бы хотел, чтобы в моих URL-адресах слова были разделены тире.Итак, вместо:

/MyController/MyAction

Я хотел бы:

/My-Controller/My-Action

Это возможно?

Это было полезно?

Решение

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

[ActionName("My-Action")]
public ActionResult MyAction() {
    return 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

Другие советы

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

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, щелкнув правой кнопкой мыши проект и выбрав Диспетчер пакетов 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

Вот что я сделал, используя области в 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 до версии 5, аналогичную функциональность можно найти с помощью Проект 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
);

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

Если у вас есть доступ к модулю перезаписи 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 }
);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top