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

SharePoint 入门快速入门常见问题解答 第三部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (26投票s)

2009 年 1 月 16 日

CPOL

13分钟阅读

viewsIcon

102490

downloadIcon

643

SharePoint 入门快速入门常见问题解答 第三部分

目录

如果您是 SharePoint 新手,请从以下视频开始学习:8 小时学会 SharePoint:-

引言

这是我的第三系列 SharePoint 入门快速入门常见问题解答。我们将介绍页面模板、页面实例、WSS 模型、理解安全模式处理、部署自定义控件以及理解 WebParts。因此,让我们一集一集、慢慢地品味 SharePoint 的佳酿,保持微醺,享受这个伟大的产品。

如何预配页面模板和页面实例?

在继续回答这个问题之前,我们先定义一下预配。预配只是一个让某样东西可用的花哨的说法。我们先使用 _Default.Master_ 创建一个页面模板,看看如何将此页面预配到网站上。下面是一个代码片段,我们可以从中创建一个主控页面,该主控页面源自 _Default.Master_。

<%@ Page MasterPageFile="~masterurl/default.master"%>

<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">
<h3>Hi this is a Page made from Page template</h3>
</asp:Content>

为了使用该模板,我们需要在 SharePoint 运行时中创建一个实例。在 SharePoint 运行时中创建模板实例被称为预配。

我们需要使用 ModuleFile 标签来预配模板页面的实例。这在 _ElementManifest.XML_ 文件中完成。下面是 _ElementManifest.XML_ 文件的代码片段,其中包含 module 标签和一个 file 标签,指定了 URL 页面的名称。这与我们之前展示的模板是相同的。 _PageA.aspx_ 是实例名称, _MyPage.aspx_ 是模板页面的物理页面名称。

type 属性有两个值:GhostableGhostableInLibrary。如果您想在文档库中预配资源,则需要指定 GhostableInLibrary。如果您不想在文档库中预配资源,则需要指定 Ghostable 值。对于当前练习,我们将值设为 Ghostable

注意:path 属性将页面放在“_MyPath_”文件夹中。

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Path="MyPage" Url="SitePages">
<File Url="MyPage.aspx" Name="PageA.aspx" Type="Ghostable" />
</Module>
</Elements>

正如之前所说,我们还需要定义 _feature.xml_ 文件,其中包含接收器类和指向 _elementmanifest.xml_ 文件的元素清单。

<Feature Id="701B7EA3-0816-4a5f-8FFE-AD15F0E5B562" Title="Provision"
Scope="Web"
Description="This features enables us to goto Custom Page"
Hidden="FALSE"
ImageUrl="menuprofile.gif"
ReceiverAssembly="ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=52bd1db23825a2e4"
ReceiverClass="ClassLibrary1.clsFeatureActivator" 
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="ElementManifest.xml" />
</ElementManifests>
</Feature>

在接收器类中,我们将在快速启动节点中添加菜单项。因此,在激活事件中,我们将添加一个链接来激活此功能,并在禁用事件中,我们将删除此功能。

在激活事件中,我们首先需要使用 URL 获取 SpSite 对象的引用。

SPSite ObjQuickLaunch = new SPSite("http://mum2815dz:2/sites/LearnSharePoint");

SpSite 对象,我们获取 SpWeb 对象。

SPWeb ObjSpWeb = ObjQuickLaunch.OpenWeb();

SpWeb 对象,我们获取对快速启动菜单所有节点集合的引用。

SPNavigationNodeCollection QuickLauncNodes = ObjSpWeb.Navigation.QuickLaunch;

现在我们创建页面的菜单。

SPNavigationNode objMenuItem = new SPNavigationNode("Quest", "SitePages/PageA.aspx");

将菜单添加到快速启动节点。

QuickLauncNodes.AddAsFirst(objMenuItem);
ObjSpWeb.Update();

在禁用事件中,我们将删除链接。

现在我们已经完成了两个 XML 文件和处理功能事件的类的创建,请使用 _stsadm_ 实用工具注册该功能。注册后,您应该会在功能列表中看到该功能。我们将该功能命名为“Provision”,因此您可以看到“Provision”功能。

