asp.net mvc Html.ActionLink()保持路线的价值,我不想要的

在我看来,我有以下的ActionLink

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

并创build以下URL http://mywebsite.com/Controller/Action

假设我在最后添加了一个ID: http : //mywebsite.com/Controller/Action/53并导航到页面。 在这个页面上我有上面指定的标记。 现在,当我查看它创build的URL时,它看起来像这样:

http://mywebsite.com/Controller/Action/53 (注意添加ID)

但我想要它删除ID,看起来像它原来的,就像这个http://mywebsite.com/Controller/Action (在这里通知没有ID)

任何想法如何我可以解决这个问题? 我不想使用硬编码的URL,因为我的控制器/操作可能会改变。

解决scheme是指定我自己的路由值(下面的第三个参数)

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

这听起来像你需要注册第二个“仅行动”路线,并使用Html.RouteLink()。 首先在你的应用程序启动时注册一个这样的路由:

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

然后,而不是ActionLink来创build这些链接使用:

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

问题在于内置的方法从您当前所在的URL中获取input以及提供的内容。 你可以试试这个:

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

这应该手动擦拭ID参数。

不知道为什么,但它不适合我(也许是因为Mvc2 RC)。 创buildurlhelper方法=>

  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 })) %> 

我需要我的菜单链接是dynamic的。 我没有为每一个页面实现大量额外的代码和路由,而是简单地放弃了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。