2017-05-19 24 views
1

我在SenseNet中有一个内容定义(CTD),它有一个允许选择多个值的选择字段(AllowMultiple为true)。 XML定义是这样的:为什么我无法将内容导入选择多个选项的SenseNet?

<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

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

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

更改数据

,使所有的前导空格被删除,您可以运行一个脚本来修改你的导出数据,使得该

<Status>Pending Verification; Approved</Status> 

变为这样:

<Status>Pending Verification;Approved</Status> 

修改源代码

如果您可以编译SenseNet源代码,则需要修改Source\SenseNet\ContentRepository\Fields文件夹中的文件ChoiceFields.cs中的函数ConvertToStringList。只要确保所有添加到返回列表的字符串都被修剪(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(); 
    } 
+0

此代码是垃圾。为什么你想要将一个字符串转换为列表?为什么对象有时会是一个字符串,而其他时候是列表我怀疑真正的问题是导入方法认为分号是html特殊字符的一部分。请参阅:https://www.google.com/search?q=wiki+xml+html+special+characters&rlz=1C1OPRA_enUS563US647&oq=wiki+xml+html+special+characters&aqs=chrome..69i57.15711j0j7&sourceid=chrome&ie=UTF-8 – jdweng

+0

代码可能不像人们想要的那样可读,但是,它的源代码非常直接。在这些情况下,最重要的是不要改变函数的行为,这就是你所看到的。如果你理解了SenseNet Content模型,你就会知道为什么它需要一个对象参数,它可以是一个字符串,IEnumerable或List。你对这个问题的怀疑是不正确的。所写的代码解决了这个问题。 –

+0

答案没问题,不同类型的转换与sensenet有关,它们是由设计决定的。第三个选项是使用选项的值(ctd中的属性)。这样,您可以同时使用人类可读的选项文本和选项值,而不需要空间。 –

相关问题