Asp.net mvc asp.net mvc Html.ActionLink()保留路径值I don';我不想要
在我看来,我有以下ActionLinkAsp.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,因为我的控制器/操作可能会
<%= 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)