Soru ASP.NET MVC Html.ActionLink'te bir bağlantı etiketi dahil


ASP.NET MVC'de, bir çapa etiketini (yani, kullanıcıyı bir sayfaya yönlendiren ve sayfanın belirli bir bölümünü) içeren bir bağlantı oluşturmaya çalışıyorum.

Oluşturmaya çalıştığım URL aşağıdaki gibi görünmelidir:

<a href="/category/subcategory/1#section12">Title for a section on the page</a>

Benim yönlendirmem standart ile ayarlandı:

routes.MapRoute("Default", "{controller}/{action}/{categoryid}"); 

Kullandığım eylem linki sözdizimi:

<%foreach (Category parent in ViewData.Model) { %>
<h3><%=parent.Name %></h3>
<ul>
<%foreach (Category child in parent.SubCategories) { %>
    <li><%=Html.ActionLink<CategoryController>(x => x.Subcategory(parent.ID), child.Name) %></li>
<%} %>
</ul>
<%} %>

Denetleyici yöntemim şu şekildedir:

public ActionResult Subcategory(int categoryID)
{
   //return itemList

   return View(itemList);
}

Yukarıdaki gibi bir URL aşağıdaki gibi doğru bir şekilde döner:

<a href="/category/subcategory/1">Title for a section on the page</a>

Nasıl ekleyeceğimi anlayamıyorum # section12 Bölüm. "Bölüm" sözcüğü, sayfa bölümlerini ayırmak için kullandığım yalnızca kuraldır ve 12 alt kategorinin, yani child.ID'nin kimliğidir.

Bunu nasıl yapabilirim?


146
2017-11-08 10:10


Menşei




Cevaplar:


Bağlantıyı muhtemelen şöyle manuel olarak yapılandırabilirim:

<a href="<%=Url.Action("Subcategory", "Category", new { categoryID = parent.ID }) %>#section12">link text</a>

94
2017-11-08 11:30



Gerçekten, @Brad Wilson tarafından açıklandığı gibi ActionLink için aşırı yükleri kullanmalı. - mattruma
@mattruma üzgünüm katılmıyorum. ÖPÜCÜK. Niçin açıkça belirtmeniz gerektiğinde, bazıları null olarak bırakılan parametrelerle dolu bir üyeye sahiptir. Yukarıdakiler, Brad'in tepkisinin kıvrık olduğu ve intellisense'e girmenizi gerektirdiği şeylerin ne olduğunu herkes görebilir. Çok fazla parametre tanınan bir anti desentir ..c2.com/cgi/wiki?TooManyParameters - Ed Blackburn
Katılıyorum. Her iki yöntem de çalışır, ancak parçaların URL'lerde belirtilme şekli yakın bir gelecekte değişmeyeceğinden, bu yolun amacında aslında daha anlaşılır ve daha net olduğunu düşünüyorum. Gerekirse, hala uzatabilirsiniz Url veya Html Bir parça dizesi eklemenin basit bir yolunu içeren özel bir yöntemle nesne. - LorenzCK


ActionLink aşırı yüklenen bir fragman parametre. Parçanız olarak "section12" yi geçmek, size takip edeceğiniz davranışa sahip olacaktır.

Örneğin, arama LinkExtensions.ActionLink Yöntemi (HtmlHelper, String, String, String, String, String, String, Object, Object):

<%= Html.ActionLink("Link Text", "Action", "Controller", null, null, "section12-the-anchor", new { categoryid = "blah"}, null) %>

269
2017-11-09 01:53



Bu aşırı yüklenmeler bir uzantı kitaplığının parçası mı? Onları almak istemiyorum. - grenade
İki tane vardır: public static string ActionLink (bu HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protokolü, string hostName, string parçası, object routeValues, object htmlAttributes); public static string ActionLink (bu HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, dize protokolü, string hostName, string parçası, RouteValueDictionary routeValues, IDictionary <string, object> htmlAttributes); - Brad Wilson
+1 Bu kesinlikle daha iyi bir yoldur. - mattruma
Cevap bu olmalı. - Rubens Mariuzzo
Html.ActionLink'in aşırı yüklemesini, parçayı geçirerek bir ankrajın belirtilmesine izin veren, denetleyiciyi ismine göre göndermeye zorla. Bundan hoşlanmıyorum. Denetleyici adı yanlışsa, derleme hataları yerine çalışma zamanı istisnaları oluşacaktır. - R. Schreurs


Ben ASP.NET MVC (ASP.NET MVC 3 + ben inanıyorum) / Razor parametre etiketini veya herhangi bir şey (parametre: x) özelliği çağrıldı hangi sürümde olduğunu hatırlamıyorum, ama bana göre bu kesinlikle doğru yolu ASP.NET MVC'de bir bağlantı ile bir bağlantı oluşturmak.

@Html.ActionLink("Some link text", "MyAction", "MyController", protocol: null, hostName: null, fragment: "MyAnchor", routeValues: null, htmlAttributes: null)

Ed Blackburns antipattern argümanı bile yok bu cevap bununla rekabet edebilir.


13
2017-09-28 18:52



Tam anlamıyla bu hayatımı kurtardı. Gönderinizi çözümüm olarak buraya gönderme stackoverflow.com/questions/32420028/... . - Matthew
Bunun için yeterince teşekkür edemem !!! - john
@john, rica ederim! - PussInBoots


Ben sadece böyle yaptım:

<a href="@Url.Action("Index","Home")#features">Features</a>

6
2018-06-18 08:26





İşte gerçek hayat örneği

@Html.Grid(Model).Columns(columns =>
    {
           columns.Add()
                   .Encoded(false)
                   .Sanitized(false)
                   .SetWidth(10)
                   .Titled(string.Empty)
                   .RenderValueAs(x => @Html.ActionLink("Edit", "UserDetails", "Membership", null, null, "discount", new { @id = @x.Id }, new { @target = "_blank" }));

  }).WithPaging(200).EmptyText("There Are No Items To Display")

Ve hedef sayfa TABS

<ul id="myTab" class="nav nav-tabs" role="tablist">

        <li class="active"><a href="#discount" role="tab" data-toggle="tab">Discount</a></li>
    </ul>

1
2017-12-02 12:28





Kullanıcıyı her zaman aynı yer işaretine yönlendirmek istediğiniz sürece ActionFilter'ı Alt Kategori eylem yöntemine uyguladığınızda çözümüm çalışır:

http://spikehd.blogspot.com/2012/01/mvc3-redirect-action-to-html-bookmark.html

HTML arabelleğini değiştirir ve tarayıcıya yer işaretini eklemeye talimat vermek için küçük bir javascript parçası çıkarır.

Elbette URL'de bir yer işareti kullanmak yerine javascript'i manuel olarak kaydırmak için değiştirebilirsiniz!

Umarım yardımcı olur :)


0
2018-01-19 11:02





Bunu yaptım ve diğer görünüme yönlendirmek için çalışıyor Çalışacağından sonra #sectionLink eklerseniz düşünüyorum

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>

0
2018-03-12 10:11