ActionLink с routeValues ​​создает URL в старом стиле - PullRequest
0 голосов
/ 11 августа 2010

У меня есть маршрут, определенный следующим образом:

    routes.MapRoute(
        "CustomerWithScreenName", // Route name
        "Customer/{sn}/{action}", // e.g. Customer/KingKong89/Schedule
        new { controller = "Customer", action = "Signup", id = "" } // Parameter defaults
    );

Но когда я формулирую ссылку, используя ActionLink, вот так:

<%: Html.ActionLink("Click here", "Schedule", "Customer", new { sn = "KingKong89", new { @class="topLink" } )%>

Полученная гиперссылка / URL выглядит так:

http://localhost:65071/Customer/Schedule?sn=KingKong89

Это работает, но я ожидал, что ActionLink будет использовать известные маршруты и создаст правильную ссылку, которая будет:

http://localhost:65071/Customer/KingKong89/Schedule

Неужели мои ожидания неверны? Это параметрированный URL, как он должен работать?

Примечание: я не указываю {controller} в маршруте. Кажется, я не могу смешать этот маршрут с более ортодоксальным маршрутом {controller} {action} {id} - возможно, мне следует прекратить пытаться быть умным и принять соглашение.

Спасибо за вашу помощь. Люк.

UPDATE

У меня есть теория, что без правильного маршрута (включая специальное ключевое слово {controller}) я ​​не смогу заставить ActionLink создавать правильные URL-адреса.

Так что теперь я обращаю внимание на то, почему этот простой маршрут не работает:

routes.MapRoute(
        "ControllerWithScreenName", // Route name
        "{controller}/{sn}/{action}", // e.g. Customer/Dave/Schedule
        new { controller = "Customer", action = "Signup", sn = "" } // Parameter defaults
        );

Как единственный маршрут, наряду со стандартным «Root», он не играет в мяч. Если имя контроллера добавляется специально (как в первом фрагменте выше), оно делает.

ОБНОВЛЕНИЕ 2

Из-за нехватки времени я разочаровываюсь в своем URL-адресе в стиле param-to-action и возвращаюсь к стандартному контроллеру \ action \ param - это небольшая вещь в великой схеме достижения прогресса и не чувствовать разочарования подавленный.

ОБНОВЛЕНИЕ 3

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

ОБНОВЛЕНИЕ 4

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

1 Ответ

1 голос
/ 11 августа 2010

Во-первых, вы определяете свой маршрут с помощью неиспользуемого параметра, вы должны определить свой маршрут следующим образом

routes.MapRoute(
    "CustomerWithScreenName", // Route name
    "Customer/{sn}/{action}", // e.g. Customer/KingKong89/Schedule
    new { controller = "Customer", action = "Signup", sn= "" } // Parameter defaults
);

sn в вашем определении не определено в ваших параметрах, вместо этого вы определяете id. Определите свой маршрут до маршрута по умолчанию.

Во-вторых, ваша ActionLink должна выглядеть следующим образом

<%= Html.ActionLink("Click here", "Schedule", "Customer", new { sn = "KingKong89" }, new { @class = "topLink" })%>

Наконец, в вашем контроллере ваш параметр для вашего расписания метода действий должен быть sn не id

public ActionResult Schedule(string sn)
{
    return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...