Sharepoint学习笔记—习题系列--70-573习题解析 -(Q88-Q90)
Question 88
You have a Microsoft .NET Framework console application that uses the SharePoint client object model.
The application contains the following code segment. (Line numbers are included for reference only.)
01 ClientContext cCtx = new ClientContext("http://intranet/hr");
02 List sharedDocList = cCtx.Web.Lists.GetByTitle("Shared Documents");
03 CamlQuery camlQuery = new CamlQuery();
04 camlQuery.ViewXml =
05 @"<View>
06 <Query>
07 <Where>
08 <Eq>
09
10 <Value Type='Text'>Doc1.docx</Value>
11 </Eq>
12 </Where>
13 </Query>
14 </View>";
15 ListItemCollection docLibItems = sharedDocList.GetItems(camlQuery);
16 cCtx.Load(sharedDocList);
17 cCtx.Load(docLibItems);
18 cCtx.ExecuteQuery();
You need to ensure that the application queries Shared Documents for a document named Doc1.docx.
Which code element should you add at line 09?
A. <FieldRef Name='FileDirRef'/>
B. <FieldRef Name='FileLeafRef'/>
C. <FieldRef Name='FileRef'/>
D. <FieldRef Name='File_x0020_Type'/>
解析:
这道题是想考关于列表视图的相关知识点。它试图通过在客户端使用CAML定义一个List的View,然后传递给服务器端,获取满足条件的结果。
在本题的视图中使用了<FieldRef>元素,此元素的作用是:提供了此字段所引用的内部名(Internal Name)。
Sharepoint有许多内建字段,可参考资料:
http://www.cnblogs.com/wsdj-ITtech/archive/2013/05/22/3092045.html
在此资料中的第一列就是内建字段的Internal Name(内部名)。
我们知道,当我们需要扩展一个SharePoint列表/文档库的数据结构时,就会为列表/文档库创建新的字段(栏)。不管是直接为列表/文档库新建字段,还是在网站集里面创建网站栏,作为管理员,最好使用一些“最佳实践”来为字段命名。使用正确的字段名,在未来的配置、管理、开发过程中,都可以节省很多的时间和精力。
每个SharePoint字段实际上有两个名称,一个是“标题”(Title,有时候也把它叫做“显示名称”),一个是“内部名称”(Internal Name)。平时用户在列表视图界面上看到的,都是字段的标题。
字段的内部名称可以看作是字段的唯一标识。如果你曾经使用SharePoint对象模型,通过代码从列表中获取数据,那么对“内部名称”这个概念一定很熟悉。基本上,SharePoint对“内部名称”的格式有非常严格的要求,它只能由英文字母、数字和下划线字组成,且不能包含空格。但是“标题”则没有这么多限制,通常我们会使用中文作为字段的“标题”,而且“标题”中很可能会包含空格。当一个字段被创建之后,它的“内部名称”就被固定下来了,但是“标题”则可以在之后被随时修改。
当我们使用SPQuery构建CAML查询的时候, 一定要用field的internal name, 否则就会报出如下的错误:
“Exception caught Microsoft.SharePoint.SPException: One or more field types are not installed properly. Go to the list settings page to delete these fields. --->System.Runtime.InteropServices.COMException (0x81020014): One or more field types are not installed properly. Go to the list settings page to delete these fields.”
本题是想针对一个File,通过而下面的各选项:
选项A. <FieldRef Name='FileDirRef'/> 针对的是文件目录
选项B. <FieldRef Name='FileLeafRef'/>针对的是文件
选项C. <FieldRef Name='FileRef'/>针对的是特定的Windows SharePoint Services object
选项D. <FieldRef Name='File_x0020_Type'/>针对的是特定的Windows SharePoint Services object的版本相关的文件所属的文件类型信息。
所以本题目正确选项应该是B
参考:
http://msdn.microsoft.com/zh-cn/library/microsoft.sharepoint.spbuiltinfieldid_members.aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbuiltinfieldid.fileleafref.aspx
Question 89
You have a document library named MyDocs. MyDocs has a column named Column1. Column1 is a required column.
You discover that many documents are checked out because users fail to enter a value for Column1.
You need to create a Web Part to delete the documents.
Which code segment should you include in the Web Part?
A. foreach (SPCheckedOutFile file in ((SPDocumentLibrary)SPContext.Current.Web.Lists["MyDocs"]).CheckedOutFiles)
{
file.Delete();
}
B. foreach (SPItem file in SPContext.Current.Web.Lists["MyDocs"].Items)
{
if ((file("CheckOutStatus") == "CheckOut"))
{
file.Delete();
}
}
C. foreach (SPListItem file in ((SPDocumentLibrary)SPContext.Current.Web.Lists["MyDocs"]).Items)
{
if ((file("CheckOutStatus") == "CheckOut"))
{
file.Delete();
}
}
D. foreach (SPCheckedOutFile file in ((SPDocumentLibrary)SPContext.Current.Web.Lists["MyDocs"]).CheckedOutFiles)
{
file.TakeOverCheckOut();
}
解析:
本题题意是:你有一个文档库(MyDocs),此文档库有一列名为Column1,此列要求必须有值。但是你发现在此文档库中有许多文档都被“签出”了,并且这些文档的Column1字段都未被赋值,于是,你得通过代码来删除此类文档。
所以你的代码逻辑应该包括两步:1: 遍历正确的文档库。 2. 正确判断有待删除的文档。
我们来分别分析各选项:
选项A. foreach (SPCheckedOutFile file in ((SPDocumentLibrary)SPContext.Current.Web.Lists["MyDocs"]).CheckedOutFiles) //找到名为”MyDocs”的List,强制转换成SPDocumentLibrary对象,然后使用SPDocumentLibrary对象CheckedOutFiles属性获取此List中被CheckedOut的文档集,然后再遍历此文档集中的文档
{
file.Delete(); //使用SPCheckedOutFile类的Delete方法来删除对应文档
}
所以选项A是本题的答案
选项B. foreach (SPItem file in SPContext.Current.Web.Lists["MyDocs"].Items) //找到名为”MyDocs”的List,获取其所有的Items,但问题是SPItem是抽象类,所以不能这样用
{
if ((file("CheckOutStatus") == "CheckOut")) {
file.Delete();
}
}
选项C. foreach (SPListItem file in ((SPDocumentLibrary)SPContext.Current.Web.Lists["MyDocs"]).Items) //与选项B类似,找到名为”MyDocs”的List,获取其所有的SPItems
{
if ((file("CheckOutStatus") == "CheckOut")) //这句是想检查每一个SPItem中字段名为” CheckOutStatus”的这列其值是否为”CheckOut”。但file("CheckOutStatus")这种表达是错误的,通过列名引用某列应该用file["CheckOutStatus"]。但即使表达正确,也不是本题想要的逻辑。
{
file.Delete();
}
}
选项D. foreach (SPCheckedOutFile file in ((SPDocumentLibrary)SPContext.Current.Web.Lists["MyDocs"]).CheckedOutFiles) //此句与选项A一样,没有错误
{
file.TakeOverCheckOut(); // SPCheckedOutFile类的TakeOverCheckOut方法用来指示网站,现在由另一个用户来接管当前“签出”的文档。显然此方法并不是用来删除文档的。
}
所以本题目正确选项应该是A
参考:
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spcheckedoutfile_members.aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spcheckedoutfile.aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spcheckedoutfile.takeovercheckout.aspx
Question 90
You have a document library named Documents. Minor and major version management is enabled for the document library.
You plan to add a document named MyFile.docx to Documents.
You create a console application that contains the following code segment. (Line numbers are included for reference only.)
01 using (SPSite site = new SPSite("http://intranet"))
02 {
03 SPList documents = site.RootWeb.Lists["Documents"];
04 FileStream fstream = File.OpenRead(@"MyFile.docx");
05 byte[] content = new byte[fstream.Length];
06 fstream.Read(content, 0, (int)fstream.Length);
07 fstream.Close();
08 site.RootWeb.Files.Add(documents.RootFolder.Url + "/MyFile.docx", content, true);
09 SPFile file = site.RootWeb.GetFile(documents.RootFolder.Url + "/MyFile.docx");
10 file.CheckIn(string.Empty);
11
12 }
You need to ensure that all users can see the document.
Which code segment should you add at line 11?
A. file.CanOpenFile(true);
B. file.Publish(string.Empty);
C. file.ReleaseLock(string.Empty);
D. file.Update();
解析:
本题的题意是:你有一个赋予了版本控制能力的文档库,现在你想通过一段代码实现向此文档库中新增一个文件,并且保证所有用户都能看到此文件。
本题题干部分完成的就是添加一个文件到此文档库的工作并CheckIn了此文档,关键是最后一步,如何实现:用户能看到此文件。
所有需要大致了解一下Sharepoint的文档库:
Sharepoint的文档库是与其他网站用户共享的 Windows SharePoint Services 3.0 上的文件集合。大多数 Windows SharePoint Services 3.0 文档管理功能都是通过文档库来传送的。作为文档管理规划的一部分,应确定最能满足组织需求的文档库。Sharepiont文档库主要分成两类:
1.文档库 使用文档库可实现文档存储、文档协作和内容轻松共享。
2.图片库 使用图片库可共享、管理和重用数字图片。
有文档就有修改维护,有修改维护就有版本控制。Sharepoint的文档库提供三个版本控制选项:
1. 无:指定不保存早期版本的文档。在未使用版本控制时,早期版本的文档是不可检索的,并且还会丢失文档历史记录,原因是不会保存随文档的每个迭代附带的注释。在包含不重要的内容或绝不会变化的内容的文档库上使用此选项。
2.仅主要版本 指定使用简单的版本控制方案(1、2、3 等)来保留编号的文档版本。
3.主要和次要版本 指定通过使用主要和次要版本控制方案(1.0、1.1、1.2、2.0、2.1 等)来保留编号的文档版本。以 .0 结束的版本是主要版本,而以非零扩展名结束的版本是次要版本。
有了版本控制,接下来就是文档库的文档审批:
Sharepoint文档的内容审批是具有审批者权限的网站成员在控制内容发布时所使用的方法。等待内容审批的文档草稿处于等待审批状态。在审批者审阅文档并批准内容之后,该文档就可供具有读取权限的网站用户查看。【这就是本题的答案:只有经过审批后发布的文档才能由最终的用户查看】
下面分析各选项:
选项A. file.CanOpenFile(true); 此方法用于设置是否允许当前用户查看此文档的内容。注意:是文档里面的内容,也即用户首先要能在界面上看到此文档[这也是本题要达到的目标],然后才是使用此权限去打开文档查看里面的内容。
选项B. file.Publish(string.Empty);以附带的审批批注信息提交并发布此文档 。这正是本题需要的答案:完成审批发布步骤,以供最终用户在文档库界面上查看到本文档。
选项C. file.ReleaseLock(string.Empty);对特定的文档进行解锁。一般当要对特定的文档进行修改编辑时就需要你锁定这个文档,而当完成修改编辑后就需要解锁以供其它用户进一步对文档进行相关操作。
选项D. file.Update();保存对此文档进行的修改。
所以本题目正确选项应该是B
参考:
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfile.publish.aspx
http://technet.microsoft.com/zh-cn/library/cc288641(v=office.12).aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfile.releaselock.aspx