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

StackOverflow https://stackoverflow.com/questions/780643

  •  13-09-2019
  •  | 
  •  

Вопрос

На мой взгляд, у меня есть следующая 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 (обратите внимание, здесь нет удостоверения личности)

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обратите внимание, что я передал "" для параметра id и null для HTMLATTRIBUTES.

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

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top