Sử dụng Html.ActionLink để gọi hành động trên các bộ điều khiển khác nhau


224

Tôi đang cố gắng điều hướng giữa các bộ điều khiển bằng cách sử dụng ActionLink. Tôi sẽ nói vấn đề của tôi với một ví dụ.

Tôi đang ở chế độ xem Chỉ mục của bộ điều khiển Hat và tôi đang cố gắng sử dụng mã bên dưới để tạo liên kết đến hành động Chi tiết của bộ điều khiển Sản phẩm.

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

Thay vì tạo liên kết đến Chi tiết trên bộ điều khiển Sản phẩm, điều này tạo ra một liên kết đến hành động Chi tiết trong Trình điều khiển mũ và nối thêm tham số Độ dài vào cuối của nó:

Hat/Details/9?Length=7

Tôi không thể sử dụng HTML.ActionLinkđể chuyển đổi giữa các bộ điều khiển vì vấn đề này. Tôi sẽ đánh giá cao nếu bạn có thể chỉ cho tôi những gì tôi đang làm sai. Cảm ơn

PS: Tôi đang sử dụng cài đặt tuyến mặc định đi kèm với MVC

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

Câu trả lời:


409

Những gì bạn muốn là quá tải này:

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

1
Bạn có thể giải thích tại sao quá tải đặc biệt này hoạt động và korki không? Làm thế nào để thiết lập htmlAttribution thành null ảnh hưởng đến việc định tuyến của liên kết?
Derek Hunziker

35
Đó là bởi vì nếu bạn sử dụng các tham số khác, nó giả sử rằng đối số thứ ba là các thường trình và đối số thứ 4 là các phân phối html. Thêm một đối số thứ 5 buộc phương thức sử dụng quá tải chính xác. Lướt qua các tình trạng quá tải trong intellisense và điều này sẽ có ý nghĩa hơn.
Banford

2
Sự quá tải của ActionLink thực sự vụng về. Toàn bộ quan điểm chấp nhận một 'đối tượng routeValues' thay vì RouteValueCollection là để giảm số lượng nhập. Tuy nhiên, cuối cùng bạn phải gõ thêm null. Không trực quan và phản tác dụng ...
TiMoch

3
Tôi đồng ý, các tham số quá tải được thiết kế kém .. Tôi nghĩ rằng đó là một lỗi trong thời gian dài nhất. Tôi thực sự đã phải nhìn chằm chằm lần thứ 9 vào tất cả các thông tin để hiểu rằng tôi đã sử dụng chữ ký sai
Bkwdesign

1
Đối với độc giả trong tương lai, nếu bạn gặp phải vấn đề này và bạn đang cố gắng thêm kiểu css, thì đây là tình trạng quá tải chính xác. @ Html.ActionLink ("MyText", "MyAction", "MyContoder", null, new {@group = "myClass"})
granadaCoder

17

Với các tham số đó, bạn đang kích hoạt chức năng / phương thức bị quá tải sai.

Điều gì làm việc cho tôi:

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

Nó kích hoạt HtmlHelper.ActionLink (chuỗi linkText, chuỗi actionName, chuỗi controlName, object routeValues, object htmlAttribution)

Tôi đang sử dụng MVC 4.

Chúc mừng!


2
Dòng mã của bạn không kích hoạt quá tải mà bạn đề cập nhưng HtmlHelper.ActionLink (chuỗi linkText, chuỗi actionName, object routeValues, object htmlAttribution). Điều này mang lại kết quả tương tự mà OP đã cố gắng tránh. Bạn cần thêm một tham số null bổ sung.
TiMoch

Cảm ơn TiMoch, đã bỏ lỡ cái đó?
Stephan Venter

12

Tôi khuyên bạn nên viết những người trợ giúp này bằng cách sử dụng các tham số được đặt tên để rõ ràng như sau:

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

Kể từ năm 2019, tính năng này được JetBrains triển khai trong ReSharper. Nó thực sự rất hữu ích cho trường hợp này.
Jamie

10

Nếu bạn lấy cụm MVC Futures (mà tôi rất muốn giới thiệu), thì bạn có thể sử dụng chung khi tạo ActionLink và lambda để xây dựng tuyến đường:

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

Bạn có thể nhận hội đồng tương lai tại đây: http://aspnet.codeplex.com/Release/ProjectRelease.aspx?ReleaseId=24471


Cảm ơn các liên kết thực tế - đã cố gắng để tìm thấy nó!
Pereaverian

1
Cẩn thận với điều này mặc dù nó không được bao gồm trong MVC2. Lý do là các Hành động không nhất thiết là Phương thức (mà tôi đồng ý nhưng sẽ rất khó để di chuyển vì chúng tôi đã sử dụng phương pháp chung này một thời gian rồi). Đây là bài viết đầy đủ về lý do tại sao nó không được giữ trong 2: haacked.com/archive/2008/08/29/ Khăn
Stu

7

Bạn đang nhấn sai sự quá tải của ActionLink. Hãy thử điều này thay thế.

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

6

Hãy thử nó đang hoạt động tốt

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

3

Một giải pháp thay thế sẽ là sử dụng Urlđối tượng trợ giúp để đặt hrefthuộc tính của <a>thẻ như:

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

1

Lưu ý rằng Chi tiết là trang "Xem" trong thư mục "Sản phẩm".

ProductId là khóa chính của bảng. Đây là dòng từ Index.cshtml

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

0

mã này làm việc cho tôi trong chế độ xem một phần:

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

Mặc dù điều này không hoạt động, nhưng nó bao quanh toàn bộ điểm sử dụng ActionLink ... toàn bộ điểm của ActionLink là để tránh nhập URL thủ công và các vấn đề tiềm ẩn có thể tạo
Jon Story
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.