Mar*_*ark 13 c# sharepoint csom
如果您正在使用SharePoint中的客户端对象模型,并且访问尚未初始化或已由其检索的属性
Context.Load(property);
Context.ExecuteQuery();
Run Code Online (Sandbox Code Playgroud)
你得到一个例子:
Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException
要么
该集合尚未初始化.它没有被请求或者请求没有被执行.
例外.
如果已经初始化/检索这些属性,是否有任何正确的方法可以检查它们?没有Try/Catch方法.我不喜欢那个人.
我想在抛出异常之前检查并处理它.
我已经查过了
方法,但他们没有帮助.IsPropertyAvaiable仅检查标量属性,并且不会给出结果,例如Web.Lists,虽然未初始化IsObjectPropertyInstantiated,Web.Lists但返回true Web.Lists.
Vad*_*hev 26
我会说你的问题在某种程度上已经包含了正确的答案.
为了确定是否加载了客户端对象属性,可以使用以下方法:
测试用例1:仅加载标量属性
ctx.Load(ctx.Web, w => w.Title);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists") False
ctx.Web.IsPropertyAvailable("Title") True
Run Code Online (Sandbox Code Playgroud)
测试用例2:仅加载复合属性
ctx.Load(ctx.Web, w => w.Lists);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists") True
ctx.Web.IsPropertyAvailable("Title") False
Run Code Online (Sandbox Code Playgroud)
测试用例3:加载标量和复合属性
ctx.Load(ctx.Web, w=>w.Lists,w=>w.Title);
ctx.ExecuteQuery();
//Results
ctx.Web.IsObjectPropertyInstantiated("Lists") True
ctx.Web.IsPropertyAvailable("Title") True
Run Code Online (Sandbox Code Playgroud)
由于ClientObject.IsPropertyAvailable和ClientObject.IsObjectPropertyInstantiated方法期望将属性名称指定为字符串值并且可能导致拼写错误,因此我通常更喜欢以下扩展方法:
public static class ClientObjectExtensions
{
/// <summary>
/// Determines whether Client Object property is loaded
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="clientObject"></param>
/// <param name="property"></param>
/// <returns></returns>
public static bool IsPropertyAvailableOrInstantiated<T>(this T clientObject, Expression<Func<T, object>> property)
where T : ClientObject
{
var expression = (MemberExpression)property.Body;
var propName = expression.Member.Name;
var isCollection = typeof(ClientObjectCollection).IsAssignableFrom(property.Body.Type);
return isCollection ? clientObject.IsObjectPropertyInstantiated(propName) : clientObject.IsPropertyAvailable(propName);
}
}
Run Code Online (Sandbox Code Playgroud)
用法
using (var ctx = new ClientContext(webUri))
{
ctx.Load(ctx.Web, w => w.Lists, w => w.Title);
ctx.ExecuteQuery();
if (ctx.Web.IsPropertyAvailableOrInstantiated(w => w.Title))
{
//...
}
if (ctx.Web.IsPropertyAvailableOrInstantiated(w => w.Lists))
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)