asp.net mvc Html.ActionLink() сохраняет значение маршрута, которое я не хочу
-
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>