Sharepoint学习笔记—习题系列--70-573习题解析 -(Q85-Q87)
Question 85
You create a Microsoft .NET Framework console application that uses a Representational State Transfer (REST) API to query a custom list named Products.
The application contains the following code segment.
AdventureWorksDataContext codc = new AdventureWorksDataContext(new Uri("http://contoso/_vti_bin/listdata.svc"));
codc.Credentials = CredentialCache.DefaultCredentials;
You need to read all items in Products into an object.
Which method should you use?
A. codc.Products.All;
B. codc.Products.AsQueryable;
C. codc.Products.ElementAt;
D. codc.Products.ToList;
解析:
本题的操作思想是在一个Console应用程序中引用一个Service。通常当你在VS2010中创建此引用时,VS2010会为你创建一个service.edmx文件,此文件就是一个描述EDM(Entity Data Mode)的文件。有了此文件,你的Console应用程序就直接与此EDM打交道而不用管实际的数据是从哪儿来的(数据可以来自于Sharepoint,Data Base甚至内存),它就像一个中介代替,接收你的数据请求,处理你的请求,然后返还给你想要的结果。需要注意的是,此Service 引用将创建的是“强类型”的数据DataContext,此DataContext直接映射的是你整个网站的结构(如果你的数据源是Sharepoint网站的话)。
本题就是把上述描述的功能通过AdventureWorksDataContext类来实现,对于DataContext类型的数据,我们可以像对待一个类实例一样去访问它或者也可以使用类似于LINQ的语法去读取其中的数据。
在各选项中
选项A: codc.Products.All :返回所有的Products,[它并不是把这些Products读取到某个object中去]
选项B: codc.Products.AsQueryable: AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
选项C:codc.Products.ElementAt:返回序列中指定的Product
选项D:ToList:把所有的元素读取到List对象.[符合本题read all items in Products into an object的要求]
所以本题目正确选项应该是D
参考:
http://blogs.msdn.com/b/vssharepointtoolsblog/archive/2010/05/25/surfacing-business-data-in-a-web-part-that-you-create-by-using-sharepoint-tools-in-visual-studio.aspx
http://msdn.microsoft.com/en-us/library/vstudio/ee231515.aspx
http://extendtheenterprise.com/2010/11/03/using-sharepoint-2010-rest-apis-in-asp-net/
http://msdn.microsoft.com/en-us/library/bb342261.aspx
Question 86
You have a SharePoint Web application that has the URL http://intranet.
You are creating a Microsoft .NET Framework application that will display the title of the SharePoint Web application and will execute outside of the SharePoint server.
You create a textbox named textBoxTitle.
You write the following code segment. (Line numbers are included for reference only.)
01 ClientContext context = new ClientContext("http://intranet");
02
03 Web site = context.Web;
04 context.Load(site);
05
06 textBoxTitle.Text = site.Title;
You discover that line 04 generates an error.
You need to ensure that the .NET application displays the title of the SharePoint Web application in textBoxTitle.
What should you do?
A. Add the following line of code at line 02:
context.ExecuteQuery();
B. Add the following line of code at line 02:
context.ValidateOnClient = true;
C. Add the following line of code at line 05:
context.ExecuteQuery();
D. Add the following line of code at line 05:
context.ValidateOnClient = true;
解析:
这是一道关于Sharepoint客户端编程的题目,我们知道Sharepoint提供了三种客户端对象模型
1、ECMAScript(JavaScript、JScript) 客户端对象模型
2、.NET 托管客户端对象模型
3、Silverlight 客户端对象模型
本题是属于第2种,即.NET 托管客户端对象模型。
不管是哪种模型,我们都可以使用客户端对象模型来检索特定 SharePoint 客户端对象(ClientObject,或者 ECMAScript(JavaScript、JScript) 中的 ClientObject的属性,或检索子对象及其关联的属性或集合中的子项。对象模型使用显式数据检索语义,在检索正常工作的数据时,必须遵循这些语义。客户端对象模型不保留在客户端上本地检索的数据。
执行数据检索涉及以下过程:
1.使用 ClientContext() 构造函数 (JavaScript: ClientContext(serverRelativeUrl)返回客户端请求的上下文。
2.使用对象模型指定要检索的对象或要从中检索数据的对象。
3.通过就地加载或可查询加载来加载对象或集合,就地加载使用 Load<T>(T, []) (JavaScript: load(clientObject) 方法返回特定的对象、集合或数据;可查询加载使用 LoadQuery() (JavaScript: loadQuery(clientObjectCollection, exp)方法返回对象的可枚举集合。
4.通过在客户端对象模型的 .NET 托管版本中调用同步 ExecuteQuery() 方法执行查询,或者在 Silverlight 版本中,当代码从不修改用户界面 (UI) 的线程执行时,执行查询。在对象模型的 JavaScript 版本中,或者当 Silverlight 版本修改 UI 时,数据检索过程将使用异步回调模型,并且您必须调用 ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) 方法 (JavaScript: executeQueryAsync(succeededCallback, failedCallback)),该方法包括用于处理成功或失败请求的方法参数。当执行查询的方法调用返回(同步或异步)时,您可以访问从中启动查询的对象上的查询结果。
有了上面的了解,回过头来看本题就比较清楚了,分析本题的题干:
01 ClientContext context = new ClientContext("http://intranet"); //完成的是上面的第1步即:返回客户端请求的上下文 02 03 Web site = context.Web; //完成上面的第2步: 使用对象模型指定要检索的对象 04 context.Load(site); //完成上面的第3步:Load 05 //缺少第4步:通过在客户端对象模型的 .NET 托管版本中调用同步 ExecuteQuery() 方法执行查询,所以选项C应该是属于此行代码 06 textBoxTitle.Text = site.Title;
所以本题目正确选项应该是C
再来看其它选项:
选项A. Add the following line of code at line 02:
context.ExecuteQuery(); // ExecuteQuery方法执行早了,应该在Load之后执行
选项B.D 都是操作 ValidateOnClient属性,此属性继承自ClientRuntimeContext类,用以获取或设置客户端库是否需要验证方法的参数。显然与本题无关。
参考:
http://msdn.microsoft.com/zh-cn/library/microsoft.sharepoint.client.clientruntimecontext.validateonclient.aspx
http://msdn.microsoft.com/en-us/library/ee536158.aspx
Question 87
You have a SharePoint site collection that has the URL http://contoso/sites/finance.
You are creating a Microsoft .NET Framework console application that will use the SharePoint client object model to create a site in the site collection.
The application contains the following code segment. (Line numbers are included for reference only.)
01 ClientContext cCtx = new ClientContext("http://contoso/sites/finance");
02 Web root = cCtx.Site.RootWeb;
03 cCtx.Load(root);
04 WebCreationInformation webInfo = new WebCreationInformation();
05 webInfo.Title = "site1";
06 webInfo.Url = "site1";
07 webInfo.WebTemplate = "MPS#2";
08 root.Webs.Add(webInfo);
09
10 cCtx.Dispose();
You need to ensure that the application creates the site.
Which code segment should you add at line 09?
A. cCtx.ExecuteQuery();
B. cCtx.Site.RootWeb.Update();
C. root.Context.Dispose();
D. root.Update();
解析:
本题仍旧是关于Sharepoint客户端编程问题,参见Question86的讲解,可以看出题干的代码想访问Sharepoint的http://contoso/sites/finance网站集,并向其中添加一个新的Web。从01到08代码完成的是获取ClientContext对象,Web对象,然后设置新Web的相关参数并添加到Site Collection对象中。前面所有的准备工作都完成后,就差最后的执行按钮” ExecuteQuery”了。所以选项A应该添加到第09行。
选项B. cCtx.Site.RootWeb.Update(); 是试图完成保存对RootWeb的更新。
选项C. root.Context.Dispose();试图销毁root.Context。
选项D. root.Update();也是试图完成保存对RootWeb的更新。
所以本题目正确选项应该是A
参考:
http://msdn.microsoft.com/en-us/library/ee535521.aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.update.aspx