激活该功能后,您应该会看到指向模板实例页面 _PageA.aspx_ 的“Quest”链接。如果禁用该功能,您将无法浏览页面实例。

为什么自定义页面使用非编译模式进行解析

我们之前讨论过两种类型的页面:网站页面和应用程序页面。网站页面可以自定义,而应用程序页面是标准的页面,例如 _settings.aspx_,它们在网站之间是通用的。

当用户自定义网站页面时,自定义版本的网站页面将保存在内容数据库中。这提供了很大的灵活性,但也有其自身的缺点。我们可以使用“SharePoint Designer”来自定义网站页面。

现在让我们尝试理解如何处理保存内容的自定义网站页面。自定义网站页面通过六个步骤进行处理。

  • 步骤 1:用户请求自定义页面。
  • 步骤 2:SharePoint HTTP 处理程序,即 SPVirtualPathProvider,处理请求,并向内容数据库查询以获取页面。
  • 步骤 3:检索网站页面并将其发送到 SharePoint 处理程序。
  • 步骤 4:网站页面数据被提供给 ASP.NET 解析器。请注意:此 ASP.NET 解析器不是 IIS 使用的那个。这是 SharePoint 特别制造的。
  • 步骤 5:解析器解析并将输出提供给处理程序。
  • 步骤 6:处理程序最终将输出返回给客户端。

以下是非编译页面比编译页面更有效的原因。

一旦加载了编译的 ASP 页面 DLL,只有当 AppDomain 被回收时才会卸载它。它可以被加载和卸载。在这种情况下,内存管理更有效。

什么是安全模式处理和安全控件?

任何自定义页面都使用安全模式处理进行解析。这种解析带来了安全性。安全模式处理可确保自定义页面中没有内联脚本。换句话说,安全模式处理不允许内联脚本,因为黑客可以利用内联脚本进行攻击。如果您尝试在自定义页面上运行内联脚本,您将收到错误:“此文件不允许代码块”。

如果您仍然想在自定义页面中运行内联脚本,则需要在 _web.config_ 文件中的 SafeMode 标签部分指定 AllowServerSideScript=true

<SharePoint>
<SafeMode ... >
<PageParserPaths>
<PageParserPath
  VirtualPath="/sites/MySite/SitePages/*"
  IncludeSubFolders="true"
  CompilationMode="Always"
  AllowServerSideScript="true" />
</PageParserPaths>
</SafeMode>
</SharePoint>

安全控件帮助我们定义自定义页面将包含哪些控件。自定义页面只能包含在 _web.config_ 文件中 SafeControls 标签定义的控件。例如,在下面的代码片段中,我们定义了自定义页面可以使用来自 Microsoft.SharePoint.WebControls 的控件。

<SafeControls>
<SafeControl
Assembly="Microsoft.SharePoint"
Namespace="Microsoft.SharePoint.WebControls"
TypeName="*"
AllowRemoteDesigner="True" />
</SafeControls>

你能解释一下 WSS 模型吗?

为了理解 WSS 模型,我们首先需要了解 SharePoint 使用的不同类型的服务。SharePoint 在 IIS 中使用两种主要服务:非数据服务和 SQL Server,即与数据库相关的服务。

SharePoint 的设计初衷是可以在 Web 场中使用。因此,让我们先可视化 Web 场,然后尝试理解 SharePoint 如何可视化 Web 场。下图显示了两个方面:Web 场的正常可视化和 SharePoint 的观点。在我们正常的视图(即图像的左侧)中,我们可以认为场中有服务器,服务器有两个服务(即 IIS 和 DB 服务)。当 SharePoint 可视化场基础架构时,情况有所不同。

SharePoint 从数据库服务和非数据库服务方面来可视化场基础架构。因此,它以不同的方式可视化连接到服务器的数据库服务和像 IIS 这样的非数据库服务。

注意:我们不确定为什么可视化会有变化。

