返回首页

简介
在SharePoint,你有多种方式,创建网站,每个有它自己的利弊的方法。自定义网站提供供应商被许多人认为是最好的方法来创建自定义SharePoint网站。在这篇简短的文章中,我将演示如何创建和使用一个自定义的站点配置供应商。背景
在本文中使用SharePoint Server 2010中,虽然技术还将为Microsoft Office SharePoint Server 2007的样品。多种方法来创建一个网站
有多种方式创建自定义网站定义在SharePoint网站模板,网站定义和网站供应商。网站模板
微软SharePoint是非常适当的权利和权限的最终用户配置,这是它是专为。用户可能会花费大量的时间配置与网站列表,页面和意见,可能要复制在其他的环境。这是网站模板可以是有益的。
要创建一个站点模板,去行动GT网站,网站设置和网站标题操作下,单击"另存为模板的链接网站。{S0}
显示的页面会要求一个文件名,模板的名称和描述,也是否包括内容。填补了这一信息,并点击"确定"按钮后,SharePoint将作为一个WSP文件与相应的配置文件包本网站和地方在解决方案库。从这里,它可以用来创建新的网站,该网站集内。要使用在其他网站集的模板,你必须去解决方案库,将模板保存到外部位置,您的硬盘驱动器,然后在另一个网站集上传和活跃,在解决方案库中的模板,。
所有上述过程可以实现无需开发人员和农场管理员的干预。不过,也有这种方法的缺点。
使用网站模板是不是真的一个可重用的解决方案。是的,它可以保存和上传到不同的网站集合,但它可能是依赖于在另一个站点集合中不存在的功能或安全。使用包含的内容"选项时,你也是有限的10MB,如果网站结构只可能被罚款,但是,如果它使用功能所需的项目了很多的列表,你的运气了。项目级别安全性也没有支持网站模板从模板创建一个新网站后,所有的安全性可能需要重置。
网站模板是作为一个WSP封装,使用Visual Studio 2010,可以导入到一个新的项目。但是,它带来了相当数量的碎屑。{S1}
虽然你可以选择或取消选择您想要的元素,有些是有依赖,您将需要导入的项目要完成。{S2} 网站定义
网站定义SharePoint是什么的基础上,用于当创建一个从内置模板的网站。自定义网站定义也节省了网站模板时创建的,如上文所述。既然有很多资源,涵盖SharePoint站点定义,我不会细讲,只打此讨论的一些高点。
是由网站定义的Onet.xml文件;我有一个基本的版本。有关此文件的更多信息可以发现{A}。

<?xml version="1.0" encoding="utf-8"?>

<Project Title="SiteDefinitionProject1" 

         Revision="2" 



         ListDir="" 

         xmlns:ows="Microsoft SharePoint" 

         xmlns="http://schemas.microsoft.com/sharepoint/">

  <NavBars>

  </NavBars>

  <Configurations>

    <Configuration ID="0" Name="SiteDefinitionProject1">

      <Lists/>

      <SiteFeatures>

      </SiteFeatures>

      <WebFeatures>

      </WebFeatures>

      <Modules>

        <Module Name="DefaultBlank" />

      </Modules>

    </Configuration>

  </Configurations>

  <Modules>

    <Module Name="DefaultBlank" Url="" Path="">

      <File Url="default.aspx">

      </File>

    </Module>

  </Modules>

</Project>

