Menggunakan Html.ActionLink untuk memanggil tindakan pada pengontrol yang berbeda

224

Saya mencoba menavigasi antar pengontrol menggunakan ActionLink. Saya akan menceritakan masalah saya dengan sebuah contoh.

Saya pada tampilan Indeks pengontrol Hat, dan saya mencoba menggunakan kode di bawah ini untuk membuat tautan ke tindakan Detail dari pengontrol produk.

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

Alih-alih membuat tautan ke Rincian pada Pengontrol produk, ini menghasilkan tautan ke Tindakan detail di bawah Pengontrol topi dan menambahkan parameter Panjang ke ujungnya:

Hat/Details/9?Length=7

Saya tidak dapat menggunakan HTML.ActionLinkuntuk beralih di antara pengontrol karena masalah ini. Saya akan menghargai jika Anda bisa menunjukkan kesalahan saya. Terima kasih

PS: Saya menggunakan pengaturan rute default yang datang dengan MVC

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

Jawaban:

409

Apa yang Anda inginkan adalah kelebihan ini:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>
Çağdaş Tekin
sumber
1
Bisakah Anda menjelaskan mengapa kelebihan beban ini berhasil dan korki tidak? Bagaimana pengaturan htmlAttributes ke nol mempengaruhi perutean tautan?
Derek Hunziker
35
Itu karena jika Anda menggunakan parameter lain itu mengasumsikan bahwa argumen ketiga adalah nilai rutin dan argumen 4 adalah atribut html. Menambahkan argumen ke-5 memaksa metode untuk menggunakan overload yang benar. Jentikkan kelebihan beban di intellisense dan ini akan lebih masuk akal.
Banford
2
Kelebihan ActionLink benar-benar canggung. Inti dari menerima 'objek routeValues' alih-alih RouteValueCollection adalah untuk mengurangi jumlah pengetikan. Namun, Anda akhirnya harus mengetik nol tambahan. Non-intuitif dan kontra produktif ...
TiMoch
3
Saya setuju, parameter kelebihan dirancang dengan buruk .. Saya pikir itu adalah bug untuk waktu yang lama. Saya benar-benar harus menatap ke 9 kalinya sama sekali dengan intellisense untuk memahami bahwa saya menggunakan tanda tangan yang salah
Bkwdesign
1
Untuk pembaca masa depan, jika Anda menekan masalah ini dan Anda mencoba menambahkan gaya css, ini adalah kelebihan yang benar. @ Html.ActionLink ("MyText", "MyAction", "MyController", null, new {@class = "myClass"})
granadaCoder
17

Dengan parameter itu Anda memicu fungsi / metode yang salah kelebihan.

Apa yang berhasil untuk saya:

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

Ini menyalakan HtmlHelper.ActionLink (string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)

Saya menggunakan MVC 4.

Cheerio!

Stephan Venter
sumber
2
Baris kode Anda tidak memicu kelebihan yang Anda sebutkan, tetapi HtmlHelper.ActionLink (string linkText, string actionName, object routeValues, object htmlAttributes). Ini menghasilkan hasil yang sama dengan yang OP coba hindari. Anda perlu menambahkan parameter nol tambahan.
TiMoch
Terima kasih TiMoch, merindukan yang itu?
Stephan Venter
12

Saya akan merekomendasikan penulisan pembantu ini menggunakan parameter bernama demi kejelasan sebagai berikut:

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)
Psi-Ed
sumber
Pada 2019, fitur ini diimplementasikan dalam ReSharper oleh JetBrains. Sebenarnya sangat membantu untuk keadaan ini.
Jamie
10

Jika Anda mengambil perakitan MVC Futures (yang saya akan sangat menyarankan) Anda kemudian dapat menggunakan generik saat membuat ActionLink dan lambda untuk membangun rute:

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

Anda bisa mendapatkan perakitan berjangka di sini: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

James Avery
sumber
Terima kasih atas tautannya yang sebenarnya - berusaha menemukannya!
Perhentian
1
Hati-hati dengan ini karena tidak termasuk dalam MVC2. Alasannya adalah bahwa Tindakan belum tentu Metode (yang saya setuju dengan tetapi itu akan menjadi sulit untuk bermigrasi karena kami telah menggunakan metode generik untuk sementara waktu sekarang). Inilah artikel lengkap tentang mengapa itu tidak disimpan di 2: haacked.com/archive/2008/08/29/…
Stu
7

Anda salah mengenai kelebihan ActionLink. Coba ini sebagai gantinya.

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

coba saja itu berfungsi dengan baik

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

Solusi alternatif adalah menggunakan Urlobjek helper untuk mengatur hrefatribut <a>tag seperti:

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

Perhatikan bahwa Detail adalah halaman "Lihat" di bawah folder "Produk".

ProductId adalah kunci utama tabel. Ini adalah baris dari Index.cshtml

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

kode ini berfungsi untuk saya dalam tampilan sebagian:

<a href="/Content/[email protected]">@item.Title</a>
Amin Saadati
sumber
Meskipun ini berfungsi, ia menghindari seluruh titik menggunakan ActionLink ... seluruh titik ActionLink adalah untuk menghindari pengetikan URL secara manual dan potensi masalah yang dapat dibuat
Jon Story