Ответ 1
Решение состоит в том, чтобы указать мои собственные значения маршрута (третий параметр ниже)
<%= Html.ActionLink("LinkText", "Action", "Controller",
new { id=string.Empty }, null) %>
У меня есть следующий 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-адреса, так как мой контроллер/действия могут меняться.
Решение состоит в том, чтобы указать мои собственные значения маршрута (третий параметр ниже)
<%= 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>
Детали реализации в этом сообщении в блоге
Я явно задал имя действия как "Действие/". Кажется немного похож на хак, но это быстрое решение.
@Html.ActionLink("Link Name", "Action/", "Controller")
Другой способ - использовать перегрузку ActionLink (HtmlHelper, String, String, RouteValueDictionary), тогда нет необходимости помещать нуль в последний параметр
<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
Мне нужно, чтобы мои ссылки меню были динамическими. Вместо того, чтобы реализовывать много дополнительного кода и маршрутизации для каждой отдельной страницы, я просто обошел хелпер HTML.
<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
Перегрузки Html.ActionLink изменяются в более поздних версиях MVC. На MVC 5 и выше. Вот как это сделать:
@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)
Примечание. Я передал "" для параметра id и null для HTMLATTRIBUTES.