2015-09-11 17 views
6

Trong SharePoint mã phía máy chủ, bạn có thể viết một cái gì đó như:Làm cách nào để trích xuất loại từ một trường?

field.fieldvalueType 

Mà đôi khi sẽ cung cấp cho bạn các loại (DateTime, hay bất cứ điều gì). Đôi khi, đôi khi, nó chỉ trả về Null (ví dụ, trường ID).

Trong CSOM, bạn không có trường đó. Tuy nhiên, có TypeAsString mang đến cho loại SharePoint như:

  • Điện Toán
  • Integer
  • Note

Những gì tôi muốn làm là lấy huge table from MSDN này:

Và Extract "Int32" khi tôi biết rằng tôi đang đối phó với một trường "Integer" và trích xuất "System.String" từ ghi chú của SharePoint.

này kinda hoạt động, nhưng đó là mẹ của tất cả các hacks:

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

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

Sau khi tạo, bạn có thể sử dụng:

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

Bây giờ, những gì là đúng đắn cách để làm điều đó? Tôi chỉ hy vọng câu trả lời không phải là một tuyên bố trường hợp chuyển đổi dài mười chân.

Trả lời

3

Vì không có SPField.FieldValueType property các đối tác trong SharePoint CSOM API, các phương pháp khuyến nông dưới đây trình bày cách thực hiện nó:

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]; 
     } 
    } 
} 

Cách sử dụng

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

Tôi đoán, đôi khi, đơn giản là không có cách nào lười biếng. http://www.quote2day.com/wp-content/uploads/Photo-35.jpg – David

+1

:) tôi cũng coi bản thân mình là một người lười biếng, nhưng trong trường hợp đặc biệt này, nó có vẻ là cách duy nhất .. –

-1

Bạn có thể lấy loại lĩnh vực sử dụng đoạn mã sau:

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

Xin chào, bạn đã đọc câu hỏi chưa? – David

+0

Xin lỗi tôi đang nhầm lẫn với những gì được yêu cầu?Bạn có muốn nhận được giá trị của lĩnh vực này? i, e: Chỉ cần gọi một phương thức để lấy giá trị và nó trả về giá trị dựa trên kiểu của nó? – ibrahims

+1

Xin lỗi nhưng câu hỏi khá rõ ràng. Câu trả lời của bạn là * theo nghĩa đen * dòng thứ hai của câu hỏi (điều này rõ ràng thực sự bực bội). Tôi cần lấy loại trường mà không cần tạo mục danh sách. Đọc câu hỏi để giải thích tại sao đoạn mã của bạn không hoạt động. – David

0

Nói chung, bạn cần thực hiện việc lập bản đồ bạn mô tả, không phải là phương pháp myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName .

Lý do là, myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName sẽ không thành công trong trường hợp giá trị trường (ví dụ: Title) là null cho đối tượng ListItem cụ thể đó. (Mặc dù Title không phải là null, các trường khác có thể và không có giá trị null). Và rõ ràng null không cung cấp cho bạn một đối tượng mà trên đó bạn có thể gọi phương thức GetType() (bạn sẽ nhận được một NullReferenceException rõ ràng). Vì vậy, đối với một giải pháp chung cho vấn đề, người ta thực sự phải ánh xạ String được trả về từ TypeAsString của trường danh sách, gọi từ trường danh sách/danh sách, và không phải từ mục danh sách.

1

Mở rộng trên @ câu trả lời Vadim của, đây là một phiên bản không xây dựng một từ điển mới mỗi khi phương thức mở rộng được gọi;

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]; 
     } 
    } 
} 
Các vấn đề liên quan