因此,让我们可视化 SharePoint 的 WSS 对象模型是如何看到的。

  • SharePoint 层次结构中的父对象是 SPfarm 对象。
  • SPFarm 将包含服务器对象集合,即 SPServer 对象。
  • SPServer 对象进一步包含 SPDatabaseServiceInstance 对象。
  • SPDatabaseServiceInstance 包含一个 SPContentDatabase 对象实例。
  • SPFarm,您还可以浏览到场级别的服务。SPFarm 包含一个 SPService 集合。
  • SPService 反过来允许我们浏览 IIS 应用程序,即 SPWebApplication
  • SPWebApplication 包含一个网站集,网站集又包含一个网站对象,可以使用 SPSite 对象进行浏览。

现在让我们理解 SPSite 下的对象层次结构。SPSite / Site 属于网站集。换句话说,一个网站集可以包含许多网站。网站将包含列表,列表将包含字段。

下面是获取 Farm 对象,遍历其所有服务,使用服务对象遍历所有 Web 应用程序,然后使用 Web 应用程序遍历所有网站的代码片段。

// Get The local farm object
SPFarm oFarm = SPFarm.Local;

// Get all the services from the farm object
foreach (SPService objService in oFarm.Services)
{
    // Check if this is a WebService type of object
    if (objService is SPWebService)
    {
        // Cast it to a WebService object
        SPWebService oWebService = (SPWebService)objService ;

        // Get all Webapplications from the WebApplications collection
        foreach (SPWebApplication oWebApplication in oWebService.WebApplications)
        {
            // Loop through all the sites
            foreach (SPSite oSite in oWebApplication.Sites)
            {
                // Get reference of the Root object
                SPWeb oWebRoot = oSite.RootWeb;

                // Any kind of processing

                // Do not forget to dispose
                oWeb.Dispose();
                oSite.Dispose();
            }
        }
    }
}

如何在 SharePoint 中使用自定义控件?

步骤 1:通过继承 WebControl 类来创建自定义控件,并使用您的实现重写 RenderContents 方法。在下面的代码片段中,我们只是将网站标题和网站 URL 写入浏览器。

using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;

namespace NameSpaceCustomControl
{
public class CustomControl1 : WebControl
{
    protected override void RenderContents(HtmlTextWriter output)
    {
        SPWeb site = SPContext.Current.Web;
        output.Write("The Site title is " + site.Title);
        output.Write("<br/>");
        output.Write("The URL of the site is " + site.Url);
    }
}
}

步骤 2:编译自定义控件类并生成 DLL。生成编译后的 DLL 后,将其注册到 GAC。

步骤 3:使用 Register 属性在您的 ASPX 页面中引用自定义控件程序集。请记住指定 GAC 的公钥标记。

<%@ Register Assembly="CustomControl,Version=1.0.0.0,Culture=neutral,PublicKeyToken=4adae03f3c0d5b8e" 
    Namespace="NameSpaceCustomControl" TagPrefix="CustomSitePages" %>

指定具有正确唯一 ID 的自定义控件。

<CustomSitePages:CustomControl1 ID="cc1" runat="server" />

下面是页面的完整代码。

<%@ Page Language="C#" MasterPageFile="~masterurl/default.master" meta:progid="SharePoint.WebPartPage.Document"%>

<%@ Register Assembly="CustomControl,Version=1.0.0.0,Culture=neutral,PublicKeyToken=4adae03f3c0d5b8e" 
   Namespace="NameSpaceCustomControl" TagPrefix="CustomSitePages" %>

<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">

<h3>Hi this is a Site Page</h3>
<CustomSitePages:CustomControl1 ID="cc1" runat="server" />

</asp:Content>

现在,如果您运行该页面,您将可以看到自定义控件在起作用。

如何在 SharePoint 中查看详细错误?

SharePoint 不会以用户友好的方式显示错误。例如,下图显示它显示文件未找到,但根本原因却有所不同。开发人员希望获得错误发生的具体函数/方法名称。