正如你可以看到,相当大量的信息可以包含在的Onet.xml定义如何创建网站,什么功能,它将使用。您可以定义列表模板的网站,导航元素,和文件,如网站页面使用。该文件还描述了所有的功能需要在站点和Web各级激活。
这种方法虽然多年来一直使用SharePoint和内置的网站模板在使用这种方法,它有一个显着的缺点。网站定义的任何更改将影响该定义创建的所有网站。为了说明这个问题,构建和部署解决方案已在本文提供的代码下载的CPSiteDef,并添加一个新的站点使用这个定义。后网站的情况下hasnbsp;已创建,主页应该看起来像这样:{S3}
现在,在Visual Studio项目,扩大网站的定义模块,并打开Default.aspx页面,并添加或修改,你想的任何文本。当您重新部署的解决方案,并刷新页面,你应该看到所做的更改。{S4}的
你并不需要使用模板创建另一个网站才能看到这种变化,这将是所有自动更新。显然,这可以有一些非常不可取的,意想不到的效果。网站配置供应商
新的建议提供了一种机制,以创建一个新的站点的方法是使用一个自定义的网站配置供应商。
的第一件事情,我们当然需要创建一个新的空SharePoint 2010中的Visual Studio项目。然后,添加一个代码文件,这个项目,并从SPWebProvisioningProvider派生它。这个基类有一个方法,需要实施,提供:{C}
当然,无论是使用一个网站定义或自定义的配置提供如,就必须是一个webtemp *文件,以便SharePoint可以识别,使模板可用。关于这个文件的细节的更多信息,可以发现{A2}。然而,对于这个讨论的关键点的属性ProvisioningAssembly,ProvisioningClass和ProvisionData:
<?xml version="1.0" encoding="utf-8" ?>

<Templates>

  <Template Name="CPSiteProvider" ID="25001">

    <Configuration

		ID="0"

		Title="Code Project Site Provisioning Provider"

		Hidden="false"

		ImageUrl="/_layouts/images/CPSiteProvider/CP_Logo.gif"

		Description="A demonstration or using a custom Site 

				Provisioning Provider"

		DisplayCategory="Code Project"

		ProvisionAssembly="$SharePoint.Project.AssemblyFullName$"

		ProvisionClass="CPSiteProvider.ProvisioningProvider"

		ProvisionData="TEMPLATE\FEATURES\

		CPSiteProvider_SiteData\ProvisioningData\CPSiteProvider.xml"

		SubWebOnly="TRUE">

    </Configuration>

  </Template>

</Templates>

ProvisioningAssembly,我们就使用内置的Visual Studio宏项目建成后,将扩大到适当的四个部分项。 ProvisioningClass是实现SPWebProvisioningProvider,在我们的例子是ProvisioningProvider类的完全限定名称。 ProvisionData属性是用来指定任何额外的数据,是需要由供应商。在这种情况下,我使用的路径,相对SharePoint根文件夹中的一个XML文件,将包含更多的信息,。
供应商是一片空白,不会创造任何东西,除非它是告诉。考虑到这一点,首先我们要做的是使用的SPWeb对象的ApplyWebTemplate方法创建一个空白的网站开始。正如你可以看到,网络是从传递到计提方法SPWebProvisioningProperties财产的属性之一。其他财产将包含在webtemp文件,明年我们将使用指定的ProvisionData属性值的数据。
private const string SITE_TEMPLATE = "STS#1";



public override void Provision(SPWebProvisioningProperties props)

{

    // Create a blank site to begin from

    props.Web.ApplyWebTemplate(SITE_TEMPLATE);

}

现在基本的网站已经建立,我们将添加适当配置我们的网站所需的功能。
public override void Provision(SPWebProvisioningProperties props)

{

    // Create a blank site to begin from

    props.Web.ApplyWebTemplate(SITE_TEMPLATE);



    // Save this so it is available in other methods

    Properties = props;



    SPSecurity.CodeToRunElevated code = 

		new SPSecurity.CodeToRunElevated(CreateSite);

    SPSecurity.RunWithElevatedPrivileges(code);

}



private void CreateSite()

{

    using(SPSite site = new SPSite(Properties.Web.Site.ID))

    {

        using(SPWeb web = site.OpenWeb(Properties.Web.ID))

        {

            // Add specified features to this site

            AddSiteFeatures(site);



            // Add specified features to this web

            AddWebFeatures(web);



            // Add new default page

            AddDefaultPage(web);

        }

    }

}

