在ASP.NET MVC Html.ActionLink中包含锚标记


151

在ASP.NET MVC中,我试图创建一个包含锚标记的链接(即,将用户定向到页面以及页面的特定部分)。

我尝试创建的URL应该如下所示:

<a href="/category/subcategory/1#section12">Title for a section on the page</a>

我的路由设置为以下标准:

routes.MapRoute("Default", "{controller}/{action}/{categoryid}"); 

我正在使用的动作链接语法是:

<%foreach (Category parent in ViewData.Model) { %>
<h3><%=parent.Name %></h3>
<ul>
<%foreach (Category child in parent.SubCategories) { %>
    <li><%=Html.ActionLink<CategoryController>(x => x.Subcategory(parent.ID), child.Name) %></li>
<%} %>
</ul>
<%} %>

我的控制器方法如下:

public ActionResult Subcategory(int categoryID)
{
   //return itemList

   return View(itemList);
}

上面的代码正确地返回了一个URL,如下所示:

<a href="/category/subcategory/1">Title for a section on the page</a>

我不知道如何添加#section12部分。“区段”一词只是我用来拆分页面区段的约定,而12是子类别的ID,即child.ID。

我怎样才能做到这一点?

Answers:


97

我可能会手动构建链接,如下所示:

<a href="<%=Url.Action("Subcategory", "Category", new { categoryID = parent.ID }) %>#section12">link text</a>

20
如@Brad Wilson所述,应该真正使用ActionLink的重载。
mattruma 2010年

18
@mattruma对不起,我不同意。吻。当您可以简单地显式声明成员时,为什么要让成员具有完整的参数,其中一些参数保留为null。任何人都可以看到以上含义意味着Brad的响应令人费解,并需要您深入了解智能。太多的参数是公认的反模式。c2.com/cgi/wiki?TooManyParameters
Ed Blackburn'2

2
我同意。这两种方法都可以使用,但是由于在URL中指定片段的方式在不久的将来不会改变,因此我认为这种方法实际上更具可读性和意图。如果需要,您仍然可以使用自定义方法扩展Urlor Html对象,该方法包括添加片段字符串的简单方法。
LorenzCK '02

282

有一些采用片段参数的ActionLink重载。将“ section12”作为片段传递将使您获得所要遵循的行为。

例如,调用LinkExtensions.ActionLink方法(HtmlHelper,字符串,字符串,字符串,字符串,字符串,字符串,对象,对象)

<%= Html.ActionLink("Link Text", "Action", "Controller", null, null, "section12-the-anchor", new { categoryid = "blah"}, null) %>

1
这些重载是扩展库的一部分吗?我似乎没有得到他们。
手榴弹

有两个:公共静态字符串ActionLink(此HtmlHelper htmlHelper,字符串linkText,字符串actionName,字符串controllerName,字符串协议,字符串hostName,字符串片段,对象routeValues,对象htmlAttributes);公共静态字符串ActionLink(此HtmlHelper htmlHelper,字符串linkText,字符串actionName,字符串controllerName,字符串协议,字符串hostName,字符串片段,RouteValueDictionary routeValues,IDictionary <string,object> htmlAttributes);
布拉德·威尔逊

11
这应该是答案。
Rubens Mariuzzo 2012年

1
Html.ActionLink的重载允许通过传递片段来指定锚点,从而迫使您按名称传递控制器。我不喜欢 如果控制器名称不正确,则会发生运行时异常,而不是编译错误。
R. Schreurs 2013年

1
@RobertMcKee如果您的链接文本不只是文本,则Html.ActionLink()在任何情况下均不起作用-您将需要使用href=@Url.Action()样式语法。
Katstevens

15

我不记得在哪个版本的ASP.NET MVC(我相信是ASP.NET MVC 3 +)/ Razor中引入了parameterlabeldeclaration或任何它所谓的(参数:x)功能,但是对我来说,这绝对是正确的方法在ASP.NET MVC中使用锚点构建链接。

@Html.ActionLink("Some link text", "MyAction", "MyController", protocol: null, hostName: null, fragment: "MyAnchor", routeValues: null, htmlAttributes: null)

甚至这个答案中的 Ed Blackburns反模式论点都无法与之抗衡。


1
从字面上看,这救了我一命。在此处stackoverflow.com/questions/32420028/…将您的帖子作为我的解决方案。
马修

11

我只是这样做:

<a href="@Url.Action("Index","Home")#features">Features</a>

1

这是现实生活中的例子

@Html.Grid(Model).Columns(columns =>
    {
           columns.Add()
                   .Encoded(false)
                   .Sanitized(false)
                   .SetWidth(10)
                   .Titled(string.Empty)
                   .RenderValueAs(x => @Html.ActionLink("Edit", "UserDetails", "Membership", null, null, "discount", new { @id = @x.Id }, new { @target = "_blank" }));

  }).WithPaging(200).EmptyText("There Are No Items To Display")

并且目标页面具有TABS

<ul id="myTab" class="nav nav-tabs" role="tablist">

        <li class="active"><a href="#discount" role="tab" data-toggle="tab">Discount</a></li>
    </ul>


0

我做到了,它可以重定向到其他视图,我认为如果您在#sectionLink之后添加它将起作用

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.