HTML'yi Html.ActionLink () içine koyuyor, ayrıca Bağlantı Metni Yok mu?


169

İki sorum var:

  1. Nasıl Html.ActionLink()MVC görünümünde kullanırken aslında hiçbir bağlantı metni görüntüleyebilir merak ediyorum (aslında, bu Site.Master).

Bağlantı metnine izin vermeyen aşırı yüklenmiş bir sürüm yok ve sadece bir boşluk geçirmeyi denediğimde string, derleyici boş olmayan bir dizeye ihtiyacı olduğunu söylüyor.

Bunu nasıl düzeltebilirim?

  1. <span>Etiketleri çapa etiketine koymam gerekiyor , ancak çalışmıyor Html.ActionLink();. Aşağıdaki çıktıyı görmek istiyorum:

    Metin yayma

ASP.NET MVC'de bağlantı etiketinin içine nasıl etiket koyabilirim?


Boş bir eylem bağlantısına sahip olmanın amacı / kullanımı ne olabilir?
David

1
Gezinme çubuğu için bir resim hareketli grafiği kullanıyorum ve <li>gördüğünüz belirli bir gezinme düğmesi (boyut, arka plan konumu vb. İle css stil sayfasında belirtilmiştir). Ama bir şeye bağlanması gerekiyor, bu yüzden metni görüntülemek istemiyorum. Sprite'ın bunu benim için yapmasını istiyorum.
MegaMatt

Yanıtlar:


322

Html.ActionLink kullanmak yerine Url.Action aracılığıyla bir url oluşturabilirsiniz

<a href="<%= Url.Action("Index", "Home") %>"><span>Text</span></a>
<a href="@Url.Action("Index", "Home")"><span>Text</span></a>

Ve boş bir URL yapmak için

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

3
<a href="@Url.Action("Index", "Home")"> <span> Metin </span> </a> kullanmak zorunda kaldım, geliştiricim neden yapmam gerektiğini sormak için gelmiyor Bu ama yukarıdaki cevap kullanmak ve işe yaramadı bulmak tring herkes için yararlı olabilir.
Dave Haigh

2
@ Url.Action, ustura şablonu kullanılırken geçerlidir. Her ikisini de görebilmek için cevabı güncelledim.
David

<a href=@Url.Action("Create", "Product")><span>Create</span></a>ayrıca çalışır. Tırnak işaretleri gerekli değildir.
David

1
Statik içerik için neden html'yi doğrudan yazmıyorsunuz? Daha az ayrıntılı ve daha basit görünüyor
SkeetJon

Ajax kullanmak istiyorsanız artık Asp.Net Core 2'de gerçek bir seçenek değil.
Zorkind

17

Özel bir HtmlHelper uzantısı başka bir seçenektir. Not : ParameterDictionary kendi türüm. Bir RouteValueDictionary yerine geçebilir, ancak farklı bir şekilde yapılandırmanız gerekir.

public static string ActionLinkSpan( this HtmlHelper helper, string linkText, string actionName, string controllerName, object htmlAttributes )
{
    TagBuilder spanBuilder = new TagBuilder( "span" );
    spanBuilder.InnerHtml = linkText;

    return BuildNestedAnchor( spanBuilder.ToString(), string.Format( "/{0}/{1}", controllerName, actionName ), htmlAttributes );
}

private static string BuildNestedAnchor( string innerHtml, string url, object htmlAttributes )
{
    TagBuilder anchorBuilder = new TagBuilder( "a" );
    anchorBuilder.Attributes.Add( "href", url );
    anchorBuilder.MergeAttributes( new ParameterDictionary( htmlAttributes ) );
    anchorBuilder.InnerHtml = innerHtml;

    return anchorBuilder.ToString();
}

14

Ajax veya bağlantıyı manuel olarak yaparken (etiketi kullanarak) kullanamayacağınız bazı özellikleri kullanmanız gerektiğinde (düşük ve kirli) geçici çözüm aşağıdadır:

