Asp.net mvc asp.net mvc Html.ActionLink()保留路径值I don';我不想要

Asp.net mvc asp.net mvc Html.ActionLink()保留路径值I don';我不想要,asp.net-mvc,actionlink,Asp.net Mvc,Actionlink,在我看来,我有以下ActionLink <%= Html.ActionLink("LinkText", "Action", "Controller"); %> 并创建以下URL 假设我像这样在末尾添加一个ID:并导航到该页面。在这个页面上,我有上面指定的标记。现在,当我查看它创建的URL时,它看起来是这样的: (注意添加的ID) 但是我想让它删除ID,看起来就像它原来那样,就像这样(注意这里没有ID) 有没有办法解决这个问题?我不想使用硬编码的URL,因为我的控制器/操作可能会

在我看来,我有以下ActionLink

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

并创建以下URL

假设我像这样在末尾添加一个ID:并导航到该页面。在这个页面上,我有上面指定的标记。现在,当我查看它创建的URL时,它看起来是这样的:

(注意添加的ID)

但是我想让它删除ID,看起来就像它原来那样,就像这样(注意这里没有ID)


有没有办法解决这个问题?我不想使用硬编码的URL,因为我的控制器/操作可能会更改。

问题在于内置方法会从您当前所在的URL以及您提供的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;
        }

听起来您需要注册第二个“仅操作”路由并使用Html.RouteLink()。首先在应用程序启动时注册如下路由:

routes.MapRoute("ActionOnly", "{controller}/{action}", 
   new { controller = "Home", action = "Index" } );
然后,不要使用ActionLink来创建这些链接,而是使用:

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

另一种方法是使用ActionLink(HtmlHelper、String、String、RouteValueDictionary)重载,这样就不需要在最后一个参数中输入null

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

如果您不知道需要显式重写哪些值,或者只是想避免额外的参数列表,则可以使用如下扩展方法

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


实现细节是

我需要动态的菜单链接。我没有为每个页面实现大量额外的代码和路由,而是简单地省去了HTML助手

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

我明确地将操作名称设置为“action/”。看起来有点像黑客,但这是一个快速修复

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

Html.ActionLink的重载在更高版本的MVC上更改。在MVC5及以上版本上。这就是如何做到这一点:

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

注意,我为id参数传递了“”,为HTMLATTRIBUTES传递了null

谢谢你的回答,我在另一种情况下需要它,但是你用它击中了我的头!这看起来有点笨拙。。。我需要做同样的事情,但我认为我可能必须创建一个新的扩展方法,如Arnis L,所以这似乎是功能应该内置到框架中,因为这种情况经常出现。例如,有一个菜单,您不希望菜单链接包含所有参数,只希望actioni使用.NET 4和mvc2,但string.empty不能解决上述问题,actionlink仍保留环境值我也有同样的问题(使用mvc2 RTM)。我将路径值称为
plan
,最后一条(默认)路径将其添加为
?plan=X
。因此,我为我的
plan
路线值添加了最后一条(默认)路线的默认值,即
plan=string.Empty
。即使路由定义没有定义名为
plan
的URL段变量。只要它能工作,我就可以使用它。我使用了它的一个变体来可靠而优雅地解决这个问题。+1用于使用
Html.RouteLink()
。为我工作-您还可以指定RouteValue,以便MVC丢失当前操作并返回到索引或其他内容,例如
@Html.RouteLink(“取消”,“ThisSection_default”,new{action=“index”})
。有关此问题和解决方法的官方解释,请参阅。我也必须这样做,链接是指向索引,所以我只能用“/”作为动作@ActionLink(“Link Name”,“/”,“Controller”)干净简单,非常好+1这是一个肮脏的黑客行为。。。但这仍然是迄今为止我找到的最好的解决方案。
@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)