ใช้ Html.ActionLink เพื่อเรียกการกระทำบนคอนโทรลเลอร์อื่น


224

ActionLinkฉันกำลังพยายามที่จะนำทางระหว่างตัวควบคุมการใช้ ฉันจะบอกปัญหาของฉันด้วยตัวอย่าง

ฉันอยู่ในมุมมองดัชนีของตัวควบคุม Hat และฉันพยายามใช้รหัสด้านล่างเพื่อสร้างลิงก์ไปยังการกระทำรายละเอียดของตัวควบคุมผลิตภัณฑ์

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

แทนที่จะสร้างลิงค์ไปที่ Details on Product controller สิ่งนี้จะสร้างลิงค์ไปยัง Details action ภายใต้ Hat controller และต่อท้ายพารามิเตอร์ Length ที่ส่วนท้ายของมัน:

Hat/Details/9?Length=7

ฉันไม่สามารถใช้HTML.ActionLinkเพื่อสลับระหว่างตัวควบคุมได้เนื่องจากปัญหานี้ ฉันจะขอบคุณถ้าคุณสามารถชี้ให้ฉันในสิ่งที่ฉันทำผิด ขอบคุณ

PS: ฉันกำลังใช้การตั้งค่าเส้นทางเริ่มต้นที่มาพร้อมกับ MVC

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

คำตอบ:


409

สิ่งที่คุณต้องการคือการโอเวอร์โหลด:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
คุณช่วยอธิบายได้ไหมว่าทำไมการโอเวอร์โหลดที่เฉพาะเจาะจงนี้และ korki ไม่ทำงาน การตั้งค่า htmlAttributes ให้เป็นโมฆะมีผลต่อการกำหนดเส้นทางของลิงก์อย่างไร
Derek Hunziker

35
เป็นเพราะถ้าคุณใช้พารามิเตอร์อื่นมันจะถือว่าอาร์กิวเมนต์ที่สามคือรูทีนย่อยและอาร์กิวเมนต์ที่ 4 คือ htmlattributes การเพิ่มอาร์กิวเมนต์ที่ 5 บังคับให้วิธีการใช้การโอเวอร์โหลดที่ถูกต้อง สะบัดผ่านการโอเวอร์โหลดใน Intellisense และสิ่งนี้จะทำให้รู้สึกมากขึ้น
Banford

2
มากเกินไปของ ActionLink เงอะงะจริงๆ จุดทั้งหมดของการยอมรับ 'object routeValues' แทน RouteValueCollection คือการลดปริมาณการพิมพ์ อย่างไรก็ตามคุณต้องพิมพ์ค่าว่างพิเศษ ที่ไม่ใช่งานง่ายและเคาน์เตอร์ประสิทธิผล ...
TiMoch

3
ฉันยอมรับพารามิเตอร์เกินพิกัดได้รับการออกแบบมาไม่ดี .. ฉันคิดว่ามันเป็นข้อผิดพลาดมาเป็นเวลานาน ฉันต้องจ้องมองครั้งที่ 9 เพื่อที่จะเข้าใจว่าฉันกำลังใช้ลายเซ็นที่ไม่ถูกต้อง
Bkwdesign

1
สำหรับผู้อ่านในอนาคตหากคุณประสบปัญหานี้และคุณกำลังพยายามเพิ่มสไตล์ css นี่คือการโอเวอร์โหลดที่ถูกต้อง @ Html.ActionLink ("MyText", "MyAction", "MyController", null, ใหม่ {@class = "myClass"})
granadaCoder

17

ด้วยพารามิเตอร์นั้นคุณกำลังเรียกใช้ฟังก์ชัน / เมธอดที่โอเวอร์โหลดผิด

อะไรที่เหมาะกับฉัน:

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

มันยิง HtmlHelper.ActionLink (สตริง linkText, สตริง actionName, ตัวควบคุมสตริง, เส้นทางวัตถุค่า, วัตถุ htmlAttributes)

ฉันใช้ MVC 4

ไชโย


2
บรรทัดโค้ดของคุณไม่ทำให้เกิดการโอเวอร์โหลดที่คุณพูดถึง แต่ HtmlHelper.ActionLink (สตริง linkText, สตริง actionName, object routeValues, object htmlAttributes) สิ่งนี้ให้ผลลัพธ์เดียวกันกับที่ OP พยายามหลีกเลี่ยง คุณต้องเพิ่มพารามิเตอร์ว่างเพิ่มเติม
TiMoch

ขอบคุณ TiMoch ที่พลาดไปใช่ไหม
Stephan Venter

12

ฉันขอแนะนำให้เขียนผู้ช่วยเหลือเหล่านี้โดยใช้พารามิเตอร์ที่ตั้งชื่อเพื่อความชัดเจนดังนี้

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

ตั้งแต่ 2019 คุณลักษณะนี้ถูกนำมาใช้ใน ReSharper โดย JetBrains มันมีประโยชน์จริง ๆ สำหรับสถานการณ์นี้
Jamie

10

หากคุณคว้าชุด MVC Futures (ซึ่งฉันขอแนะนำอย่างยิ่ง) คุณสามารถใช้สามัญเมื่อสร้าง ActionLink และแลมบ์ดาเพื่อสร้างเส้นทาง:

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

คุณสามารถรับการประกอบฟิวเจอร์สได้ที่นี่: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


ขอบคุณสำหรับลิงก์จริง - พยายามค้นหา!
Perhentian

1
ระวังสิ่งนี้แม้ว่าจะไม่รวมอยู่ใน MVC2 เหตุผลก็คือการกระทำนั้นไม่จำเป็นต้องเป็นวิธีการ (ซึ่งฉันเห็นด้วย แต่มันจะเป็นความเจ็บปวดที่จะโยกย้ายเนื่องจากเราใช้วิธีการทั่วไปมาระยะหนึ่งแล้ว) นี่คือบทความเต็มรูปแบบเกี่ยวกับสาเหตุที่ไม่ได้ถูกเก็บไว้ใน 2: haacked.com/archive/2008/08/29/…
Stu

7

คุณกำลังกดผิดเกินพิกัดของ ActionLink ลองใช้วิธีนี้แทน

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


3

ทางเลือกอื่นคือการใช้Urlวัตถุตัวช่วยเพื่อตั้งค่าhrefคุณสมบัติของ<a>แท็กเช่น:

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

โปรดทราบว่ารายละเอียดคือหน้า "ดู" ภายใต้โฟลเดอร์ "ผลิตภัณฑ์"

ProductId เป็นคีย์หลักของตาราง นี่คือบรรทัดจาก Index.cshtml

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

รหัสนี้ทำงานสำหรับฉันในมุมมองบางส่วน:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

ในขณะที่ใช้งานได้มันจะหลีกเลี่ยงจุดทั้งหมดของการใช้ ActionLink ... จุดทั้งหมดของ ActionLink คือการหลีกเลี่ยงการพิมพ์ URL ด้วยตนเองและปัญหาที่อาจเกิดขึ้นที่สามารถสร้างได้
Jon Story
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.