<%= Html.ActionLink("LinkTextToken", "ActionName", "ControllerName").ToHtmlString().Replace("LinkTextToken", "Refresh <span class='large sprite refresh'></span>")%>

'LinkTextToken' yerine herhangi bir metin kullanabilirsiniz, sadece değiştirilmesi gereken, sadece actionlink içinde başka bir yerde olmaması önemlidir.


6
+1 Güzel fikir. Razor'da tüm bunları tecavüz etmeniz gerekecekHtml.Raw()
Carrie Kendall

Teşekkürler :) Şimdi ne kullandığımızı görüyorum, neredeyse utanıyorum, sunucuda bu şeyleri yapmak sunucu kaynaklarının bu kadar israfı ...
Goran Obradovic

1
@ Ajax.ActionLink kullanıyorum ve tüm date-özellikleri manuel olarak ayarlamak gibi hissetmedim , bu benim için en iyi çözüm. +1
asontu

Teşekkürler, ben de Ajax.ActionLink kullanırken bir cazibe gibi çalıştı. Hiçbir şeyi yavaşlatmadı ve aynı düzeni ve stili korumam gerekiyordu.
Blacky Wolf

Sadece söylemek istiyorum, bu emin v1 hakkında v2 kaldırıldığını Net Çekirdek, ToHtmlString () iş yapmaz
Zorkind

12

Sadece kullanmak Url.Actionyerine Html.ActionLink:

<li id="home_nav"><a href="<%= Url.Action("ActionName") %>"><span>Span text</span></a></li>

@CraigStunz neden Html.ActionLink yerine Url.Action kullanmalıyız?
Roxy'Pro

6

Bu benim için her zaman iyi sonuç verdi. Dağınık ve çok temiz değil.

<a href="@Url.Action("Index", "Home")"><span>Text</span></a>


Url.Action, htmlAttributes alan bir yapıcıya sahip değil. ActionLink ile aynı değil.
barrypicker

2

Sonunda özel bir uzantı yöntemi buldum. HTML'yi bir Çapa nesnesinin içine yerleştirmeye çalışırken, bağlantı metni iç HTML'nin solunda veya sağında olabilir. Bu nedenle, sol ve sağ iç HTML için parametreler sağlamayı seçtim - bağlantı metni ortada. Hem sol hem de sağ iç HTML isteğe bağlıdır.

Uzantı Yöntemi ActionLinkInnerHtml:

    public static MvcHtmlString ActionLinkInnerHtml(this HtmlHelper helper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues = null, IDictionary<string, object> htmlAttributes = null, string leftInnerHtml = null, string rightInnerHtml = null)
    {
        // CONSTRUCT THE URL
        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        var url = urlHelper.Action(actionName: actionName, controllerName: controllerName, routeValues: routeValues);

        // CREATE AN ANCHOR TAG BUILDER
        var builder = new TagBuilder("a");
        builder.InnerHtml = string.Format("{0}{1}{2}", leftInnerHtml, linkText, rightInnerHtml);
        builder.MergeAttribute(key: "href", value: url);

        // ADD HTML ATTRIBUTES
        builder.MergeAttributes(htmlAttributes, replaceExisting: true);

        // BUILD THE STRING AND RETURN IT
        var mvcHtmlString = MvcHtmlString.Create(builder.ToString());
        return mvcHtmlString;
    }

Kullanım Örneği:

İşte bir kullanım örneği. Bu örnek için sadece bağlantı metninin sağ tarafındaki iç html'yi istedim ...

@Html.ActionLinkInnerHtml(
    linkText: "Hello World"
        , actionName: "SomethingOtherThanIndex"
        , controllerName: "SomethingOtherThanHome"
        , rightInnerHtml: "<span class=\"caret\" />"
        )

Sonuçlar:

bu şu HTML ile sonuçlanır ...

<a href="/SomethingOtherThanHome/SomethingOtherThanIndex">Hello World<span class="caret" /></a>

1

Bunun bootstrap ve bazı glifonları kullanırken yararlı olabileceğini düşündüm:

