MVC Routing Html.ActionLink создает URL с? Id = 1 вместо / id - PullRequest
5 голосов
/ 04 января 2012

Когда я использую Html.ActionLink (), созданный URL-адрес не в нужном формате:

Html.ActionLink(Model.ProductCode, "Update", new { id = Model.ProductId })

Делает этот URL-адрес

/Update?id=1

Когда я хочу иметь этот URL-адрес

/Update/1

Какие параметры маршрутизации создают второй URL?Это наш предпочтительный стиль URL.

Оба URL работают и отображается правильная страница - однако мы хотим использовать только / id

В Global.asax маршрут MVC по умолчанию обрабатывает оба URL

routes.MapRoute(
    "Default",                                               // Route name
    "{controller}/{action}/{id}",                            // URL with parameters
    new { controller = "Home", action = "Index", id = "" }); // Parameter defaults

Ответы [ 4 ]

3 голосов
/ 04 января 2012

Я могу повторить проблему, имея маршрут о моем маршруте по умолчанию, который все еще соответствует общему шаблону.Пример:

routes.MapRoute(
                            "Default2", // Route name
                            "{controller}/{action}", // URL with parameters
                            new { controller = "Home", action = "Index"} // Parameter defaults
                        );

Когда места выше моего маршрута по умолчанию, я получаю? Id = 1 в моем URL.Можете ли вы подтвердить, что эта ссылка не соответствует ни одному из маршрутов выше ожидаемого маршрута?

РЕДАКТИРОВАТЬ: приведенный ниже не влияет на URL

Однакоеще может быть полезно использовать UrlParameter.Optional в других сценариях.Уход за процветанием, если в правиле толпы не указано иное.

new UrlParameter.Optional value.Если вы установите значение по умолчанию для параметра URL на это специальное значение, MVC обязательно удалит этот ключ из словаря значений маршрута, чтобы он не существовал.

Я думаю, вам нужно настроитьваш маршрут слегка.Измените id = "" на id = UrlParameter.Optional

routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });

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

0 голосов
/ 20 сентября 2016
routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
0 голосов
/ 11 сентября 2015

Я просто наткнулся на это и решил ответить. Оказалось, что и Url.Action (), и Html.ActionLink () используют первый маршрут в коллекции маршрутов для форматирования полученного URL. Итак, первый сопоставленный маршрут в шилде RegisterRoutes () будет:

routes.MapRoute(
  name: "Default",
  url: "{controller}/{id}/{action}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

вместо "{controller} / {action} / {id}". Название маршрута (т. Е. «По умолчанию») не имеет значения, имеет значение только порядок

0 голосов
/ 04 января 2012

См. Этот вопрос / ответ .

Какую версию MVC вы используете? Если вы находитесь в MVC3, вам нужно добавить четвертый параметр к вашему вызову в Html.ActionLink(), передавая null.

...