2017-05-19 6 views
1

는 여러 개의 값을 선택할 수 있도록하는 선택 필드 (AllowMultiple가 true)가 SenseNet의 내용 정의 (CTD)가 있습니다. 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 데이터 문자열을 나눈 다음 List<string> 값 모음을 반환합니다. 추측 하듯이 선행 공간은 제거되지 않으며 이로 인해 유효한 선택 옵션과의 비교가 실패합니다. 이 문제를 해결하는 방법은 두 가지가 있습니다

; 데이터를 변경하거나 소스 코드를 수정할 수 있습니다.

귀하의 데이터를 변경

모든 선행 공백이 제거되도록이

<Status>Pending Verification; Approved</Status> 

이 변경되도록 당신은 내 보낸 데이터를 수정하는 스크립트를 실행할 수 있습니다

:

<Status>Pending Verification;Approved</Status> 

소스 코드 수정

SenseNet 소스 코드를 컴파일 할 수있는 경우 파일 ChoiceFields.csSource\SenseNet\ContentRepository\FieldsConvertToStringList 파일을 수정해야합니다. 반환 된 목록에 추가 된 모든 문자열이 다듬어 졌는지 확인하십시오 (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

이 코드는 쓰레기입니다. 왜 문자열을리스트 으로 변환하고 싶습니까? 왜 때로는 객체가 문자열이되고 다른 경우가 될 것입니다. List 실제 문제는 수입 메소드가 세미콜론을 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

대답은 ok입니다. 다른 유형 변환은 sensenet과 관련되어 있으며, 의도적으로 설계되었습니다. 세 번째 옵션은 옵션 값 (ctd의 속성)을 사용하는 것입니다.그렇게하면 동시에 사람이 읽을 수있는 옵션 텍스트와 옵션 값을 공백없이 사용할 수 있습니다. –