由于任何人都可以通过创建网站,我们需要确保提供适当的安全权限,这是SPSecurity.RunWithElevatedPrivileges是有用的。这会不会有什么,是在其上下文中运行的Web应用程序池的凭据执行代码。可读性和可维护性,用这种方法虽然可以使用匿名委托,我将使用创建一个SPSecurity.CodeToRunElevated对象,并指定一个方法来运行。一个小问题是这种方法的委托,不带任何参数。为了能够有机会获得的SPWebProvisioningProperties,我将它分配给私有财产。
在AddSiteFeatures方法,做的第一件事是访问XML文件,它包含的功能,我们希望tonbsp,使这个网站。由于路径是相对的,我们需要得到的SharePoint根文件夹。虽然它通常是%Program Files文件%\共同文件\微软共享\ Web服务器扩展\ 14优秀的开发人员,我们不能依靠这个,应该具体查询对象模型的正确路径。这是在数据文件使用SPUtility.GetGenericSetupPath方法的属性。
private void AddSiteFeatures(SPSite site)

{

    List<xelement> features = (from f in DataFile.Elements("SiteFeatures")

                        .Elements("Feature")

                            select f).ToList();



    foreach(XElement feature in features)

    {

        // Make sure the feature hasn't already been activated

        SPFeature f = site.Features[new Guid(feature.Attribute("ID").Value)];

        if(f == null)

        {

            site.Features.Add(new Guid(feature.Attribute("ID").Value));

        }

    }

}



private XElement DataFile

{

    get

    {

        XElement featuresXml = null;

        if(Properties != null)

        {

            // Construct the path from the SharePoint root folder to

            // the file specified in the webtemp

            string path = SPUtility.GetGenericSetupPath

			(Path.GetDirectoryName(Properties.Data));

            path = Path.Combine(path, Path.GetFileName(Properties.Data));



            // Load the xml file

            featuresXml = XElement.Load(path);

        }



        return featuresXml;

    }

}

</xelement>

后得到的XML文件,它仅仅是一个指定功能的问题,无论是网站或网页。我已经使用了相同的功能,为网站定义项目,它可比,但您可以添加所需的任何其他功能。任何列表或其他项目也可以添加到网站在这一点上。
这种方法的优点是该网站是不是直到运行时创建的独立网站定义的方法不同的文件系统中的文件。要得到一个苹果,苹果比较,我们需要包括default.aspx页面。
private void AddDefaultPage(SPWeb web)

{

    string file = (from f in DataFile.Elements("DefaultPage")

                    select f).Single().Attribute("file").Value;



    string filePath = FeaturePath + "\\" + file;

    TextReader reader = new StreamReader(filePath);



    MemoryStream outStream = new MemoryStream();

    StreamWriter writer = new StreamWriter(outStream);



    writer.Write(reader.ReadToEnd());

    writer.Flush();



    web.Files.Add("Default.aspx", outStream, true);

}

当你看到这里,我们提取的路径将用于从配置文件到Default.aspx页面,然后该文件的内容读入一个流,并写入到一个StreamWriter。使用TRUE SPWeb.Files.Add方法,将使我们的新文件覆盖现有的Default.aspx页面。因为这将导致页面被添加到内容数据库,它是现在unghosted的,从而独立的文件系统中的的文件。
你可以像以前一样的方式测试这个过程。基于此模板创建一个新的网站。更新的Visual Studio项目的Default.aspx页面,并重新部署的解决方案。如果你刷新页面,你将不会看到任何变化。如果您创建一个新的站点,修改default.aspx页面将被使用。结论
本文试图解释不同的方法来创建并应用在SharePoint和每个的优点和利弊的一些网站模板。希望这将会给读者一个很好的了解,选择最合适的方法,使用一个项目。历史初始张贴:11年4月21日|马克Nischalke

回答

评论会员:。很好解释 时间:2012/01/27
标记Nischalke
评论会员:游客 时间:2012/01/27
谢谢我知道的语言。我读过一本书。-_Madmatt