65.9K
CodeProject 正在变化。 阅读更多。
Home

端到端 SharePoint 功能部署项目开发

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (5投票s)

2010年10月14日

CPOL

8分钟阅读

viewsIcon

40476

downloadIcon

418

本文介绍了一种在 Visual Studio 中构建 SharePoint Feature 项目的方法,该项目可以使用 WSPBuilder 进行构建和部署,还包括 SharePoint Server 安装脚本,以及关于如何在 SharePoint 中构建基本功能的明确说明。

引言

本文将介绍如何设置一个基本的 SharePoint WSP 解决方案项目,构建它并将其部署到 SharePoint。它包括示例代码和有关构建 SharePoint 2007 功能项目、所需目录结构、代码以及对项目各部分的简要说明。

背景

安装 SharePoint 功能可能会遇到一些挑战,但通过几个恰当的步骤,您就可以顺利启动并运行。本文将引导您完成在 Visual Studio 2008 中正确创建 SharePoint 2007 功能项目的基本步骤,该项目可以构建成一个 WSPBuilder 部署解决方案文件,并包含一些便捷的脚本,用于部署到您选择的 SharePoint 网站。

免责声明 - 希望这有所帮助,如果无效,请不要烦我,物有所值,您是免费获得的。您需要使用 Visual Studio 2008 打开此项目,或修改项目和解决方案文件以兼容早期版本。如果对您有帮助,请给我投 5 星!

入门

您需要使用 Visual Studio 2008 打开项目,并安装 WSPBuilder 插件才能使用本文提供的示例代码并遵循文章说明。创建 Visual Studio 中用于功能或其他网站代码的项目的下一步是正确设置您的 Visual Studio 项目。下面是 Visual Studio 中包含一些自定义页面的功能项目的典型项目层次结构。

Solutionview.JPG

请注意,功能部署中的主要内容文件位于 TEMPLATE 目录下。这使得 WSPBuilder 能够构建一个 .wsp 解决方案文件,该文件在部署后能理解将所有文件放在何处。要正确构建您的功能,您需要准备好几个目录。

此项目的主要目录是:

  • FEATURES/SampleFeature - 这是项目区域,代码和元数据文件(如 feature.xmlelements.xml)用于功能设置和激活。站点定义(ONET.XML)或网站模板的修改也可以放在这里(此示例中不适用)。
  • IMAGES - 任何功能级别的图像都可以添加到此处。
  • LAYOUTS/1033/IMAGES - 全局布局图像。
  • LAYOUTS/1033/STYLES/SampleFeature - 包含功能级别的样式。
  • LAYOUTS/SampleFeaturePages - 这是一个可选文件夹,用于提取功能控件和页面与标准 SharePoint 控件和页面进行区分,这是任何专用页面所在的位置。

在本例中,我们将创建“FEATURES/SampleFeature”来存储功能的 feature.xmlelements.xml。本例中的功能将向文档列表中的编辑控件块菜单(右键单击弹出菜单)添加一个菜单项,并为将部署该功能的 SharePoint 网站集中的所有文档库中的所有文档包含此新菜单项。

我们将检查的项目的第一个部分是 feature.xml。此文件包含的代码将告知 SharePoint 使用什么代码来实现该功能,“范围”是什么,或者代码在 SharePoint 层次结构中的哪个位置可用,并分配一个 GUID 作为安装使用的 ID。在下面的 XML 示例中,我们看到几个属性。

<Feature 
Id="8682CCBC-C49B-4957-ADAA-708E40C06121" 
Title="SampleFeature" 
Description="This is your feature description, 
notice the scope is 'Site' since this example deploys on the site collection" 
Scope="Site" 
Hidden="false" 
ImageUrl="SampleFeature\icon_contactlist.gif" 
ReceiverAssembly="SampleFeatureProject, Version=1.0.0.0, 
	Culture=neutral, PublicKeyToken=e30e9c1baed5c190" 
ReceiverClass="SampleFeatureProject.FeatureReceiver" 
xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <ElementManifests> 
        <ElementManifest Location="elements.xml"/> 
    </ElementManifests> 
</Feature>

每个属性都有其用途,如下所示:

  • Id - 这是功能 ID,稍后将在我们的 WSP 解决方案部署脚本中使用。
  • Title - 这是一个通用的 SharePoint 属性,对本示例无关紧要。
  • Description - 同上,对本示例而言仅供参考。
  • Scope - 这设置了该功能在网站或网站集中的可用位置。由于我们稍后将其部署到网站集,因此我们将 Scope 设置为“Site”,以便网站集的所有子网站都可以获得此功能的功能。
  • Hidden - 此示例中不适用。
  • ImageUrl - 此示例中不适用。
  • ReceiverAssembly - 这个很重要,这是 FeatureReciever 类的程序集命名空间。
  • ReceiverClass - 功能接收器类的名称,也很重要。
  • elements.xml - 在这里我们可以为功能定义我们的自定义操作。

elements.xml 包含功能的特定功能操作。

