2015-02-02 9 views
5

Próbuję uzyskać nazwę wyświetlaną elementu w odsyłaczu w back-end C# code. Używam Sitecore 6.6, nie używając MVC, i ustawiam kontrolę droplink w CMS dla klientów o nazwie Address. Źródło zrzutu przychodzi do /sitecore/Templates/User Defined/WAC/Address, a poszczególne elementy mają nazwę zgodną z SEO i czytelną nazwę wyświetlaną.Uzyskaj wartość linku w kodzie za

Na przykład:

  • Item ID: {9E60F5F8-FBF2-4CBD-BB13-6A93397AAC87}
  • Nazwa: 100-main street
  • Display Name: 100 Main Street, Sample Miasto, 10011

Mój kod:

protected void Page_Load(object sender, EventArgs e) 
{ 
    String sl = ""; 
    Sitecore.Data.Items.Item currentItem = Sitecore.Context.Item; 
    // BEGIN main class list 
    Sitecore.Collections.ChildList classList = currentItem.Children; 
    foreach (Sitecore.Data.Items.Item mainPage in classList) 
    { 
     if (mainPage.TemplateID.ToString() == "{27A9692F-AE94-4507-8714-5BBBE1DB88FC}") 
     { 
      sl += "<span class=\"address\">" + mainPage.Fields["Address"] +"</span>"; 
     }        
     else 
     { 
     } 
    } 
    // END main class list 
    classSessionList.Text = sl; 
} 

Ten kod poda identyfikator przedmiotu. Jeśli użyję mainPage.Fields["Address"].DisplayName, otrzymam "Adres".

Jak uzyskać nazwę wyświetlaną elementu z odsyłacza?

Odpowiedz

2

Wpisz rzut pola na pole referencyjne. Następnie uzyskaj dostęp do właściwości TargetItem:

sl += "<span class=\"address\">" + ((ReferenceField)mainPage.Fields["Address"]).TargetItem.DisplayName +"</span>"; 
+0

Dziękuję wszystkim za wspaniałe wskazówki! Wypróbuję to. :) – BaronForo

1

Odpowiedź thomas będzie działać w oparciu o twój kod. Ale sugerowałbym także, abyś spróbował trzymać się komponentów serwera ASP.Net i Sitecore.

To pozwoli uniknąć błędów odniesień zerowych, będzie lepiej obsługiwać edytor stron, a także ułatwi utrzymanie kodu.

Można mieć repeater w swoim znaczników tak:

<asp:Repeater ID="rptAdresses" runat="server"> 
    <ItemTemplate> 
     <span class="address"> 
      <sc:Text id="scAddress" runat="server" Field="__Display Name" Item="<%#(Sitecore.Data.Items.Item)Container.DataItem%>"></sc:Text> 
     </span> 
    </ItemTemplate> 
</asp:Repeater> 

A następnie powiązać adres na kodzie za:

private void BindRepeater() 
{ 
    if (mainPage.TemplateID.ToString() != "{27A9692F-AE94-4507-8714-5BBBE1DB88FC}") 
    { 
     rptAdresses.Visible = false; 
    } 
    else 
    { 
     rptAdresses.DataSource = Sitecore.Context.Item.GetChildren(); 
     rptAdresses.DataBind(); 
    } 
} 

Kolejnym punktem było zauważyć, że linia mainPage.TemplateID.ToString() != "{27A9692F-AE94-4507-8714-5BBBE1DB88FC}". To jest kwestia, którą możesz poprawić. Identyfikatory o twardym kodowaniu nie są dobrą wskazówką. Możesz stworzyć klasę do przechowywania tych rzeczy lub, jeszcze lepiej, lepiej pomyśleć o swoim projekcie, aby tego uniknąć.

okrzyki

6

Zastosowanie LookupField dla uzyskania pozycji refrence poniżej przykładowy kod:

LookupField address= (LookupField)mainPage.Fields["Address"]; 
Item addressItem = address.TargetItem; 
string displayName = addressItem.Fields["DisplayName"].Value; 

Jeśli chcesz użyć jednej linii niż skorzystać z poniższego kodu:

((LookupField)mainPage.Fields["Address"]).TargetItem.DisplayName 
0

Wszystko inne rozwiązania są idealne, ale możesz także użyć poniższego kodu:

var itemID=mainPage.Fields["Address"].value; 
Item targetItem=Sitecore.Context.Database.GetItem(itemID); 

if (mainPage.TemplateID.ToString() == "{27A9692F-AE94-4507-8714-5BBBE1DB88FC}") 
{ 
    sl += "<span class=\"address\">" + targetItem.DisplayName +"</span>"; 
}        
else 
{ 
} 

Dzięki takiemu podejściu można użyć każdego pola elementu docelowego.