2015-09-11 34 views
6

W SharePoint kodu po stronie serwera, można napisać coś takiego:Jak wyodrębnić typ z pola?

field.fieldvalueType 

Które czasami daje typ (DateTime, lub cokolwiek). Irytujące, czasami po prostu zwraca Null (na przykład pole ID).

W CSOM nie masz tego pola. Istnieje jednak TypeAsString co daje rodzajów SharePoint, takich jak:

  • obliczane
  • Integer
  • Uwaga

Co chciałbym zrobić, to chwycić tej huge table from MSDN:

i wyodrębnić "Int32", gdy wiem, że mam do czynienia z polem "Integer" i rozpakowuję "System.String" z notatki SharePoint.

to trochę roboty, ale to matka wszystkich hacków:

var myTempItem = list.AddItem(new ListItemCreationInformation()); 
myTempItem.Update(); 
context.ExecuteQuery(); 

context.Load(myTempItem); 
context.ExecuteQuery(); 

Po stworzeniu, można użyć:

myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName -> Gives->System.Int32

Teraz, jaka jest właściwa sposób to zrobić? Mam tylko nadzieję, że odpowiedź nie jest dziesięciostopową instrukcją zmiany przełącznika.

Odpowiedz

3

Ponieważ nie ma SPField.FieldValueType property odpowiednikami w SharePoint CSOM API następujący sposób rozszerzenie pokazuje, jak wykonać go:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.SharePoint.Client; 
using Field = Microsoft.SharePoint.Client.Field; 

namespace SharePoint.Client.Extensions 
{ 
    public static class FieldExtensions 
    { 


     public static Type GetFieldValueType(this Field field) 
     { 
      var table = new Dictionary<FieldType, Type>(); 
      table[FieldType.Guid] = typeof(Guid); 
      table[FieldType.Attachments] = typeof(bool); 
      table[FieldType.Boolean] = typeof(bool); 
      table[FieldType.Choice] = typeof (string); 
      table[FieldType.CrossProjectLink] = typeof(bool); 
      table[FieldType.DateTime] = typeof(DateTime); 
      table[FieldType.Lookup] = typeof(FieldLookupValue); 
      table[FieldType.ModStat] = typeof(int); 
      table[FieldType.MultiChoice] = typeof(string[]); 
      table[FieldType.Number] = typeof(double); 
      table[FieldType.Recurrence] = typeof(bool); 
      table[FieldType.Text] = typeof(string); 
      table[FieldType.URL] = typeof(FieldUrlValue); 
      table[FieldType.URL] = typeof(FieldUrlValue); 
      table[FieldType.User] = typeof(FieldUserValue); 
      table[FieldType.WorkflowStatus] = typeof(int); 
      table[FieldType.ContentTypeId] = typeof(ContentTypeId); 
      table[FieldType.Note] = typeof(string); 
      table[FieldType.Counter] = typeof(int); 
      table[FieldType.Computed] = typeof(string); 
      table[FieldType.Integer] = typeof(int); 
      table[FieldType.File] = typeof(string); 

      if (!table.ContainsKey(field.FieldTypeKind)) 
       throw new NotSupportedException(string.Format("Unknown field type: {0}", field.FieldTypeKind)); 
      return table[field.FieldTypeKind]; 
     } 
    } 
} 

Wykorzystanie

var list = ctx.Web.Lists.GetByTitle(listTitle); 
var fields = list.Fields; 
ctx.Load(fields); 
ctx.ExecuteQuery(); 

foreach (var field in fields) 
{ 
    if (field.FieldTypeKind != FieldType.Invalid) 
    { 
     var fieldValueType = field.GetFieldValueType(); 
     Console.WriteLine("{0} : {1}", field.InternalName, fieldValueType);  
    }   
} 
+0

Myślę, że czasami po prostu nie ma leniwego wyjścia. http://www.quote2day.com/wp-content/uploads/Photo-35.jpg – David

+1

:) Uważam się też za leniwą osobę, ale w tym konkretnym przypadku wydaje się, że jest to jedyna droga ... –

-1

można uzyskać typ pola stosując następujący fragment:

item.Fields["Title"].FieldValueType.FullName 
+0

Witam, czy przeczytałeś pytanie? – David

+0

Przepraszam, jestem zdezorientowany co do tego, co jest wymagane?Czy chcesz uzyskać wartość pola? i, e: Wystarczy wywołać metodę, aby uzyskać wartość i zwraca wartość na podstawie jej typu? – ibrahims

+1

Przepraszamy, ale pytanie jest całkiem jasne. Twoja odpowiedź brzmi * dosłownie * druga linia pytania (co oczywiście jest naprawdę frustrujące). Potrzebuję uzyskać typ pola bez tworzenia elementu listy. Przeczytaj pytanie dotyczące wyjaśnienia, dlaczego Twój fragment nie działa. – David

0

Generalnie trzeba zrobić mapowanie pan opisać nie sposób myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName .

Powód jest taki, że myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName zakończy się niepowodzeniem w scenariuszu, w którym wartość pola (np. Tytuł) jest pusta dla tego konkretnego obiektu ListItem. (Podczas gdy tytuł nie jest ogólnie zerowy, inne pola mogą być i są puste). Oczywiście null nie daje obiektu, który można nazwać metodą GetType() (oczywiście otrzymasz oczywiście NullReferenceException).

Dla ogólnego rozwiązania problemu konieczne jest odwzorowanie ciągu znaków zwróconego przez TypeAsString z pola listy, wywołanie z listy obiektu/listy, a nie z elementu listy.

1

Rozszerzając @ odpowiedź Vadima, tutaj jest wersja nie tworzy nowego słownika za każdym razem, gdy wywoływana jest metoda rozszerzenia;

namespace SharePoint.Client.Extensions 
{ 
    public static class FieldExtensions 
    { 
     private static Dictionary<FieldType, Type> _fieldTypes = new Dictionary<FieldType, Type>() 
     { 
      { FieldType.Guid, typeof(Guid) }, 
      { FieldType.Attachments, typeof(bool)}, 
      {FieldType.Boolean, typeof(bool)}, 
      {FieldType.Choice, typeof(string)}, 
      {FieldType.CrossProjectLink, typeof(bool)}, 
      {FieldType.DateTime, typeof(DateTime)}, 
      {FieldType.Lookup, typeof(FieldLookupValue)}, 
      {FieldType.ModStat, typeof(int)}, 
      {FieldType.MultiChoice, typeof(string[])}, 
      {FieldType.Number, typeof(double)}, 
      {FieldType.Recurrence, typeof(bool)}, 
      {FieldType.Text, typeof(string)}, 
      {FieldType.URL, typeof(FieldUrlValue)}, 
      {FieldType.User, typeof(FieldUserValue)}, 
      {FieldType.WorkflowStatus, typeof(int)}, 
      {FieldType.ContentTypeId, typeof(ContentTypeId)}, 
      {FieldType.Note, typeof(string)}, 
      {FieldType.Counter, typeof(int)}, 
      {FieldType.Computed, typeof(string)}, 
      {FieldType.Integer, typeof(int)}, 
      {FieldType.File, typeof(string)} 
     }; 

     public static Type GetFieldValueType(this Field field) 
     { 
      if (!_fieldTypes.ContainsKey(field.FieldTypeKind)) 
       throw new NotSupportedException(string.Format("Unknown field type: {0}", field.FieldTypeKind)); 
      return _fieldTypes[field.FieldTypeKind]; 
     } 
    } 
}