1

我在 SenseNet 中有一个内容定义 (CTD),它有一个选项字段,允许选择多个值(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错误。

我该如何解决这个问题?

4

1 回答 1

1

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

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

更改您的数据

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

<Status>Pending Verification; Approved</Status>

改成这样:

<Status>Pending Verification;Approved</Status>

修改源代码

如果可以编译 SenseNet 源代码,则需要修改文件夹ConvertToStringList中文件中的函数。只需确保添加到返回列表的所有字符串都被修剪 ( )。ChoiceFields.csSource\SenseNet\ContentRepository\FieldsString.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();
    }
于 2017-05-19T03:22:34.930 回答