有四个步骤,换句话说,我们需要对配置文件进行三次更改并执行 IIS 重启。因此,让我们逐步完成这四个步骤以获取上述错误的实际原因。正如之前所说,我们需要在三个不同的地方更改 _web.config_ 文件。您可以从 _C:\Inetpub\wwwroot\wss\VirtualDirectories\80_ 文件夹中获取 _web.config_ 文件。

步骤 1:将 SafeMode 属性中的 callstack 值从 false 改为 true,如下所示。

更改

<SafeMode MaxControls="200" CallStack="false" ...> 

to

<SafeMode MaxControls="200" CallStack="true" ...> 

步骤 2:将 customErrors 标签模式从 On 改为 Off。

更改

<customErrors mode="On" /> 

to

<customErrors mode="Off" /> 

步骤 3:将 Compilation 属性中的“Debug”从“false”改为“true”。

更改

<compilation batch="false" debug="false"> 

to

<compilation batch="true" debug="true">

步骤 4:重启 IIS。

现在您可以看到详细的堆栈错误,显示哪个方法具体存在问题。例如,在此场景中,错误发生在 FeatureDeactivation 事件中。

FeatureDeactivation 事件中的错误是由于为 SPSite 指定了错误的 URL 造成的。如果您看到之前的错误,它显示为“文件未找到”,但实际上,这是由于 URL 名称错误。

如何在 SharePoint 页面中显示 ASCX 控件?

ASP.NET 中的自定义控件在 ASP.NET 中提供了极高的重用性。它们通常是具有 ASCX 扩展名的简单控件,可以在不同的 ASPX 页面中重用。我们不会深入探讨 ASCX 控件的细节。如果您不熟悉基础知识,请阅读任何 ASP.NET 基础书籍,这并不难。

在 SharePoint 环境中加载 ASCX 控件是一个简单的五步过程。

步骤 1:我们需要创建一个 ASCX。下面是一个简单的 ASCX 文件,其中有一个标签 lblDisplay。有两个函数 setTextClearText,一个用于设置标签的值,另一个用于清除标签。这两个方法 setTextclearText 分别由两个按钮 cmdSetcmdClear 的点击事件调用。

<%@ Control Language="C#" %>
<script runat="server">
protected void SetText(object sender, EventArgs e) 
{
    lblDisplay.Text = "This is a user control";
}
protected void ClearText(object sender, EventArgs e) 
{
    lblDisplay.Text = "";
}
</script>
<asp:Button ID="cmdSet" runat="server" Text="Click Me" OnClick="SetText" />
<br/>
<asp:Button ID="cmdSetClear" runat="server" Text="Click to clear text" OnClick="ClearText" />
<br/>
<asp:Label ID="lblDisplay" runat="server" Text="" />

步骤 2:我们需要使用 Register 属性在 ASPX 页面中引用此 ASCX 文件,并使用 TagPrefixTagName 进行引用。下面是突出显示此内容的代码片段。

<%@ Assembly Name="Microsoft.SharePoint,Version=12.0.0.0, 
    Culture=neutral,PublicKeyToken=71e9bce111e9429c" %>

<%@ Page Language="C#" MasterPageFile="~/_layouts/application.master" 
   Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase" %>

<%@ Register TagPrefix="MyUserControlPrefix" TagName="MyUserControlName" 
   src="~/_controltemplates/MyUserControl/MyUserControl.ascx" %>

<%@ Import Namespace="Microsoft.SharePoint" %>

<asp:Content ID="Content3" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
This page displays Custom Control in Action
</asp:Content>

<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderMain" runat="server">
<MyUserControlPrefix:MyUserControlName ID="id2" runat="server" />
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderId="PlaceHolderPageTitleInTitleArea" 
  runat="server">
We never knew custom control is so easy to display.
</asp:Content>

下图显示了 _MyUserControl.ascx_ 和 _PageUsingCustomControl.aspx_ 的整体视图、交互和解释。

