Html.ActionLink neden “? Uzunluk = 4” oluşturur?


305

ÇOK kafam neden bu kod

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })

bu bağlantıdaki sonuçlar:

<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>

hidefocusBölüm elde etmek amacıyla ne olduğunu, ama nerede mu ?Length=4geliyor?


4
Bu davranış, Html.BeginForm () yöntemleriyle de görüntülenir.
Jonathon Watney

Yanıtlar:


326

Length = 4, bir string nesnesini serileştirme girişiminden geliyor. Kodunuz şu ActionLinkyöntemi çalıştırıyor :

public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)

Bu string, MVC tesisatının genel özellikleri aramalarını rota değerlerine dönüştürdüğü routeValues ​​için bir nesne "Home" alır . Bir stringnesne söz konusu olduğunda , yalnızca public özelliği Lengthvardır ve Length parametresiyle tanımlanan hiçbir rota olmayacağından özellik adını ve değerini sorgu dizesi parametresi olarak ekler. Muhtemelen HomeControllerbunu, üzerinde olmayan bir sayfadan çalıştırırsanız , eksik bir Abouteylem yöntemi hakkında bir hata atarsınız . Aşağıdakileri kullanmayı deneyin:

Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })

@Blah_Blah bugünlerde bunu hiç kullanmıyorum, kendi <a> etiketlerimi yazmayı ve sadece Url.Action ("Action", "Controller") kullanmayı tercih ediyorum
roryf

@roryf endişelenmeyin ... Bu, kod incelemesinde en iyi uygulamalar olarak kullanıldı, tarihi kontrol etmediler.
İstif akışını

Mükemmel cevap. Sadece eklemek için aynı nedenle Html.BeginRouteForm da olur. Html.BeginRouteForm ( "Rota", "Eylem", FormMethod.Post)) garip uzunluk şey kurtulmak alır Html.BeginRouteForm ( "Rota", yeni {action = "AgentSignUp"}, FormMethod.Post) olmalı
radm4

Ayrıca olur Url.Action(). Konumundan konumuna Url.Action("Action", "Controller", new { area = "" })geçmek Url.Action("Action", new { controller = "Controller", area = "" })Length özelliğinin görünmesini engeller.
John Washam

Bu tür durumlardan kaçınmak için, hangi parametreleri geçtiğinizi her zaman belirtebilirsiniz, örneğin:Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
Epiplon

195

Bunu çözdüğüm yol, anonim bildirimden ( new {}) önce dördüncü parametreye null ekleyerek şu yöntem aşırı yüklenmesini kullanıyordu: (linkText, actionName, controllerName, routeValues, htmlAttributes):

Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })

Alanlar arasında bağlantı kurmuyorsanız, bu en iyi yanıttır. Bağlantıya ilişkin alanı belirtmeniz gerekiyorsa , Length özelliğinin URL'de görünmesini engellemek için controllerve ile routeValues ​​değerini belirtmeniz gerekir area.
John Washam

@JohnWasham Aslında, denetleyiciyi routeValuesyalnızca alanda belirtmeniz gerekmez . Örneğin:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
Epiplon

1
@epiplon, denetleyiciyi böyle belirtmemizin nedeni, son argüman olarak htmlAttributes eklemezseniz ActionLink, MVC Length=xURL'nin sonuna garip bir parametre ekleyecektir . Örneğin, bunu bir sayfaya koyun, ardından sayfanızın kaynağını görüntüleyin ve ne demek istediğimi göreceksiniz: @Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" }) @Html.ActionLink("About", "About", "Home", new { area = "Admin" }) Ancak controllergirdiyi routeValuesiçine koyarsanız Length=x, URL'yi asla koymaz.
John Washam

@epiplon, ayrıca kullanmak gerekmez @içinde @area = "Admin"şunu bil ki,.
John Washam

88

HTMLAttributes parmını eklemeyi unuttunuz.

Bu herhangi bir değişiklik yapmadan çalışacaktır:

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)

Bilmiyorum, neden benim için işe yaramadı. "New {hidefocus =" "}" ile denedim ve bu benim için çalışıyor.
Naredla Nithesh Reddy

28

ActionLink parametreleri doğru değil, anonim tür yerine "Ev" değerini bir rota değeri olarak kullanmaya çalışıyor.

Az önce eklemem gerekiyor inanmak new { }veya nullson parametre olarak.

EDIT: Sadece yazı yeniden okumak ve büyük olasılıkla null son değil ikinci son parametre olarak belirtmek isteyeceksiniz fark etti.


1
BTW Kullanılması mümkün olmadığından bir yöntemi kaldırmalıdırlar!
Marc Climent

5
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })

Bu aşırı yüklenmeyi alır: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes


3

Lütfen beş (5) parametreli aşırı yüklenmiş aşırı yük yöntemini kullanın. Misal:

@using (@Ajax.BeginForm("Register", "Account", null,
    new AjaxOptions
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete"
    }, new { @class = "form-login" }))

benim durumumda denetleyici adı null eklenmesi yararlı oldu.
Munam Yousuf

Bu, OP'nin istediği değil Ajax sürümünü kapsadığı ek bonusla @ Jesse'nin cevabı ile aynı cevaptır, ancak aynı konuyla ilgilidir.
gcoulby

2

"Ev" i (denetleyicinin adı) kaldırmanız yeterlidir, böylece kod şöyle olur:

Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })

1

Özellik adlarıyla:

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)

0

Jonathon Watney'nin bir yorumda işaret ettiği gibi, bu da

Html.BeginForm ()

yöntemleri. Benim durumumda, ilgili denetleyicinin posta oluşturma isteğini hedefleyen bir Create.cshtml'deydim + Oluştur eylemi

using (Html.BeginForm("Create")) {
  @Html.AntiForgeryToken()
  ...
}

hangisi oluşturulduğunda form eylemine "? Length = 6" sorgu dizesini ekliyordu . Roryf'in onaylı cevabı ve "Oluşturma" nın dize uzunluğunu fark eden 6'dır, sonunda açık eylem özelliğini kaldırarak bunu çözdüm:

using (Html.BeginForm()) {
      @Html.AntiForgeryToken()
      ...
    }

0

Belki de başkaları da aynı soruna sahipti ve HTMLAttributes parm aracılığıyla bir sınıf değeri sağlamaları gerekiyor . İşte benim çözümüm:

@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })


0

Sorumun cevabını ara beni buraya getirdi, temelde @Html.ActionLink resim açıklamasını buraya girin önemli aşırı yüklenmenin seçimi .
Ben (olmasaydı bir aşırı yük, seçme edildi olmadan son null ) veMVC söz OP gibi yanlış bir URL şey sonuçlanan böyle aşırı vardı.

Kişisel bir not: Eğer yapabilirsiniz useanonim türleri overloads- herhangi birini kullanabilirsiniz anlamına gelmez hangi do yok? - Belli olun: o vardır tanımlanacak!
- MVC 5.2 zamanlarında buraya geldi

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.