2010-12-09 18 views

Respuesta

8

de objetos de servidor Modelo

string siteUrl = "http://mysite"; 
using (SPSite site = new SPSite(siteUrl)) 
{ 
    using (SPWeb web = site.OpenWeb()) 
    { 
     SPList list = web.Lists["my forum"]; 
     for (int i = 0; i < list.Fields.Count; i++) 
     { 
      if (list.Fields[i].Title == "xyz") 
      { 
       - 
       - 
      } 
     } 
    } 
} 

modelo de objetos cliente

string siteUrl = "http://MyServer/sites/MySiteCollection"; 
ClientContext clientContext = new ClientContext(siteUrl); 
SP.List List = clientContext.Web.Lists.GetByTitle("my forum"); 
for (int i = 0; i < list.Fields.Count; i++) 
{ 
    if (list.Fields[i].Title == "xyz") 
    { 
     - 
     - 
    } 
} 
+0

Es modelo de objetos de servidor en su ejemplo – axk

+0

es que no hay mucha diferencia en ambos códigos, excepto el contexto de cliente –

+0

Ashutosh, gracias por su responder. +1 – MagicAndi

2

Terminé la recuperación de los datos de los campos de la lista antes de mi operación, y guardarlos en una lista genérica de estructuras (que contiene detalles de cada campo). Luego consulto esta lista (genérica) para ver si el campo actual realmente existe en la lista dada (SharePoint).

// Retrieve detail sof all fields in specified list 
using (ClientContext clientContext = new ClientContext(SharePointSiteUrl)) 
{ 
    List list = clientContext.Web.Lists.GetByTitle(listName); 
    _listFieldDetails = new List<SPFieldDetails>(); 

    // get fields name and their types 
    ClientObjectPrototype allFields = list.Fields.RetrieveItems(); 
    allFields.Retrieve(FieldPropertyNames.Title, 
         FieldPropertyNames.InternalName, 
         FieldPropertyNames.FieldTypeKind, 
         FieldPropertyNames.Id, 
         FieldPropertyNames.ReadOnlyField); 
    clientContext.ExecuteQuery(); 

    foreach (Field field in list.Fields) 
    { 
     SPFieldDetails fieldDetails = new SPFieldDetails(); 
     fieldDetails.Title = field.Title; 
     fieldDetails.InternalName = field.InternalName; 
     fieldDetails.Type = field.FieldTypeKind; 
     fieldDetails.ID = field.Id; 
     fieldDetails.ReadOnly = field.ReadOnlyField; 
     listFieldDetails.Add(fieldDetails); 
    } 
} 

// Check if field name exists 
_listFieldDetails.Exists(field => field.Title == fieldName); 

// Struct to hold details of the field 
public struct SPFieldDetails 
{ 
    public string Title { get; set; } 
    public string InternalName { get; set; } 
    public Guid ID { get; set; } 
    public FieldType Type { get; set; } 
    public bool ReadOnly { get; set; } 
} 
11

acaba de encontrar esto mientras que la búsqueda de la misma cosa, pero parece que Sharepoint 2010 tiene algo incorporado para esto, al menos para el modelo de servidor: list.Fields.ContainsField("fieldName");

No estoy seguro si existe para el lado del cliente aunque. Pensé que sería un buen lugar para almacenar esta información, sin embargo.

3

El método siguiente muestra cómo determinar si existe una columna especificada en un List usando OMSC:

static class FieldCollectionExtensions 
{ 
    public static bool ContainsField(this List list,string fieldName) 
    { 
     var ctx = list.Context; 
     var result = ctx.LoadQuery(list.Fields.Where(f => f.InternalName == fieldName)); 
     ctx.ExecuteQuery(); 
     return result.Any(); 
    } 
} 

Uso

using(var ctx = new ClientContext(webUrl)) 
{ 
    var list = ctx.Web.Lists.GetByTitle(listTitle); 
    if(list.ContainsField("Title")){ 
     //... 
    } 
} 
0

prefiero la biblioteca de SharePoint Plus, ya que es realmente limpio: http://aymkdn.github.io/SharepointPlus/symbols/%24SP%28%29.list.html

$SP().list("My List").get({ 
    fields:"Title", 
    where:"Author = '[Me]'" 
},function getData(row) { 
    console.log(row[0].getAttribute("Title")); 
}); 

Puede configurar un bucle for para recorrer la fila y verificar si existe la columna que está buscando.

3

He aquí un código de extensión (OMSC) para la lista de SharePoint

public static bool DoesFieldExist(this List list, ClientContext clientContext, string internalFieldname) 
    { 
     bool exists = false; 

     clientContext.Load(list.Fields, fCol => fCol.Include(
       f => f.InternalName 
      ).Where(field => field.InternalName == internalFieldname)); 
     clientContext.ExecuteQuery(); 

     if (list.Fields != null && list.Fields.Count > 0) 
     { 
      exists = true; 
     } 

     return exists; 
    } 

uso

List targetList = this.Context.Web.Lists.GetById(<ListID>); 
targetList.DoesFieldExist(<ClientContext>, <Field internal Name>) 

disfrutar :)

2

Algunas buenas respuestas anteriores. Yo personalmente utilizado con éste:

  List list = ctx.Web.Lists.GetByTitle("Some list"); 
      FieldCollection fields = list.Fields; 
      IEnumerable<Field> fieldsColl = ctx.LoadQuery(fields.Include(f => f.InternalName)); 
      ctx.ExecuteQuery(); 

      bool fieldMissing = fieldsColl.Any(f => f.InternalName != "Internal_Name"); 

También puede utilizar 'Dónde' después de la inclusión del método y comprobar si la recolección/campo devuelto es nulo. Se trata de preferencia personal, porque ambas opciones se consultan por el lado del cliente.

-2

a mucho uso de códigos Este

campos de carga primero y luego

bool exists= clientContext2.Site.RootWeb.Fields.Any(o => o.Id.ToString() == a.Id.ToString()); 
Cuestiones relacionadas