Question 63
You have a SharePoint farm that has more than 100 custom Features.
You upgrade several Features in the farm.
You need to ensure that the site collection uses the most up-to-date versions of the Features. Only Features that require an upgrade must be evaluated.
Which code segment should you use?
A. SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);
foreach (SPWebService myWebService1 in webServices)
{
SPFeatureQueryResultCollection queryResults = myWebService1.QueryFeatures(SPFeatureScope.Site, true);
IEnumerator<SPFeature> featureEnumerator = queryResults.GetEnumerator();
while (featureEnumerator.MoveNext())
{
SPFeature feature = featureEnumerator.Current;
feature.Upgrade(false);
}
}
B. SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);
foreach (SPWebService myWebService1 in webServices)
{
SPFeatureQueryResultCollection queryResults = myWebService1.QueryFeatures(SPFeatureScope.Web, true);
IEnumerator<SPFeature> featureEnumerator = queryResults.GetEnumerator();
while (featureEnumerator.MoveNext())
{
SPFeature feature = featureEnumerator.Current;
feature.Upgrade(false);
}
}
C. SPSite site = SPContext.Current.Site;
SPFeatureCollection allFeatures = site.Features;
foreach (SPFeature currentFeature in allFeatures)
{
currentFeature.Upgrade(true);
}
D. SPWeb web = SPContext.Current.Web;
SPFeatureCollection allFeatures = web.Features;
foreach (SPFeature currentFeature in allFeatures)
{
currentFeature.Upgrade(true);
}
解析:
本题的要意是:一个Farm中有许多Features,需要保证指定Site Collection所使用的指定需要升级的Features是最新版的(即:即使有某些Feature是最新版,但却不一定需要升级)。
所以,注意点有二: 一是如何保证在Site Collection范围内对Feature进行控制。二是如何确保:仅对那些需要升级的Feature进行评估并升级?
所以有必须要大致了解一下Feature升级:
在 Microsoft SharePoint Foundation 中,每个功能都具有一个在与其对应的 Feature.xml 文件中指定的版本号。在某个特定范围内激活一个功能时,会创建一个与该功能的版本关联的功能实例。利用 SharePoint Foundation 中的功能版本控制,可轻松跟踪功能及其关联实例。之后,当您部署新版本的功能时,SharePoint Foundation 检测到关联的功能也需要进行升级,因为功能实例的版本号小于当前的 Feature.xml 文件中指定的新版本号。
所以版本号是用来告知Sharepoint此Feature是否需要升级标志的。但Sharepoint是通过什么机制来检测到关联的功能的功能号,并控件其升级操作的呢?
“在运行功能升级时,Sharepoint会根据新 Feature.xml 文件中指定的升级操作对需要升级的功能实例进行升级。SharePoint Foundation 使用新的 QueryFeatures 方法,基于功能实例的版本号来确定需要升级的功能实例。新 Feature.xml 文件中有一个部分,可用于指定将特定的功能实例从早期版本升级到最新版本所需的升级操作。升级基础结构会查询需要升级的功能实例集,然后升级其中的每个功能实例。”
也就是说通过QueryFeatures 方法解决本题所要求的:” 仅对那些需要升级的Feature进行评估并升级”的目的。
所以进一步了解QueryFeatures方法:
新的 QueryFeatures 方法允许您通过使用一组筛选条件来查询不同作用域中的功能。SPWebService、SPWebApplication、SPContentDatabase 和 SPSite 类均提供一个 QueryFeatures 方法,其重载允许您指定不同的条件来确定返回哪个功能实例结果集。
1.SPWebService -- 在服务器场中查找符合筛选条件的已激活的功能实例。
2.SPWebApplication -- 查找符合指定筛选条件的 Web 应用程序、网站集和网站范围的功能。将针对 Web 应用程序对象中的所有内容数据库运行查询,并按照内容数据库对返回的集合进行排序。
3.SPContentDatabase -- 在内容数据库中查找范围限定为网站集和网站并符合指定的筛选条件的功能。返回的集合相对于网站层次结构排序。例如,父网站的功能在子网站功能之前表示,层次结构为从上至下。
4.SPSite -- 查找所有符合特定筛选条件的网站集和网站范围的功能。返回的集合按照网站层次结构排序。父网站的功能显示在子网站功能的前面,并且按照从上至下的方式安排层次结构。新的客户端对象模型中提供了此类的
Sharepoint采用SPFeatureQueryResultCollection 类用于枚举通过 QueryFeatures 操作返回的功能。
通过这段描述,我们就清楚了,采用了哪个范围级别的QueryFeatures方法就可以影响那个范围级别的Features的升级。那么如何知道我们采用了哪个范围级别的QueryFeatures方法呢?根据上文” SPWebService、SPWebApplication、SPContentDatabase 和 SPSite 类均提供一个 QueryFeatures 方法, Sharepoint采用SPFeatureQueryResultCollection 类用于枚举通过 QueryFeatures 操作返回的功能。”。所以焦点就聚集到怎么去获取相应范围级别的SPFeatureQueryResultCollection 类上了。 获取到了那个范围级别的SPFeatureQueryResultCollection 类,就找到了那个范围级别的” 仅对那些需要升级的Feature进行评估并升级”的”负责人”。
在Feature升级中,还有一个重要的方法:Upgrade 方法。SPFeature 类现在提供一个 Upgrade(Boolean) 方法来为所有作用域中的某个功能实例执行升级:Farm、WebApplication、Site 和 Web。在对一个从属功能实例调用 QueryFeatures 方法时,该方法首先升级相关层次结构中*别的功能实例,然后升级依赖该功能的所有功能实例。这种按层次结构升级的过程可确保所有从属功能实例与其所依赖的功能实例保持同步。
所以,借助Update()与QueryFeatures配合,我们才能真正的完成对Feature的升级任务。
下面我们先来看选项A.B的区别:
//先是获取本地Farm中的Web Services.存放到SPWebServiceCollection对象中
SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);
//然后是遍历SPWebServiceCollection对象里的每一个WebService
foreach (SPWebService myWebService1 in webServices)
{
//此处就是获取指定范围级别的Features,并存放到SPFeatureQueryResultCollection对象中。选项A获取的是Site级别(即Site Collection),选项B获取的是Web级别。SPFeatureQueryResultCollection是enumerable collection 特性的对象。Enumerable特性的对象一般提供了一组用于查询实现 IEnumerable<T> 的对象的 static方法。此处获取不同范围级别的” 仅对那些需要升级的Feature进行评估并升级”的”负责人”。
SPFeatureQueryResultCollection queryResults = myWebService1.QueryFeatures(【选项A :SPFeatureScope.Site】【选项 B: SPFeatureScope.Web】, true); //依次处理此范围级别内所有的Feature,并使用SPFeature.Upgrade()方法完成升级操作。
IEnumerator<SPFeature> featureEnumerator = queryResults.GetEnumerator();
while (featureEnumerator.MoveNext())
{
SPFeature feature = featureEnumerator.Current;
feature.Upgrade(false);
}
}
从上面的分析,可以判断选项A符合本题的解答。
至于选项C.D : 首先,它们的操作都只针对”当前”的Site或Web。其次,Feature的升级必须要使用QueryFeatures与Upgrade结合才能完成。所以,选项C.D是做不到Feature升级的工作的。
所以本题目正确选项应该是A
参考:
http://msdn.microsoft.com/en-us/library/ee545763.aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfeaturequeryresultcollection.aspx
http://msdn.microsoft.com/zh-cn/library/microsoft.sharepoint.spfeature.upgrade.aspx
Question 64
You are creating an application.
You develop a custom control that renders a contextual tab. The control contains the following code segment. (Line numbers are included for reference only.)
01 protected override void OnPreRender(EventArgs e)
02 {
03 SPRibbon curRibbon = SPRibbon.GetCurrent(this.Page);
04
05 curRibbon.MakeContextualGroupInitiallyVisible("SP.Ribbon.ContextualGroup", string.Empty);
06 base.OnPreRender(e);
07 }
You need to ensure that when the custom control is rendered, the custom contextual tab appears in the Ribbon.
Which code segment should you add at line 04?
A. curRibbon.Enabled = true;
B. curRibbon.MakeRTEContextualTabsAvailable("SP.Ribbon.ContextualTab");
C. curRibbon.MakeTabAvailable("SP.Ribbon.ContextualTab");
D. curRibbon.Visible = true;
解析:
这是一道关于Sharepoint Ribbon的题。
在Ribbon的架构中,所谓Contextual Tab就是一个隐藏的Tab控件,只有当你的焦点选择到特定的内容(eg:某个List或某张图片……),那么这个与此选择到的内容相关联的Contextual Tab才会显示出来。
下面分别来看各选项
选项A. curRibbon.Enabled = true; 是否可以使用Ribbon。如果为False,则此Ribbon还是会显现,只是呈现灰色(即不可用底色)。如果为Ture,则呈现相应的彩色以示可以使用了。
选项B. curRibbon.MakeRTEContextualTabsAvailable("SP.Ribbon.ContextualTab");
本选项是把与页面上的 Rich Text Editor (RTE)控件相关联的Ribbon Tabs设置为可用状态。 所以它是个与Rich Text Editor (RTE)控件相关联的操作。某些Ribbon Tabs可以是Contextual Tabs,并且在默认情况下是不可见的,但是它们仍是Avialable的,这样,程序在需要用到它们时就会把它们显示出来。
选项C. curRibbon.MakeTabAvailable("SP.Ribbon.ContextualTab"); 把参数指定的Tab添加到可供使用的Tabs列中。常与 MakeContextualGroupInitiallyVisible一起实现加载及激活ContextualTab页。下面就是一段示例代码:
private void LoadAndActivateRibbonContextualTab() {
SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);
// Ensure ribbon exists.
if (ribbon != null) {
// Load dependencies if not already on the page.
ScriptLink.RegisterScriptAfterUI(this.Page, "SP.Ribbon.js", false, true); // Load and activate contextual tab.
ribbon.MakeTabAvailable("Ribbon.PropertyChangerTab");
ribbon.MakeContextualGroupInitiallyVisible("Ribbon.WebPartContextualTabGroup", string.Empty);
}
}
选项D. curRibbon.Visible = true;确定整个Ribbon是可见还是不可见。控制的是整个Ribbon控件。
所以本题目正确选项应该是C
参考:
http://msdn.microsoft.com/en-us/library/ff409505.aspx
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spribbon_properties.aspx
Question 65
You need to create a Web Part that hides the out-of-the-box Ribbon on the current page.
Which code segment should you include in the Web Part?
A. SPRibbon.GetCurrent(this.Page).CommandUIVisible = false;
B. SPRibbon.GetCurrent(this.Page).Dispose();
C. this.Page.FindControl("SPRibbon").Dispose();
D. this.Page.FindControl("SPRibbon").Visible = false;
解析:
本题想要实现的是通过一个WebPart来隐藏当前页面上的”开箱即用”的Ribbon控件。
分析各选项:
选项A. SPRibbon.GetCurrent(this.Page).CommandUIVisible = false;
此属性就是用来决定Server Ribbon控件是否显示。
但需要注意的是:Ribbon区不光包括你所理解的Tabs,Groups以及其内的Controls,它还包括上图显示给你的左上角的Site Actions等,使用此功能并设置其值为False后,Site Actions还是可以看得到的。
选项B. SPRibbon.GetCurrent(this.Page).Dispose(); 处理回收当前页面上的SPRibbon控件。此方法不是隐藏,而是彻底的销毁指定的SPRibbon控件。
选项C. this.Page.FindControl("SPRibbon").Dispose(); 找到一个名为”SPRibbon”的控件并作销毁处理。
选项D. this.Page.FindControl("SPRibbon").Visible = false; 找到一个名为” SPRibbon”的控件并设置它为不可见。
方法C.D的共同点都是在当前页面找到一个名为”SPRibbon”的控件,我们知道名字是”SPRibbon”并不意味着它就是SPRibbon控件。Sharepoint在运行时的控件命名有它自己的一套机制,这方面与传统的ASP.NET网站是不一样的。况且想要实现本题的目的就应该采用选项A的方法。
所以本题目正确选项应该是A
参考:
http://msdn.microsoft.com/en-us/library/microsoft.web.commandui.ribbon.commanduivisible.aspx
http://msdn.microsoft.com/en-us/library/ff412439.aspx