Пользовательские маршруты MVC и ActionLinks - PullRequest
5 голосов
/ 18 января 2010

Мы работаем с приложением asp.net mvc, которое используется несколькими клиентами. Нам нужно, чтобы URL-адреса включали дружественные имена клиентов. Например:

domain.com / CLIENTNAME / контроллер / действие / Идентификатор

Это ниже, кажется, работает, когда дело доходит до маршрутизации, но "clientName" генерируется неправильно для помощников ссылки действия.

_routes.MapRoute("DefaultRoute",
                "{clientName}/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = string.Empty },
                new { clientName = @"[\w-]+" });

Мы бы хотели продолжить использование вспомогательных методов Html.ActionLink, но в сгенерированную ссылку он не включал clientName Нужно ли нам писать собственных помощников в этом сценарии или есть альтернативный подход?

Кто-нибудь еще создал приложение с этим типом сценария маршрутизации? Любые предложения будут оценены!

Ответы [ 3 ]

11 голосов
/ 19 января 2010

По моему опыту, метод ActionLink, на который ссылается Дарин, сгенерирует URL, например:

http://host/Home/action?clientName=someClient

Если вы хотите создать URL-адрес в точности так, как вы указали. Проверьте метод RouteLink , который позволяет вам указать название маршрута, который вам подходит:

<%= Html.RouteLink("some text", "DefaultRoute", new { clientName = "someclient" })%>
7 голосов
/ 19 января 2010

Вам необходимо указать значения маршрута:

<%= Html.ActionLink("some text", "action", new { clientName = "someclient" })%>

Будет сгенерировано:

http://host/someclient/Home/action

Вы также можете указать значение по умолчанию при объявлении маршрута:

_routes.MapRoute("DefaultRoute",
    "{clientName}/{controller}/{action}/{id}",
    new { 
        controller = "Home", 
        action = "Index", 
        id = string.Empty, 
        clientName = "defaultClient" },
    new { clientName = @"[\w-]+" });
0 голосов
/ 19 января 2010

То, что вы пытаетесь сделать, должно работать без необходимости использовать RouteLink или указывать анонимный объект. Убедитесь в правильности регистраций вашего маршрута. Например, если у вас есть что-то вроде:

routes.MapRoute("Base", 
                string.Empty,
                new { controller = "Home", 
                action = "Index", 
                id = string.Empty });

перед вашим DefaultRoute , это может привести к тому, что вызовы ActionLink будут возвращать странные результаты. Я был сожжен этим раньше.

...