步骤 3:我们需要将 ASCX 控件复制到 _C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES_ 目录中。对于这个示例,我们创建了一个名为 _MyUserControl_ 的简单目录并将 _MyUserControl.ascx_ 上传到其中。如果您还记得,我们曾使用虚拟路径符号“~”并加上“_MyUserControl_”文件夹来引用 ASCX 文件。

<%@ Register TagPrefix="MyUserControlPrefix" 
    TagName="MyUserControlName" 
    src="~/_controltemplates/MyUserControl/MyUserControl.ascx" %>

步骤 4:我们还需要将 ASP.NET 页面 _PageUsingCustomControl.aspx_ 粘贴到位于 _C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS_ 的 layouts 文件夹中。

步骤 5:这是最简单的步骤,我们需要运行 ASPX 页面,然后享受用户控件在 SharePoint 环境下的运行情况。下面是用户控件的外观。如果您单击“Click me”按钮,标签将设置为“This is a user control”。如果您单击“Click to clear text”,它将清除标签的值。

注意:如果您使用后台代码,则需要将后台代码注册到 GAC 并在 ASCX 中引用它。在此示例中,为简单起见,我们仅使用了内联代码。

什么是 WebParts,它们如何与 SharePoint 交互?

WebParts 有助于构建可重用组件,这些组件可以根据业务用户的需求进行自定义和个性化。我们可以自己创建 WebPart,也可以重用 SharePoint 中已有的 WebPart。

WSS 提供了以下 WebParts。

  • 数据视图 Web Part:通过 Microsoft SharePoint Designer 显示具有丰富设计支持的数据。
  • 列表视图 Web Part:帮助我们显示 SharePoint 网站中任何列表的内容。
  • 图像 Web Part:帮助我们显示图像文件。
  • 内容编辑器 Web Part:使用此项通过所见即所得编辑器显示静态 HTML 内容或链接到文本文件。
  • 成员 Web Part:帮助我们显示网站成员。
  • 页面查看器 Web Part:在 iframe 中显示网页。

WebPart 实际上就是一个简单的类,它继承自 System.Web.UI.WebControls.WebParts。换句话说,您可以说 WebPart 是一种 WebControl,可以部署在 WebPartZoneControl 中。

WebPart 管理器控件就像一个控制器,它维护 WebPart 的实例。当 ASP.NET 页面初始化时,它会将 WebPart 添加到 WebPartZone 中。

在我第四系列的入门快速入门中,我将专门介绍 WebParts 的更详细内容。

源代码

随时下载并使用 源代码

之前的 SharePoint 入门快速入门常见问题解答

  • 入门快速入门常见问题解答 第 1 部分:11 个基本常见问题解答,是每个新手都必须看的。这是基本的入门快速入门常见问题解答教程,它介绍了 SharePoint、WSS、MOSS、网站/网站集、虚拟路径提供程序是什么,然后结束于对网站页面和应用程序页面的解释。要查看 SharePoint 第 1 部分,请单击 此处
  • 入门快速入门常见问题解答 第 2 部分:这是本系列的第二部分,它解释了现成的功能、自定义页面以及功能的部署/激活/停用。要查看 SharePoint 第 2 部分,请单击 此处
  • 入门快速入门常见问题解答 第 4 部分:-这是 SharePoint 入门快速入门常见问题解答的第四系列。在本系列中,主题是 WebPart、WebPart 和 WebPart。要查看 SharePoint 第 4 部分,请单击 此处
  • 入门快速入门常见问题解答 第 5 部分:这是 SharePoint 入门快速入门常见问题解答的第五系列。在本系列中,主题主要集中在自定义列、内容类型和文档列表库。我相信阅读完这篇文章后,您对 SharePoint 如何组织文档集中管理的看法将有所改变,请单击 此处
  • 入门快速入门常见问题解答 第 6 部分:在本文中,我们将主要关注 SharePoint 工作流。SharePoint 工作流建立在 Windows 工作流之上,并添加了以内容为中心的工作流功能。因此,我们将首先从 Windows 工作流的一些基础知识开始,然后转向 SharePoint 工作流,请单击 此处
© . All rights reserved.