2015-02-02 6 views
5

Sto cercando di ottenere il nome visualizzato di un elemento in un collegamento a discesa nel codice C# back-end. Sto usando Sitecore 6.6, non usando MVC e sto impostando un controllo di collegamento a discesa nel CMS per i client chiamati Address. L'origine del collegamento di selezione passa a /sitecore/Templates/User Defined/WAC/Address e i singoli elementi hanno un nome conforme a SEO e un nome visualizzato leggibile.Ottieni il valore di droplink in Code-Behind

Ad esempio:

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

Il mio codice:

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; 
} 

Questo codice mi darà l'ID dell'articolo. Se uso mainPage.Fields["Address"].DisplayName, ottengo "Indirizzo".

Come è possibile ottenere il Nome visualizzato dell'elemento dal collegamento di selezione?

risposta

2

Digitare il campo in un campo di riferimento. Poi accedere alla proprietà TargetItem:

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

Grazie a tutti per gli ottimi consigli! Ci proverò. :) – BaronForo

1

Thomas risposta sarebbe lavoro basato sul codice. Ma ti suggerirei anche di provare ad attaccare con i componenti server ASP.Net e Sitecore.

Ciò eviterà errori di riferimento Null, supporterà l'editor di pagine e inoltre faciliterà la manutenzione del codice.

Si può avere un ripetitore nel markup come questo:

<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> 

e quindi associare l'indirizzo sul vostro codice dietro:

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

Un altro punto che ho notato è stata la linea mainPage.TemplateID.ToString() != "{27A9692F-AE94-4507-8714-5BBBE1DB88FC}". Questo è un punto che potresti anche migliorare. Gli ID hard codificati non sono una buona pratica. Potresti creare un corso per tenere quelle cose o, ancora meglio, potresti pensare di più al tuo progetto per evitarlo.

applausi

6

Usa LOOKUPFIELD per ottenere voce refrence di seguito sono il codice di esempio:

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

Se si desidera utilizzare una linea che utilizzare sottostante Codice:

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

Tutto altre soluzioni sono perfette, ma è anche possibile utilizzare il codice seguente:

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 
{ 
} 

Con questo approccio è possibile utilizzare tutti i campi dell'elemento target.