Farklı denetleyicideki eylemi çağırmak için Html.ActionLink kullanma


224

Kullanarak denetleyiciler arasında gezinmeye çalışıyorum ActionLink. Sorunumu bir örnekle anlatacağım.

Hat denetleyicisinin Dizin görünümündeyim ve Ürün denetleyicisinin Ayrıntılar eylemine bir bağlantı oluşturmak için aşağıdaki kodu kullanmaya çalışıyorum.

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

Bu, Ürün denetleyicisindeki Ayrıntılar'a bir bağlantı oluşturmak yerine, Hat denetleyicisi altındaki Ayrıntılar eylemine bir bağlantı oluşturur ve sonuna bir Uzunluk parametresi ekler:

Hat/Details/9?Length=7

HTML.ActionLinkBu sorun nedeniyle denetleyiciler arasında geçiş yapmak için kullanamıyorum . Beni yanlış yaptığım şeye yönlendirebilirseniz sevinirim. Teşekkürler

Not: MVC ile birlikte gelen varsayılan yol ayarını kullanıyorum

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

Yanıtlar:


410

İstediğiniz bu aşırı yük:

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

1
Bu aşırı yükün neden çalıştığını ve korki'nin neden çalışmadığını açıklayabilir misiniz? HtmlAttributes öğesini null değerine ayarlamak bağlantının yönlendirmesini nasıl etkiler?
Derek Hunziker

35
Çünkü diğer parametreleri kullanırsanız, üçüncü argümanın rutin değerler olduğunu ve 4. argümanın htmlattributes olduğunu varsayar. 5. bağımsız değişken eklemek, yöntemi doğru aşırı yüklemeyi kullanmaya zorlar. Akılda aşırı yükleri hafifçe vurun ve bu daha mantıklı olacaktır.
Banford

2
ActionLink'in aşırı yüklenmesi gerçekten sakar. RouteValueCollection yerine bir 'nesne routeValues' kabul etmenin tüm amacı, yazma miktarını azaltmaktır. Ancak, sonunda bir null yazmak zorunda kalırsınız. Sezgisel ve karşı üretken olmayan ...
TiMoch

3
Katılıyorum, aşırı yük parametreleri kötü tasarlanmış .. Ben en uzun süre bir hata olduğunu düşündüm. Gerçekten yanlış imzayı kullandığımı anlamak için tüm
istihbaratta

2
Gelecekteki okuyucular için, bu sorunu vurursanız ve bir css stili eklemeye çalışıyorsanız, bu doğru aşırı yüklenmedir. @ Html.ActionLink ("MyText", "MyAction", "MyController", null, yeni {@class = "myClass"})
granadaCoder

17

Bu parametrelerle, aşırı yüklenmiş işlevi / yöntemi tetiklersiniz.

Benim için ne işe yaradı:

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

HtmlHelper.ActionLink'i tetikler (string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)

MVC 4 kullanıyorum.

Cheerio!


2
Kod satırınız bahsettiğiniz aşırı yükü değil HtmlHelper.ActionLink'i (string linkText, string actionName, object routeValues, object htmlAttributes). Bu OP'nin kaçınmaya çalıştığı sonucu verir. Ek bir null parametre eklemeniz gerekir.
TiMoch

Teşekkürler TiMoch, bunu kaçırdınız mı?
Stephan Venter

12

Bu yardımcıları netlik sağlamak için adlandırılmış parametreleri kullanarak aşağıdaki şekilde yazmanızı tavsiye ederim:

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

2019'dan itibaren, bu özellik JetBrains tarafından ReSharper'da uygulanmaktadır. Aslında bu durum için çok yararlı.
Jamie

10

MVC Vadeli İşlemler montajını (ki kesinlikle tavsiye ederim) kaparsanız, rotayı oluşturmak için ActionLink ve lambda oluştururken genel kullanabilirsiniz:

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

Gelecek montajını buradan alabilirsiniz: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


Gerçek bağlantı için teşekkürler - onu bulmaya çalışıyordu!
Perhentian

1
MVC2'ye dahil edilmediğinden buna dikkat edin. Bunun nedeni, Eylemlerin mutlaka Yöntemler olmadığıdır (buna katılıyorum, ancak bir süredir genel yöntemi kullandığımız için göç etmek acı verici olacaktır). İşte neden 2'de tutulmadığına dair tam makale: haacked.com/archive/2008/08/29/…
Stu

7

ActionLink'in aşırı yüklenmesine yanlış vuruyorsunuz. Bunun yerine bunu deneyin.

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

6

dene iyi çalışıyor

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

3

Alternatif bir çözüm , bir etiketin niteliğini aşağıdaki gibi Urlayarlamak için yardımcı nesneyi kullanmak olacaktır :href<a>

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

1

Ayrıntılar'ın "Ürünler" klasörünün altındaki "Görünüm" sayfası olduğunu unutmayın.

ProductId, tablonun birincil anahtarıdır. Index.cshtml'deki satır

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

0

bu kod benim için kısmi görünümde çalıştı:

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

Bu işe yarar olsa da, ActionLink'i kullanmanın tüm noktasını atlatıyor ... ActionLink'in tüm amacı, URL'yi ve yaratabilecek olası sorunları manuel olarak yazmaktan kaçınmaktır
Jon Story
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.