为什么我无法将内容导入到选择了多个选项的SenseNet中?

时间:2017-05-19 03:22:35

标签: c# xml sensenet

我在SenseNet中有一个内容定义(CTD),它有一个允许选择多个值的Choice字段(AllowMultiple为真)。 XML定义如下所示:

<Field name="Status" type="Choice">
  <DisplayName>Status</DisplayName>
  <Configuration>
    <AllowMultiple>true</AllowMultiple>
    <Options>
      <Option>In Processing</Option>
      <Option>In Review</Option>
      <Option>Tabled</Option>
      <Option>Pending Verification</Option>
      <Option>Approved</Option>
    </Options>
  </Configuration>
</Field>

当我选择多个选项导出数据时,此字段的XML输出用;(分号+空格)分隔选项选项,如下所示:

<Status>Pending Verification; Approved</Status>

当我尝试导入导出的数据时,出现InvalidExtraValue错误。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

此处的问题与导出的XML数据中的分号后的空格有关。 SenseNet中的导入功能通过查找逗号或分号分隔符来拆分XML数据字符串,然后返回值的List<string>集合。您可能已经猜到,前导空格未被删除,这导致与有效选项选项的比较失败。

有两种方法可以解决此问题;您可以更改数据,也可以修改源代码。

更改您的数据

您可以运行脚本来修改导出的数据,以便删除所有前导空格,以便

<Status>Pending Verification; Approved</Status>

更改为:

<Status>Pending Verification;Approved</Status>

修改源代码

如果您可以编译SenseNet源代码,则需要修改文件夹ConvertToStringList中文件ChoiceFields.cs中的函数Source\SenseNet\ContentRepository\Fields。只需确保添加到返回列表中的所有字符串都已修剪(String.Trim())。

使用以下代码替换此功能,重建项目,导入将正常工作 - 您无需更改数据。

    public static List<string> ConvertToStringList(object value)
    {
        List<string> list = value as List<string>;
        if (list != null)
            return list.Select(s => s.Trim()).ToList();

        list = new List<string>();
        string stringValue = value as string;
        if (stringValue != null)
        {
            list.Add(stringValue);
        }
        else
        {
            IEnumerable enumerableValue = value as IEnumerable;
            if (enumerableValue == null)
            {
                list.Add(value.ToString());
            }
            else
            {
                foreach (object item in enumerableValue)
                    list.Add(item.ToString());
            }
        }
        return list.Select(s => s.Trim()).ToList();
    }