“Module”节点具有“List”、“Url”和“Path”等属性,这些属性决定了此功能将激活于哪种 SharePoint 列表。由于 SharePoint 是一个对象(或列表)的层次集合,因此这些属性决定了将功能应用于哪种类型和区域。下面的示例将功能应用于类型为 113 的列表,这指的是 Web 部件库。“File”XML 节点提供了帮助解决方案部署的代码。

在下面的代码中,我们看到“Module”和“CustomAction”XML 节点。

    <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <Module 
        Name="SampleFeature" 
        List="113" 
        Url="_catalogs/wp" 
        Path="WebParts" 
        RootWebOnly="False"> 
        <File 
            Url="wpSiteList.webpart" 
            Type="GhostableInLibrary" > 
            <Property 
                Name="Group" 
                Value="Sample Feature Project Web Parts" /> 
        </File> 
    </Module> 
    <CustomAction 
        Id="SampleFeatureProject.SampleItemMenu" 
        RegistrationType="ContentType" 
        RegistrationId="0x0101" 
        ImageUrl="/_layouts/images/GORTL.GIF" 
        Location="EditControlBlock" 
        Sequence="120" 
        Title="Send to Hello World" > 
        <UrlAction 
            Url="javascript:window.location='{SiteUrl}/_layouts/SampleFeaturePages/
	   HelloWorld.aspx?ItemId={ItemId}&ListId={ListId}&
				Source=' + window.location" /> 
        </CustomAction> 
    </Elements> 

CustomAction”节点上的属性具有以下用法:

  • RegistrationType”指示要将功能的动作应用于哪种 SharePoint 列表项,在本例中是实际内容。
  • Location”指示我们要将该操作绑定到哪个 SharePoint 对象,在本例中是列表项的编辑控件块菜单。
  • UrlAction”节点有一个 URL,它将打开一个页面并将基本数据馈送到该页面,以便在 SharePoint 网站中找到该项。

CustomAction”XML 节点将该功能应用于某个 SharePoint 操作。在这种情况下,它在“EditControlBlock”中定义了一个菜单项,这是一个 SharePoint 对象类型的标识符,表示文档的编辑菜单。它定义了一个“UrlAction”节点,该节点为该元素提供了转到指定 URL 的操作。该 URL 指向我们项目(LAYOUTS/SampleFeaturePages/HellowWorld.aspx)中定义的页面。

部署后它将看起来像这样:

sharepoint-list-menu-feature.JPG

解决方案的其他一些部分也很有趣。

LAYOUTS/SampleFeaturePages/HellowWorld.aspx”是从功能的 CustomAction/UrlAction 调用并显示有关传递给该页面的列表项的基本信息的页面(在本例中,是文档在 SharePoint 网站中的 ItemIdListId)。

FeatureReciever 代码包含事件,这些事件以编程方式在网站顶部全局导航栏上设置一个顶部链接栏项,并在激活功能时应用级联样式表。请注意,FeatureDeactivated 事件会完全卸载 FeatureActivating 事件安装的所有功能组件。这种清理是建议的,因为激活后遗留的功能组件可能会导致问题。

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb site = SPContext.Current.Web;
    SPNavigationNodeCollection topNavigationNodes = site.Navigation.TopNavigationBar;
    //This gives us the collection of all top navigation node of the site.
    //Now we want to add one more navigation bar to it. 
    SPNavigationNode objItem = null;
    objItem = new SPNavigationNode("MSN", "http://WWW.MSN.com", true);
    topNavigationNodes.AddAsLast(objItem);
    site.Update();

    // add our custom theme
    site.ApplyTheme("");
    site.AlternateCssUrl = "/_layouts/1033/STYLES/SampleFeature/Main.css";
    site.Update();
}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
    SPWeb site = SPContext.Current.Web;
    site.AlternateCssUrl = "";
    site.Update();
    SPNavigationNodeCollection topNavigationNodes = site.Navigation.TopNavigationBar;
    List<SPNavigationNode> nodesToDelete = new List<SPNavigationNode>(); 
    //first get al the nodes to delete
    foreach (SPNavigationNode node in topNavigationNodes)
    {
        if (node.Title == "MSN")
        {
            nodesToDelete.Add(node);
        }
    }
    //then delete them since the collection does not have index finders by text
    foreach (SPNavigationNode node in nodesToDelete)
    {
        topNavigationNodes.Delete(node); 
    } 
    site.Update();
    //SPWeb site2 = (SPWeb)properties.Feature.Parent;
    // delete folder of site pages provisioned during activation
    SPFolder sitePagesFolder = site.GetFolder("SitePages");
    sitePagesFolder.Delete();
}

最后一个感兴趣的组件是 Web 部件功能代码。在此示例中,wpSiteList.webpart 文件中的代码是一个简单的 Web 部件,用于提供网站列表。功能项目解决方案构建需要一些功能代码进行部署,我将其放入“FEATURES/SampleFeature/WebParts”目录中,使用一个基本的 Web 部件和一些示例代码来完成此操作。

