Bao gồm một thẻ neo trong ASP.NET MVC Html.ActionLink


151

Trong ASP.NET MVC, tôi đang cố gắng tạo một liên kết bao gồm thẻ neo (nghĩa là hướng người dùng đến một trang và một phần cụ thể của trang).

URL tôi đang cố gắng tạo sẽ giống như sau:

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

Định tuyến của tôi được thiết lập với tiêu chuẩn:

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

Cú pháp liên kết hành động mà tôi đang sử dụng là:

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

Phương pháp điều khiển của tôi như sau:

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

   return View(itemList);
}

Ở trên trả về một URL chính xác như sau:

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

Tôi không thể tìm ra cách thêm phần # phần12 . Từ "phần" chỉ là quy ước tôi đang sử dụng để chia nhỏ các phần của trang và 12 là ID của danh mục con, tức là child.ID.

Tôi có thể làm cái này như thế nào?

Câu trả lời:


97

Tôi có thể sẽ xây dựng liên kết bằng tay, như thế này:

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

20
Nên thực sự sử dụng quá tải cho ActionLink như được mô tả bởi @Brad Wilson.
mattruma

18
@mattruma xin lỗi tôi không đồng ý. HÔN. Tại sao có một thành viên đầy đủ các tham số, một số trong số đó là null, khi bạn có thể chỉ cần nói rõ ràng. Bất cứ ai cũng có thể thấy những gì ở trên có nghĩa là theo đó phản ứng của Brad bị chia rẽ và đòi hỏi bạn phải đào sâu vào vấn đề. Quá nhiều tham số là một mẫu chống được công nhận .. c2.com/cgi/wiki?TooManyParameter
Ed Blackburn

2
Tôi đồng ý. Cả hai phương pháp đều hoạt động, nhưng vì cách các đoạn được chỉ định trong URL sẽ không thay đổi trong tương lai gần, tôi nghĩ rằng cách này thực sự dễ đọc và rõ ràng hơn trong ý định của nó. Nếu cần, bạn vẫn có thể mở rộng Urlhoặc Htmlđối tượng bằng một phương thức tùy chỉnh bao gồm một cách đơn giản để thêm chuỗi phân đoạn.
LorenzCK

282

Có quá tải ActionLink có tham số phân đoạn . Vượt qua "phần 12" là đoạn của bạn sẽ giúp bạn có được hành vi mà bạn theo đuổi.

Ví dụ: gọi Phương thức LinkExtensions.ActionLink (HtmlHelper, Chuỗi, Chuỗi, Chuỗi, Chuỗi, Chuỗi, Chuỗi, Đối tượng, Đối tượng) :

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

1
Là những quá tải một phần của một thư viện mở rộng? Tôi dường như không có được chúng.
lựu đạn

Có hai: ActionLink chuỗi tĩnh (HtmlHelper htmlHelper, chuỗi linkText, chuỗi actionName, chuỗi controlName, giao thức chuỗi, chuỗi hostName, đoạn chuỗi, object routeValues, object htmlAttribution); chuỗi tĩnh tĩnh ActionLink (chuỗi HtmlHelper htmlHelper này, chuỗi linkText, chuỗi actionName, chuỗi controlName, giao thức chuỗi, chuỗi hostName, chuỗi phân đoạn, RouteValueDixi routeValues, IDadata <string, object> htmlAttribution);
Brad Wilson

11
Đây nên là câu trả lời.
Rubens Mariuzzo

1
Sự quá tải của Html.ActionLink cho phép đặc tả một neo bằng cách chuyển đoạn, buộc bạn phải vượt qua bộ điều khiển theo tên. Tôi không thích điều đó. Nếu tên bộ điều khiển không chính xác, các ngoại lệ trong thời gian chạy sẽ xảy ra, thay vì lỗi biên dịch.
R. Schreurs

1
@RobertMcKee nếu văn bản liên kết của bạn không chỉ là văn bản, thì Html.ActionLink()sẽ không hoạt động trong bất kỳ kịch bản nào - bạn sẽ cần sử dụng href=@Url.Action()cú pháp kiểu.
Katstevens

15

Tôi không nhớ phiên bản nào của ASP.NET MVC (Tôi tin rằng ASP.NET MVC 3+) / Dao cạo tham số hoặc bất cứ thứ gì nó được gọi là tính năng (tham số: x) đã được giới thiệu, nhưng với tôi đây chắc chắn là cách thích hợp để xây dựng một liên kết với một neo trong ASP.NET MVC.

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

Ngay cả lập luận chống phản xạ của Ed Blackburns từ câu trả lời này cũng có thể cạnh tranh với điều đó.


1
Nghĩa đen điều này đã cứu cuộc đời tôi Ghi nhận bài đăng của bạn dưới dạng giải pháp của tôi ở đây stackoverflow.com/questions/32420028/ .
Matthew

11

Tôi chỉ làm như thế này:

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

1

Đây là ví dụ thực tế

@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")

Và trang đích có 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

Giải pháp của tôi sẽ hoạt động nếu bạn áp dụng ActionFilter cho phương thức hành động Tiểu thể loại, miễn là bạn luôn muốn chuyển hướng người dùng đến cùng một dấu trang:

http://spikehd.blogspot.com/2012/01/mvc3-redirect-action-to-html-bookmark.html

Nó sửa đổi bộ đệm HTML và xuất ra một đoạn javascript nhỏ để hướng dẫn trình duyệt nối thêm dấu trang.

Tất nhiên, bạn có thể sửa đổi javascript để cuộn thủ công, thay vì sử dụng dấu trang trong URL!

Hy vọng nó giúp :)


0

Tôi đã làm điều đó và nó hoạt động để chuyển hướng sang chế độ xem khác Tôi nghĩ rằng nếu bạn thêm #sectionLink sau khi nó sẽ hoạt động

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.