asp.net mvc Html.ActionLink()保留我不想要的路由值

时间:2009-04-23 07:21:27

标签: asp.net-mvc actionlink

我在视图中有以下ActionLink

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

并创建以下网址http://mywebsite.com/Controller/Action

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

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

但是我希望它删除ID并看起来像它原来的那样http://mywebsite.com/Controller/Action(注意这里没有ID)

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

9 个答案:

答案 0 :(得分:44)

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

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

答案 1 :(得分:13)

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

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

然后使用以下代替ActionLink来创建这些链接:

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

答案 2 :(得分:10)

问题是内置方法从您当前使用的URL以及您提供的内容中获取输入。你可以试试这个:

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

那应该手动擦除id参数。

答案 3 :(得分:4)

不知道为什么,但它对我不起作用(也许是因为Mvc2 RC)。创建了urlhelper方法=&gt;

 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;
        }

答案 4 :(得分:4)

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

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

实施细节为in this blog post

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

另一种方法是使用ActionLink(HtmlHelper,String,String,RouteValueDictionary)重载,然后不需要在最后一个参数中放入

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

答案 7 :(得分:1)

在更高版本的MVC上更改了Html.ActionLink的重载。在MVC 5及以上版本。这是怎么做的:

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

注意我通过了#34;&#34;对于id参数,对于HTMLATTRIBUTES为null。

答案 8 :(得分:0)

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

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