Подтвердить что ты не робот

Asp.net mvc Html.ActionLink() сохранение значения маршрута Я не хочу

У меня есть следующий 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 (обратите внимание на добавление идентификатора)

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Html.RouteLink("About","ActionOnly")

Ответ 3

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

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

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

Ответ 4

Не знаю, почему, но это не сработало для меня (возможно, из-за 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;
        }

Ответ 5

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

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

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

Ответ 6

Я явно задал имя действия как "Действие/". Кажется немного похож на хак, но это быстрое решение.

@Html.ActionLink("Link Name", "Action/", "Controller")

Ответ 7

Другой способ - использовать перегрузку ActionLink (HtmlHelper, String, String, RouteValueDictionary), тогда нет необходимости помещать нуль в последний параметр

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>

Ответ 8

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

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

Ответ 9

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

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

Примечание. Я передал "" для параметра id и null для HTMLATTRIBUTES.