我在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
错误。
如何解决此问题?
答案 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();
}