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.