在Code-Behind中获取droplink的价值

时间:2015-02-02 16:26:50

标签: c# sitecore

我试图在后端C#代码的droplink中获取项目的显示名称。我正在使用Sitecore 6.6,而不是使用MVC,并且在CMS中为名为Address的客户端设置了droplink控件。 droplink源转到/sitecore/Templates/User Defined/WAC/Address,各个项目具有符合SEO的名称和可读的显示名称。

例如:

  • 货号:{9E60F5F8-FBF2-4CBD-BB13-6A93397AAC87}
  • 姓名:100-main-street
  • 显示名称:100 Main Street,Sample Town,10011

我的代码:

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

此代码将为我提供项目的ID。如果我使用mainPage.Fields["Address"].DisplayName,我会得到&#34;地址&#34;。

如何从droplink获取项目的显示名称?

4 个答案:

答案 0 :(得分:7)

使用 LookupField 获取以下参考项是示例代码:

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

如果您想要一行,请使用以下代码:

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

答案 1 :(得分:2)

键入将字段强制转换为ReferenceField。然后访问TargetItem属性:

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

答案 2 :(得分:1)

托马斯的答案将根据您的代码而有效。但我建议你也要坚持使用ASP.Net和Sitecore服务器组件。

这样可以避免Null Reference错误,更好地支持页面编辑器,并使代码更易于维护。

你可以在你的标记中使用这样的转发器:

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

然后绑定代码后面的地址:

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

我注意到的另一点是行mainPage.TemplateID.ToString() != "{27A9692F-AE94-4507-8714-5BBBE1DB88FC}"。这也是你可以改进的一点。硬编码ID不是一个好的实践。你可以创建一个类来保存这些东西,或者更好的是,你可以更多地考虑你的设计以避免它。

欢呼声

答案 3 :(得分:0)

所有其他解决方案都很完美,但您也可以使用以下代码:

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

使用这种方法,您可以使用目标项目的每个字段。