<a class="btn btn-primary" 
    href="<%: Url.Action("Download File", "Download", 
    new { id = msg.Id, distributorId = msg.DistributorId }) %>">
    Download
    <span class="glyphicon glyphicon-paperclip"></span>
</a>

Bu, bir indirme bağlantısını temsil etmek için üzerinde güzel bir ataç simgesi bulunan bir denetleyiciye bağlantısı olan bir A etiketi gösterir ve html çıktısı temiz tutulur


1

İşte @ tvanfosson'un cevabının uber genişlemesi. Ondan ilham aldım ve daha genel hale getirmeye karar verdim.

    public static MvcHtmlString NestedActionLink(this HtmlHelper htmlHelper, string linkText, string actionName,
        string controllerName, object routeValues = null, object htmlAttributes = null,
        RouteValueDictionary childElements = null)
    {
        var htmlAttributesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

        if (childElements != null)
        {
            var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);

            var anchorTag = new TagBuilder("a");
            anchorTag.MergeAttribute("href",
                routeValues == null
                    ? urlHelper.Action(actionName, controllerName)
                    : urlHelper.Action(actionName, controllerName, routeValues));
            anchorTag.MergeAttributes(htmlAttributesDictionary);
            TagBuilder childTag = null;

            if (childElements != null)
            {
                foreach (var childElement in childElements)
                {
                    childTag = new TagBuilder(childElement.Key.Split('|')[0]);
                    object elementAttributes;
                    childElements.TryGetValue(childElement.Key, out elementAttributes);

                    var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(elementAttributes);

                    foreach (var attribute in attributes)
                    {
                        switch (attribute.Key)
                        {
                            case "@class":
                                childTag.AddCssClass(attribute.Value.ToString());
                                break;
                            case "InnerText":
                                childTag.SetInnerText(attribute.Value.ToString());
                                break;
                            default:
                                childTag.MergeAttribute(attribute.Key, attribute.Value.ToString());
                                break;
                        }
                    }
                    childTag.ToString(TagRenderMode.SelfClosing);
                    if (childTag != null) anchorTag.InnerHtml += childTag.ToString();
                }                    
            }
            return MvcHtmlString.Create(anchorTag.ToString(TagRenderMode.Normal));
        }
        else
        {
            return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributesDictionary);
        }
    }

1
İlham almış olmanız ve bunu yapabilmeniz harika. Ancak, iç içe foreach ifadeleri bakmak ve çalıştırmak istiyorum. Çoğu geliştirici tarafından bakımı mümkün değildir. Taş kara kutu tipi uzatma yönteminde oldukça ayarlanmışsa, muhtemelen tamam, ancak bir kod kokusu vardır. Oldukça basit bir şey için gözlerde kolay değil. Çabalarınız için teşekkürler.
Tom Stickel

Döngüler için iç içe geçme konusunda çok katılıyorum. Özlü olma uğruna oradadır. Bir optimizasyon bakış açısından evet, içiçe döngü için kendi özel yönteminde olmalıdır ve parametrelerin belirtilmesi gerekir, kodun çok daha savunmacı olması gerekir, vb.
william-kid

0

Çok basit.

Glifikon simgesi ve ardından "İstek Listesi" gibi bir şeye sahip olmak istiyorsanız,

<span class="glyphicon-heart"></span> @Html.ActionLink("Wish List (0)", "Index", "Home")

0

Bootstrap bileşenleri kullanarak çözümüm:

<a class="btn btn-primary" href="@Url.Action("resetpassword", "Account")">
    <span class="glyphicon glyphicon-user"></span> Reset Password
</a>

0

Lütfen size yardımcı olabilecek Kodu aşağıda deneyin.

 @Html.ActionLink(" SignIn", "Login", "Account", routeValues: null, htmlAttributes: new {  id = "loginLink" ,**@class="glyphicon glyphicon-log-in"** }) 

sadece basit eklemek, @ class ve sonra gerçek css sınıfı benim sorunumu çözmek için bana yardımcı
Ahsanul
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.