รวมถึงแท็กจุดยึดใน ASP.NET MVC Html.ActionLink


151

ใน ASP.NET MVC ฉันพยายามสร้างลิงค์ที่มีแท็กจุดยึด (กล่าวคือนำผู้ใช้ไปยังหน้าและส่วนเฉพาะของหน้า)

URL ที่ฉันพยายามสร้างควรมีลักษณะดังนี้:

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

My routing ถูกตั้งค่าด้วยมาตรฐาน:

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>

ฉันไม่สามารถคิดออกว่าจะเพิ่ม# มาตรา 12ส่วนหนึ่ง คำว่า "ส่วน" เป็นเพียงการประชุมที่ฉันใช้เพื่อแยกส่วนของหน้าและ 12 คือ ID ของหมวดหมู่ย่อยเช่น child.ID

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


97

ฉันอาจจะสร้างลิงค์ด้วยตนเองเช่นนี้

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

20
ควรใช้โอเวอร์โหลดสำหรับ ActionLink ตามที่อธิบายโดย @Brad Wilson
mattruma

18
@mattruma ขอโทษฉันไม่เห็นด้วย จูบ. เหตุใดจึงมีสมาชิกที่เต็มไปด้วยพารามิเตอร์ซึ่งบางอันถูกปล่อยให้ว่างเมื่อคุณสามารถระบุได้อย่างชัดเจน ทุกคนสามารถเห็นความหมายข้างต้นที่แบรดตอบสนองได้อย่างชัดเจนและต้องการให้คุณเจาะเข้าไปในระบบ Intellisense พารามิเตอร์มากเกินไปเป็นรูปแบบการต่อต้านที่ได้รับการยอมรับ .. c2.com/cgi/wiki?TooManyParameters
Ed Blackburn

2
ฉันเห็นด้วย. ทั้งสองวิธีใช้งานได้ แต่เนื่องจากวิธีการระบุแฟรกเมนต์ใน URL จะไม่เปลี่ยนแปลงในอนาคตอันใกล้ฉันจึงคิดว่าวิธีนี้อ่านได้ง่ายกว่าและชัดเจนกว่าในเจตนาของมัน หากจำเป็นคุณยังสามารถขยายUrlหรือHtmlวัตถุด้วยวิธีการที่กำหนดเองซึ่งรวมถึงวิธีง่ายๆในการเพิ่มสตริงส่วน
LorenzCK

282

มี ActionLink เกินพิกัดซึ่งรับพารามิเตอร์ส่วน ผ่าน "section12" เนื่องจากชิ้นส่วนของคุณจะทำให้คุณได้รับพฤติกรรมตามที่คุณต้องการ

ตัวอย่างเช่นการเรียกLinkExtensions.ActionLink Method (HtmlHelper, String, String, String, String, String, String, Object, Object) :

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

1
โอเวอร์โหลดเหล่านี้เป็นส่วนหนึ่งของไลบรารีส่วนขยายหรือไม่ ฉันดูเหมือนจะไม่ได้รับพวกเขา
ลูกระเบิดมือ

มีอยู่สองประการ: สตริงคงที่สาธารณะ ActionLink (HtmlHelper นี้ htmlHelper, สตริง linkText, สตริง actionName, ตัวควบคุมสตริง, ชื่อสตริงคอนโทรลเลอร์, โปรโตคอลสตริง, สตริงชื่อโฮสต์สตริง, ส่วนสตริงวัตถุ, เส้นทางวัตถุค่า, วัตถุ htmlAttributes); สตริงคงที่สาธารณะ ActionLink (HtmlHelper นี้ htmlHelper, สตริง linkText, สตริง actionName, ตัวควบคุมสตริง, โปรโตคอลสตริง, สตริงชื่อโฮสต์สตริง, ส่วนสตริงสตริง, RouteValueDictionary เส้นทางค่า, IDictionary <สตริงวัตถุ> htmlAttributes);
แบรดวิลสัน

11
นี่ควรเป็นคำตอบ
รูเบนส์ Mariuzzo

1
Hload.ActionLink โอเวอร์โหลดของ Html.ActionLink ที่อนุญาตให้ใช้สเปคของสมอโดยผ่านแฟรกเมนต์บังคับให้คุณผ่านตัวควบคุมตามชื่อ ฉันไม่ชอบสิ่งนั้น ถ้าชื่อตัวควบคุมไม่ถูกต้องจะเกิดข้อยกเว้นขณะทำงานแทนข้อผิดพลาดในการคอมไพล์
R. Schreurs

1
@RobertMcKee หากข้อความลิงค์ของคุณเป็นมากกว่าข้อความแล้วHtml.ActionLink()จะไม่ทำงานในสถานการณ์ใด ๆ - คุณจะต้องใช้href=@Url.Action()ไวยากรณ์สไตล์
Katstevens

15

ฉันจำไม่ได้ว่า ASP.NET MVC รุ่นใด (ASP.NET MVC 3+ ที่ฉันเชื่อ) / ตัดทอนพารามิเตอร์labeldeclarationหรือสิ่งที่เรียกว่า (พารามิเตอร์: x) มีการแนะนำคุณสมบัติ แต่สำหรับฉันแล้วนี่เป็นวิธีที่เหมาะสมในการ สร้างลิงค์ด้วยจุดยึดใน ASP.NET MVC

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

ไม่ใช่แม้แต่ข้อโต้แย้งของเอ็ดแบล็กเบิร์นจากคำตอบนี้สามารถแข่งขันกับเรื่องนั้นได้


1
แท้จริงนี่ช่วยชีวิตฉันไว้ได้ เจตนารมณ์การโพสต์ของคุณเป็นวิธีการแก้ปัญหาของฉันที่นี่stackoverflow.com/questions/32420028/...
แมทธิว


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

โซลูชันของฉันจะใช้งานได้หากคุณใช้ ActionFilter กับวิธีการกระทำของประเภทย่อยตราบใดที่คุณต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังบุ๊คมาร์คเดียวกัน:

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

มันปรับเปลี่ยนบัฟเฟอร์ HTML และส่งออกชิ้นส่วนเล็ก ๆ ของจาวาสคริปต์เพื่อแนะนำเบราว์เซอร์เพื่อผนวกบุ๊คมาร์ค

คุณสามารถปรับเปลี่ยนจาวาสคริปต์เพื่อเลื่อนด้วยตนเองแทนการใช้บุ๊กมาร์กใน URL แน่นอน!

หวังว่าจะช่วย :)


0

ฉันทำอย่างนั้นและทำงานเพื่อเปลี่ยนเส้นทางไปยังมุมมองอื่นฉันคิดว่าถ้าคุณเพิ่ม #sectionLink หลังจากนั้นจะใช้งานได้

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.