Bir ASP.NET MVC Html'sine bağlantı etiketi ekleme


151

ASP.NET MVC, bir bağlantı etiketi içeren bir bağlantı oluşturmaya çalışıyorum (yani, bir sayfaya yönlendirmek ve sayfanın belirli bir bölümü).

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>

Yönlendirmem standart ile ayarlandı:

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

Kullanıyorum eylem bağlantı 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 doğru şekilde döndürülür:

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

# Section12 bölümünü nasıl ekleyeceğimi bilemiyorum . "Bölüm" sözcüğü sadece sayfa bölümlerini ayırmak için kullandığım kural ve 12 alt kategorinin kimliğidir, yani child.ID.

Bunu nasıl yapabilirim?

Yanıtlar:


97

Muhtemelen böyle bağlantıyı manuel olarak kurarım:

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

20
@Brad Wilson tarafından açıklanan şekilde ActionLink için aşırı yükleri gerçekten kullanmalıdır.
mattruma

18
@mattruma üzgünüm katılmıyorum. ÖPÜCÜK. Neden açıkça belirttiğiniz bir üyeyle parametrelerin bir kısmı boş bırakılır. Herkes yukarıdaki ifadenin ne anlama geldiğini görebilir, böylece Brad'in tepkisi kıvrıktır ve zekayı kazmanızı gerektirir. Çok fazla parametre tanınan bir anti-desen .. c2.com/cgi/wiki?TooManyParameters
Ed Blackburn

2
Katılıyorum. Her iki yöntem de işe yarıyor, ancak URL'lerde parçaların belirtilme şekli yakın gelecekte değişmeyeceğinden, bu yolun aslında daha okunaklı ve daha net olduğunu düşünüyorum. Gerekirse, Urlveya Htmlnesnesini, bir parça dizesi eklemenin basit bir yolunu içeren özel bir yöntemle genişletebilirsiniz .
LorenzCK

282

Bir fragman parametresi alan aşırı sayıda ActionLink vardır . Parçanız olarak "section12" iletmek, peşinde olduğunuz davranışı size getirecektir.

Örneğin, LinkExtensions.ActionLink Yöntemi'ni çağırmak (HtmlHelper, String, String, String, String, String, String, Object, Object) :

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

1
Bu aşırı yüklemeler bir uzantı kütüphanesinin parçası mı? Onları alamıyorum.
el bombası

İki tane vardır: public static string ActionLink (bu HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protokolü, string hostName, string fragmanı, nesne routeValues, object htmlAttributes); public static string ActionLink (bu HtmlHelper htmlHelper, dize linkText, dize actionName, dize denetleyicisiAdı, dize protokolü, dize ana bilgisayarAdı, dize parçası, RouteValueDictionary routeValues, IDictionary <string, object> htmlAttributes);
Brad Wilson

11
Cevap bu olmalı.
Rubens Mariuzzo

1
Parçayı geçirerek bir çapanın belirtilmesine izin veren Html.ActionLink'in aşırı yüklenmesi, denetleyiciyi ada göre geçmeye zorlar. Bunu sevmedim. Denetleyici adı yanlışsa, derleme hataları yerine çalışma zamanı istisnaları oluşur.
R.Schreurs

1
@RobertMcKee, bağlantı metniniz metinden başka bir şeyse, o Html.ActionLink()zaman herhangi bir senaryoda çalışmaz - href=@Url.Action()stil sözdizimini kullanmanız gerekir .
Katstevens

15

Hangi ASP.NET MVC (inandığım ASP.NET MVC 3+ sürümü) / jilet parametresi kaynaklı bildirimi veya ne denir (parametre: x) özelliği tanıtıldığını hatırlamıyorum, ama bana göre bu kesinlikle doğru yoldur ASP.NET MVC bir çapa ile bir bağlantı oluşturmak.

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

Bu cevaptan Ed Blackburns antipattern argümanı bile bununla rekabet edemez.


1
Kelimenin tam anlamıyla bu hayatımı kurtardı. Yayınınızı burada benim çözümüm olarak ilişkilendirme stackoverflow.com/questions/32420028/… .
Matthew

11

Ben sadece böyle yaptım:

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

1

İş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 sayfada TABS var

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

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

0

Her zaman kullanıcıyı aynı yer işaretine yönlendirmek istediğiniz sürece, ActionFilter'ı Alt Kategori eylem yöntemine uygularsanız çözümüm işe yarayacaktı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 eklemesini bildirmek için küçük bir javascript parçası çıkarır.

Javascript'i, elbette URL'de bir yer işareti kullanmak yerine manuel olarak kaydırılacak şekilde değiştirebilirsiniz!

Umarım yardımcı olur :)


0

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

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
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.