كيفية الحصول على الحقول المخصصة فقط من قائمة?
-
10-12-2019 - |
سؤال
أنا أعمل مع نموذج كائن جانب العميل.في تطبيق وحدة التحكم ، أقوم باسترداد جميع الحقول من قائمة مخصصة.المشكلة هي أن كلينتكونتيكست يجلب لي مجموعة من الحقول الداخلية لا أريد أن يتم تضمينها.يؤدي هذا أيضا إلى ظهور بعض الحقول أكثر من مرة.
string siteURL = "http:XYZ";
ClientContext context = new ClientContext(siteURL);
Web oWebSite = context.Web;
context.Load(oWebSite);
context.ExecuteQuery();
//Get the list by title
List produktKatalogListe = spLists.GetByTitle("Produktkatalog");
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = "<View/>";
ListItemCollection listItems = produktKatalogListe.GetItems(camlQuery);
context.Load(produktKatalogListe);
context.Load(listItems);
context.Load(produktKatalogListe.Fields);
context.ExecuteQuery();
foreach(Field field in produktKatalogListe.Fields)
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",field.Title,field.InternalName,field.Hidden,field.CanBeDeleted,field.FieldTypeKind);
}
هل هناك طريقة لطباعة الحقول المخصصة فقط?هذا يعني حذف الحقول مثل internalID
, GUID
...
حاولت ما يلي:
if(!field.Hidden)
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",field.Title,field.InternalName,field.Hidden,field.CanBeDeleted,field.FieldTypeKind);
}
لسوء الحظ ، لا يؤدي هذا إلى حل المشكلة فحسب ، بل إنه أيضا ليس حلا جيدا جدا للحالة التي أرغب في عرض الحقول المخصصة ولكن المخفية.
المحلول 2
يبدو أن النهج التالي يحل المشكلة.بدلا من ذلك للتحقق مما إذا كان الحقل ليس كذلك Hidden
راجعت ما إذا كان لا FromBaseType
.
if(!field.FromBaseType)
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",field.Title,field.InternalName,field.Hidden,field.CanBeDeleted,field.FieldTypeKind);
}
نصائح أخرى
في سسوم SPField.SourceId الخاصية تسمح بتحديد
إما مساحة الاسم التي تحدد حقلاً مضمنًا، أو إذا كان مخصص مجال, ، GUID الذي يحدد القائمة أو موقع الويب حيث تم إنشاؤه.
في CSOM SourceId
لا يتم الكشف عن الممتلكات ل مجال كائن، ولكن يمكن استخراجه من SchemaXml كما هو موضح أدناه:
private static Dictionary<string, string> ParseSchemaXml(string schemaXml)
{
var properties = new Dictionary<string, string>();
var xdoc = XDocument.Parse(schemaXml);
var attributes = xdoc.Descendants("Field").Attributes();
foreach (var attr in attributes)
{
if(!properties.ContainsKey(attr.Name.LocalName))
properties.Add(attr.Name.LocalName,attr.Value);
}
return properties;
}
//Usage
var properties = ParseSchemaXml(field.SchemaXml);
var sourceId = properties["SourceID"];
يوضح المثال التالي كيفية استرداد وطباعة الحقول المخصصة لقائمة:
public static void PrintCustomFields(string url, string listTitle)
{
const string fieldBuiltInNS = "http://schemas.microsoft.com/sharepoint/v3";
using (var context = new ClientContext(url))
{
//context.Credentials = credentials;
var web = context.Web;
var list = web.Lists.GetByTitle(listTitle);
web.Context.Load(list, l => l.Fields);
web.Context.ExecuteQuery();
foreach (var field in list.Fields)
{
var properties = ParseSchemaXml(field.SchemaXml);
if (properties["SourceID"] != fieldBuiltInNS)
{
Console.WriteLine("Field: {0}",field.InternalName);
}
}
}
}