在代码后端获取下拉链接的值

6
我正在尝试在后端的C#代码中获取下拉链接中项目的显示名称。我使用的是Sitecore 6.6,不使用MVC,并在CMS中为客户设置了一个名为Address的下拉链接控件。下拉链接源指向/sitecore/Templates/User Defined/WAC/Address,每个项目都有符合SEO标准的名称和可读的显示名称。
例如:
  • 项目ID:{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,我将得到"Address"。

那么,如何从一个下拉列表中获取该项的显示名称呢?

4个回答

10

使用 LookupField 获取引用项,以下是示例代码:

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

如果你想将它放在一行中,那么请使用以下代码:

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

很好的答案,但是也要对所有的东西进行空值检查。 - Paul

3

将字段强制转换为ReferenceField类型,然后访问TargetItem属性:

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

谢谢大家提供的好建议!我会尝试一下的。 :) - BaronForo

1

根据您的代码,Thomas的答案是可行的。但我建议您也尝试使用ASP.Net和Sitecore服务器组件。

这将避免空引用错误,更好地支持页面编辑器,并使您的代码更易于维护。

您可以在标记中使用一个重复器,如下所示:

<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 不是一种好的做法。你可以创建一个类来保存这些信息,或者更好的是,你可以仔细考虑你的设计来避免这种情况。

祝好


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接