Изменение поведения маршрутизации контроллера ASP.NET MVC 3 - PullRequest
2 голосов
/ 26 мая 2011

Допустим, у меня есть несколько контроллеров с длинными именами, например VeryLongNameController.

По умолчанию ASP.NET MVC3 сопоставит ~ / VeryLongName или ~ / verylongname с этим контроллером.Однако мне не нравится использование заглавных имен в URL-адресе, и я бы хотел, чтобы вместо них отображались все контроллеры с длинными именами, такие как ~ / very-long-name.

Я знаю, что можно добавить собственные маршруты одинпо одному, но есть ли способ изменить поведение по умолчанию?

Ответы [ 3 ]

4 голосов
/ 26 мая 2011

Вы можете, вам нужно предоставить свой собственный обработчик маршрута, реализующий IRouterHandler, есть хороший пример здесь .

0 голосов
/ 27 мая 2011

Я исследовал это немного больше и получил его, создав свои собственные IHttpHandler и IRouteHandler, просматривая источник для System.Web.Mvc.MvcHandler и System.Web. Mvc.MvcRouteHandler и в основном копирование, вставка и замена способа разрешения имени контроллера. Однако этот подход мне совсем не нравится, так как он кажется слишком тяжелым, чтобы переделать всю трубу обработки запросов для простой косметической задачи. Поэтому я добавлю ручные маршруты для каждого контроллера с двумя именами (которых не так много).

ОБНОВЛЕНИЕ: я пришел с гораздо более простым решением, и это делается путем переопределения ControllerFactory.

public class ControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, 
        string controllerName)
    {
        requestContext.RouteData.Values["action"] =
            requestContext.RouteData.Values["action"].ToString().Replace("-", "");
        return base.CreateController(requestContext, controllerName.Replace("-",""));
    }
}

Мой пост в блоге об этом: http://cangencer.wordpress.com/2011/05/27/better-looking-urls-in-asp-net-mvc-3/

0 голосов
/ 26 мая 2011

Вы можете использовать атрибут ActionName специально для метода действия, но не для контроллера.


[ActionName("an-action-with-long-name")]
public ActionResult AnActionWithLongName() {
  // ...
}

Также - я предпочитаю добавлять маршрут для каждого контроллера / метода действия, чтобы не создавать никаких неожиданных отображений (я тоже их тестирую на модуле) - так что это одно из соображений.

...