asp.net mvc Html.ActionLink () хранит значение маршрута, которое я не хочу - PullRequest
44 голосов
/ 23 апреля 2009

У меня есть следующее ActionLink на мой взгляд

<%= Html.ActionLink("LinkText", "Action", "Controller"); %>

и создает следующий URL http://mywebsite.com/Controller/Action

Допустим, в конце я добавляю идентификатор, например: http://mywebsite.com/Controller/Action/53 и перехожу на страницу. На этой странице у меня есть разметка, которую я указал выше. Теперь, когда я смотрю на URL-адрес, он выглядит так:

http://mywebsite.com/Controller/Action/53 (обратите внимание на добавление ID)

Но я хочу, чтобы он удалил идентификатор и выглядел так, как он это делал изначально, например, http://mywebsite.com/Controller/Action (здесь нет идентификатора)

Есть идеи, как я могу это исправить? Я не хочу использовать жестко закодированные URL, поскольку мой контроллер / действия могут измениться.

Ответы [ 9 ]

44 голосов
/ 24 апреля 2009

Решение состоит в том, чтобы указать мои собственные значения маршрута (третий параметр ниже)

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %>
13 голосов
/ 28 апреля 2010

Похоже, вам нужно зарегистрировать второй маршрут «Только для действий» и использовать Html.RouteLink (). Сначала зарегистрируйте такой маршрут в вашем приложении при запуске:

routes.MapRoute("ActionOnly", "{controller}/{action}", 
   new { controller = "Home", action = "Index" } );

Тогда вместо ActionLink для создания этих ссылок используйте:

Html.RouteLink("About","ActionOnly")
10 голосов
/ 23 апреля 2009

Проблема заключается в том, что встроенные методы берут ввод с URL-адреса, на котором вы в данный момент находитесь, а также с того, что вы предоставляете. Вы можете попробовать это:

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>

Это должно вручную стереть параметр id.

4 голосов
/ 30 июля 2014

Я явно установил имя действия как «Действие /». Похоже, что взломать, но это быстро исправить.

@Html.ActionLink("Link Name", "Action/", "Controller")
4 голосов
/ 21 августа 2013

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

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a>

Подробности реализации в этом сообщении в блоге

4 голосов
/ 21 января 2010

Не знаю почему, но у меня это не сработало (возможно из-за Mvc2 RC). Создан метод urlhelper =>

 public static string
            WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues)
        {
            var rv = helper.RequestContext.RouteData.Values;
            var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList();
            foreach (var ignoredValue in ignoredValues)
                rv.Remove(ignoredValue.Key);
            var res = helper.Action(action);
            foreach (var ignoredValue in ignoredValues)
                rv.Add(ignoredValue.Key, ignoredValue.Value);
            return res;
        }
2 голосов
/ 26 августа 2010

Другим способом является использование перегрузки ActionLink (HtmlHelper, String, String, RouteValueDictionary), тогда нет нужды указывать значение null в последнем параметре

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
1 голос
/ 14 августа 2017

Перегрузки Html.ActionLink изменены в более поздних версиях MVC. На MVC 5 и выше. Вот как это сделать:

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)

Примечание: я передал "" для параметра id и ноль для HTMLATTRIBUTES.

0 голосов
/ 28 января 2014

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

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
...