Kentico - 转换以显示列表框或多项选择的文本值

Kentico - Transformations to display text value of List box or Multiple choice

这看起来是个简单的问题,但我试了几个小时还是没弄明白。对于我的自定义页面类型,我有一个名为 "Location" 的字段,它显示带有位置名称的复选框列表。我检查了多个框,但是使用 Eval("Location"),显示是这样的:1|3|6,但不是 San Francisco、San Jose、Fresno。感谢您的帮助!

PS: 我搜索了一下发现this old post dated 2011。我不确定如何实现 API 选项,并且 javascript 选项不好,因为我的列表是动态的而且很长。考虑到我现在使用 Kentico 9 并且在 2016 年而不是 2011 年,也不确定是否有不同的方法来实现这一点:d

您的 "Location" 字段似乎没有存储显示名称值,而是存储了一些其他值,例如指向其他数据库的 ID table - 这实际上是一个很好的选择事情,但检索这些值确实可能有点困难。

没有任何开箱即用的方法可以将此 ID 列表 (1|3|6...) "convert" 转换为实际值。

您实际上需要创建自己的 Transformation method,它可以使用您的 Location 字段的值并使用 C# 和适当的提供程序(取决于您的数据存储位置)将其转换为实际值。

如果您能提供更多关于您的数据存储方式和存储位置的信息,我或许可以为您提供一些代码示例。

在这种情况下(如果是一次性设置)我通常做的是在转换中创建一个函数。如果你需要在其他地方使用它,为它创建一个自定义方法并通过宏或转换方法暴露它。

您可以在转换中添加类似这样的内容(假设您的位置在自定义表中):

<script runat="server">
public string GetLocations()
{
    string returnValue = "";
    string[] locations = Eval<string>("Location").Split('|');
    foreach (string s in locations)
    {
        var item = CMS.CustomTables.CustomTableItemProvider.GetItem(ValidationHelper.GetInteger(s, -1), "your.CustomTable");
        if (item != null)
        {
            returnValue += string.Format("<p>{0}</p>", item.GetValue("LocationName"));
        }            
    }

    return returnValue;
}

然后像这样使用它:

<h2>Locations:</h2>
<%# GetLocations() %>

您能否将表格中的数字更改为地点名称?例如

San Francisco;San Francisco
San Jose;San Jose
Fresno;Fresno

那么在你的转型中你可以做

<% Eval("Location").ToString().Replace("|",", ") %>

如果您不能更改数字并且愿意编写自定义内容,我详细说明了如何获得 list of options in this post