sharepoint-web-part.JPG

Web 部件中的主方法是 CreateChildControls() 方法。在此方法中,初始化了 Web 部件的视觉组件和数据源。请注意,此方法的内部代码设置方式类似于 .aspxpage_load 事件与设计器类初始化事件相结合,以便创建控件并将其添加到 Web 部件,然后查询数据源(如果页面不是原始页面发布的帖子)。

protected override void CreateChildControls()
{
    base.CreateChildControls();
    //Create text box
    listsView = new SPGridView();
    listsView.AutoGenerateColumns = false;
    this.Controls.Add(listsView);
    BoundField colTitle = new BoundField();
    colTitle.DataField = "Title";
    colTitle.HeaderText = "Title";
    listsView.Columns.Add(colTitle);
    if (!this.Page.IsPostBack)
    {
        GetSiteList();
        listsView.DataKeyNames = new string[] { "Title" };
        listsView.DataSource = dt;
        listsView.DataBind();
    }
}

private void GetSiteList()
{
    dt = new DataTable();
    dt.Columns.Add("Title");
    SPWeb mySite = SPContext.Current.Web;
    SPWebCollection sites = mySite.Webs;
    foreach (SPWeb subSite in sites)
    {
        DataRow dr = dt.NewRow();
        dr["Title"] = subSite.Title;
        dt.Rows.Add(dr);
     }
}

开发完成后,要构建项目,您必须安装 WSPBuilder(在此处) 的 Visual Studio 插件。要创建您的解决方案文件,您需要右键单击您的项目,选择 WSPBuilder 和菜单项“Build WSP”。这将在项目的根目录下构建一个 SharePoint 解决方案文件。

WSPBuilder-menu.JPG

WSPBuilder-output.JPG

构建完解决方案文件后,您需要运行某种安装脚本将其安装到 SharePoint。在可下载的示例中包含了一个我创建的便捷脚本。要使用它,您只需要更改变量如下:

  • WSPNAME - 这是使用 WSPBuilder 编译的解决方案文件的名称。
  • SERVERSITEURL - 这是您的 SharePoint 服务器名称、端口和网站集名称(如果适用)的组合,您希望在此处部署解决方案。
  • FEATUREGUID - 这来自您的 feature.xml 文件,是功能 ID。
@echo off
CLS
SETLOCAL
SET StartDateTime=%DATE% at %TIME%
@SET STSADM="c:\program files\common files\microsoft shared\
		web server extensions\12\bin\stsadm"
@SET WSPNAME="SampleFeatureProject.wsp"
@SET SERVERSITEURL=[your server name: your port name]/sites/[Your Site Collection Name]
@SET FEATUREGUID="8682CCBC-C49B-4957-ADAA-708E40C06121"
ECHO --------------------------------------------
ECHO ^| %WSPNAME% deployment process ^|
ECHO ^| Started on %StartDateTime% ^|
ECHO --------------------------------------------

TITLE Deploying %WSPNAME% solution...        

FEATUREGUID 变量取自 feature.xml 的 id 属性。

<Feature 
Id="8682CCBC-C49B-4957-ADAA-708E40C06121" ... >

更改脚本中的变量后,您可以运行此脚本,并在中央管理/操作/解决方案管理页面中查看是否发生错误或解决方案是否部署正确。

operations-solutiondeploy.JPG

如果您想卸载解决方案,下载中也有一个相应的脚本,设置变量的方式与 install.cmd 脚本中相同。

@echo off
CLS
SETLOCAL
SET StartDateTime=%DATE% at %TIME%
@SET STSADM="c:\program files\common files\microsoft shared\
		web server extensions\12\bin\stsadm"
@SET WSPNAME="SampleFeatureProject.wsp"
@SET SERVERSITEURL=[your server name: your port name]/sites/[Your Site Collection Name]
@SET FEATUREGUID="8682CCBC-C49B-4957-ADAA-708E40C06121"

....

现在让我们看看功能的作用。解决方案部署后,转到您部署了该网站的网站集上的“网站集功能”页面,然后停用并激活该功能。

请注意 - 要使此功能生效,您必须在安装脚本部署并激活功能后,手动停用并重新激活该功能,以触发“FeatureActivated”事件。通过脚本激活功能似乎不起作用。

sitecollectionfeatures.JPG - Click to enlarge image

接下来,转到网站上的任何文档库,然后右键单击库中的一个文档。

sharepoint-list-menu-feature.JPG

请注意“发送到 Hello World”菜单项。单击此项,HelloWorld.aspx 页面就会显示,并包含文件的路径。

Hellow-world-result.JPG

关注点

很简单,不是吗?我花了好几天才弄明白这个小例子……谁说 SharePoint 很容易,是吧?好吧,这就是我们能拿到高薪的原因,如果很容易,任何人都能做,我们就能拿到很少的报酬。希望这有所帮助,如果无效,请不要烦我,物有所值,您是免费获得的。

© . All rights reserved.