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

开发 Office SharePoint 2007 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (32投票s)

2007年6月27日

CPOL

22分钟阅读

viewsIcon

283585

描述了如何使用 WSS 3.0 和 Office SharePoint Server 2007 开发自定义业务门户应用程序

SharePoint

X

目录


X

引言

Microsoft Windows SharePoint Services (WSS) 和 Microsoft Office SharePoint Server 2007 是当前 Web 编程世界中的两大出色技术。

微软将前者定义为

Windows SharePoint Services 基于 Microsoft Windows Server 2003 构建,它还提供了一个基础平台,用于构建可轻松灵活扩展以满足业务不断变化和增长需求的基于 Web 的业务应用程序。基于 Microsoft Windows Server 2003 构建,Windows SharePoint Services 还提供了一个基础平台,用于构建可轻松灵活扩展以满足业务不断变化和增长需求的基于 Web 的业务应用程序。Windows Server 中的一项多功能技术提供了协作基础设施和构建基于 Web 应用程序的基础。

并将后者定义为

Microsoft Office SharePoint Server 2007 提供了门户和搜索功能,代表了 Microsoft Office SharePoint Portal Server 2003 的下一代。然而,Office SharePoint Server 2007 远不止于此。Office 团队在许多其他领域进行了大量投资,为 Office SharePoint Server 2007 在 Web 内容管理、商业智能、业务流程管理和企业内容管理方面增添了额外维度。

这是这两个的架构结构

SharePoint

开发人员可以利用这两项卓越技术共同创建直观的 Web 门户,满足几乎任何类型的业务需求。这些发行版提供了丰富的 Web 门户构建块,开箱即用。因此,为了满足业务需求或自动化任何企业规模机构的业务流程,开发人员只需对现有功能进行修改,实际开发工作量显著减少。

SharePoint 服务器提供了一套基本的网站模板,可以满足当今几乎所有通用网站的需求。除了这些内置网站模板之外,还可以自定义网站(随心所欲),并将自定义网站保存为模板以供将来使用——这可以为企业业务带来巨大价值。

X

本文背后的概念

去年年中以来,我参与了一个基于这些技术的项目。在项目开发过程中积累的经验促使我与所有其他开发人员分享这些想法——邀请大家关注这些技术。我必须在这里说明一点,我不会在这里写任何由我独创或发明的东西。几乎所有这些内容你都可以从其他网络资源中学到。但我的目的是将它们(据我所知)整合在一个页面中,以确保易于阅读。

在本文中,我将解释基础知识,一些高级内容,当然还有我在经验中发现/学到的一些技巧和窍门。

X

Office SharePoint server 2007 门户网站

Office SharePoint 门户网站是一个 Windows SharePoint Services 网站集,包含一个顶级网站和其下的几个子网站(也称为子网站)。

这里需要提及一个例外——与 SharePoint Portal Server 2003 不同,门户网站不必在 IIS 网站的根目录下创建。这带来了更大的灵活性——现在我们可以在一个 IIS 网站中托管数百个门户网站。

在 Windows SharePoint Services 术语中,一个扩展了 Windows SharePoint Services 功能的 IIS 网站被称为Web 应用程序

一般来说,Office SharePoint Server 2007 提供了门户解决方案所期望的所有功能。例如,个人网站、受众定位、用户配置文件和管理、搜索、单点登录 (SSO) 等,以及一些新的 Office SharePoint 2007 功能,如业务数据目录,都得到了完美的集成。

共享服务提供商(简称 SSP)是 Office SharePoint 门户架构的核心部分,它由一组服务组成,这些服务可以一次性配置,并可以在许多不同的 Office SharePoint Server 2007 门户网站和 Windows SharePoint Services 网站之间共享。

SharePoint

X

SharePoint 对象模型

SharePoint 服务提供了一套丰富的 API——这基本上是 SharePoint 对象模型,可用于操作任何 SharePoint 网站元素——如列表、文档,甚至网站本身。这套完全托管的语言 API 封装了底层的非托管内容。在本文中,您将找到一些这些 API 的使用示例,以代码片段的形式提供——根据需要。

X

创建门户网站

您可以通过三种方式创建和执行门户网站的管理任务。

  • 使用 Windows SharePoint Services Central Administration 应用程序
  • 使用 SharePoint 分发版附带的命令行实用程序 STSADM.EXE
  • 通过自定义代码以编程方式

Office SharePoint Server 2007 分发版附带了多个门户网站模板,可用于创建门户网站。以下是一些可用于创建新的 Office SharePoint 2007 门户网站的网站模板示例:

  • 企业内部网网站
  • 互联网存在网站
  • 发布网站

还可以添加自定义网站模板。Office 团队提供了新的网站模板,用于在门户网站集中创建子网站,例如报表中心、搜索中心。Office 团队还改进了旧的 SharePoint Server 2003 网站模板,如新闻、主题和网站目录。

如果我们想从头开始创建一个门户网站,那么首先我们需要创建一个新的 Web 应用程序。创建新的 Web 应用程序以及创建网站集、顶级网站都可以从 SharePoint 中心管理应用程序中完成。

SharePoint

让我们从“开始”菜单打开 SharePoint 3.0 中心管理应用程序,然后导航到应用程序管理页面(页面顶部有一个链接),在这里我们会看到一个名为“创建/扩展 Web 应用程序”的链接——它主要用于创建或扩展 Web 应用程序。

SharePoint

点击此链接将弹出一个页面,我们可以在其中创建一个新的 Web 应用程序。

填写完创建新 Web 应用程序所需的数据后,我们将看到一个名为“网站集”的链接。此链接将在新创建的 Web 应用程序中创建一个网站集。因此,我们这里有一个顶级网站。现在,我们可以在此顶级网站上开始开发,甚至可以在此网站下创建子网站/子站点。

在这个演示中,我使用团队网站模板来创建网站。当然,您也可以使用其他符合您需求的模板。基本上,团队网站是最通用的一种,可以满足几乎所有基本业务门户的需求。

X

网站层次结构和用户管理

SharePoint 门户网站的顶部称为顶级网站,它基本上是网站集。从这个顶级网站,可以创建子网站/子站点,以管理不同部门/人群的协作。每个子网站管理一套独立的列表、文档库。因此,通过这些网站层次结构可以实现清晰分离的数据协作。

我们可以为网站定义用户和组以及网站的权限。例如,您可以为每个子网站创建独立的组。一个子网站用户将无权访问或查看其他子网站的内容。我们需要记住一点,如果我们要为每个子网站创建独立的权限,那么在创建子网站时,我们需要使用“独立权限”选项,而默认设置为“使用与父级相同的权限”。

所有 SharePoint 用户都由一个名为 SPUser 的类(SharePoint 对象模型的一部分)表示,通过它我们可以以编程方式与 SharePoint 网站用户进行交互。

        SPWeb web = SPControl.GetContextWeb(HttpContext.Current);
        foreach (SPUser siteUser in web.SiteUsers)
        {   // iterate thru the site users
            Logger.WriteLine(siteUser.LoginName);
        }

X

Web 部件

Web 部件是 SharePoint 门户中的一种基本构建块。Web 部件可以包含信息(用户可以与之交互),并提供个性化持久性。因此,用户可以使用 Web 部件(在 Web 部件区域上设计)设计页面的布局,并且它将存储到 SharePoint 内容数据库中,以便用户下次登录时会找到该布局。SharePoint 附带了许多内置 Web 部件,可以为开发工作增加巨大的价值。我不会在本文中解释如何构建 Web 部件。因为我猜 Tony Rabun 已经在他的精彩 文章 中解释过了。如果您现在需要学习,我建议您查看那篇文章。

无论如何,在这个网络时代,仅仅创建一个包含一些 Web 控件的 Web 部件对我们来说是不够的。我们需要使这些控件也能在不回发的情况下执行操作。使用 ASP.NET AJAX 可以在这里发挥作用。但是,在 SharePoint Web 部件中启用 Ajax 并不像将 UpdatePanel 拖到 Web 用户控件 (*.ascx) 上那么容易。我们需要考虑 UpdatePanel 需要一个脚本管理器,它应该存在于 ASP.NET 页面中。在 SharePoint 开发中,所有页面都是由 SharePoint 自己创建并保留在内容数据库中的。所以我们需要明确检查我们要在其中显示 Web 部件的页面是否具有 ScriptManager。如果没有,那么我们需要显式创建一个。同样,我也不打算深入探讨这个细节。我们可以从 Mahdi Abdulhamid文章 中了解这个过程。事实上,另一个很好的资源是 Jan Tielen 的博客和 SmartPart 的 GotDotNet 工作区。

在开发 Web 部件时,我们经常忽略的一点是忘记 Web 部件的设计时视图。因此,当有人通过 SharePoint Designer 2007 设计 Web 部件时,它会失败并显示一个错误,例如“此 Web 部件的预览不可用”。我们可以通过一个简单的解决方案来解决这个问题。我们需要实现

Microsoft.SharePoint.WebControls.IDesignTimeHtmlProvider 接口,该接口公开了一个方法 GetDesignTimeHtml,该方法返回在 SharePoint Designer 编辑器中显示的静态 HTML。正如您已经看到的,我们可以将有意义的 HTML 内容作为实现方法的返回值。请记住,您不必编写任何 head 或 body HTML 元素。您可以从 div 或 table 开始生成此 HTML 块。

 public class CustomWebpart : 
  Microsoft.SharePoint.WebPartPages.WebPart, 
  Microsoft.SharePoint.WebPartControls.IDesignTimeHtmlProvider 
 { 
  public string GetDesignTimeHtml() 
  { 
   return @"<div style='border: black 
   1px solid; background-color: yellow'> 
   This is design time view...</div>"; 
  }  
// other implementation goes here

X

使用列表和文档库

SharePoint 列表可用于保留和操作可以列表格式组织的所有数据。它基本上是一个通用的列表数据结构,可以自定义以操作任何自定义数据。我们可以创建一个列表,然后有机会填充列表的列。我们可以将附件与列表项一起保留。我们可以定义列表的权限,甚至单个列表项的权限。当然,我们也可以以编程方式执行所有这些操作。

在开始使用 SharePoint 列表之前,有两件事需要探索。

  • 内容类型
  • 网站列

X

内容类型

内容类型基本上是网站或列表的架构定义。例如,如果我们需要一个列表来跟踪项目进度,那么该列表的内容类型应包括“项目”、“任务”、“责任”、“状态”等列。内容类型提供了一种封装数据架构并使其独立于 SharePoint 网站上某个位置的方式。由于内容类型独立于特定的列表或文档库,因此内容类型可以在多个网站上的列表中使用,从而使网站集上存储的内容类型能够更集中地定义和管理。SharePoint 附带了一些开箱即用的内容类型,但除此之外,我们可以创建或自定义现有内容类型以满足我们的要求。更有趣的是,我们还可以使用 SharePoint 对象模型以编程方式操作内容类型。下面是一些示例代码片段。

 SPWeb web = 
  SPControl.GetContextWeb(HttpContext.Current);
        SPContentType contentType = 
  web.ContentTypes["ProjectProgress"];
        StringCollection sc = new StringCollection();
        sc.AddRange(new string[] 
  { "Initiated","On progress","Completed" });
        contentType.Fields.Add("TaskStatus", 
  SPFieldType.Choice, false, true, sc);
        contentType.Fields.Add(taskField);
 contentType.Update();

X

网站列

网站列是可以在多个 SharePoint 网站的多个列表中使用的列定义。网站列与内容类型有很多共同点。网站列可以在网站级别创建,并可用于创建依赖于该网站列定义的列表。

我们可以通过选择现有内容类型和网站列来创建自定义列表或文档库,甚至可以创建自定义网站列和内容类型,然后基于这些自定义内容类型创建自定义列表或文档库。

创建网站列表后,我们可以将该列表另存为模板,以便以后可以创建具有完全相同内容类型和网站列的另一个列表。

SharePoint

现在让我们看看如何以编程方式操作列表项。SharePoint 列表由一个名为 SPList 的类表示。此公开所有方法和属性,用于处理其项。以下是一些代码片段,可帮助您了解它。

所有 SharePoint 列表都指定了一个唯一的 ID,我们可以通过它来识别列表。以下是如何从列表 GUID 获取列表引用。

 public static SPList GetListByID(string listID)
        {
            SPWeb web = 
                 SPControl.GetContextWeb(HttpContext.Current);
            SPListCollection lists = web.Lists;
            Guid guid = new Guid(listID);
            return lists[ guid];
        }

除此之外,我们还可以使用其名称获取列表引用。

        public static SPList GetListByName(string listName)
        {
            SPWeb web = 
                    SPControl.GetContextWeb(HttpContext.Current);
            SPListCollection lists = web.Lists;            
            
            return lists[listName];
        }

检索列表项可以如下进行

        public static List<String> GetListItems(string listName)
        {
                SPList list = GetListByName(listName);
                if (null != list)
                {
                    List<String> titles = new List<String>();
                        foreach (SPListItem item in list.Items)
                        {   // iterate thru the items
                           titles.Add(item["Title"]);
                        }
                    return titles;
                }
            }
            return null;
        }

或,

        public static List<String> GetListItems(string listName)
        {
                SPList list = GetListByName(listName);
                if (null != list)
                {
                    List<String> titles = new List<String>();
                        foreach (SPListItem item in list. GetItems())
                        {   // iterate thru the items
                            titles.Add(item["Title"]);
                        }
                    return titles;
                }
            }
            return null;
        }

SPListItemCollection 提供的一个最强大的 API 是

DataTable data = list.Items.GetDataTable();

在这种情况下,它会返回一个 ADO.net 数据表,我们可以使用它轻松地进行 UI 控件绑定、缓存等操作。

创建新项目可以如下进行

  SPListItem item = list.Items.Add();
                item["Title"] = "Title goes here";                
  item["Description"] = "Here is the description..";
                item.Update();

如果列表的内容类型提供了用于保存附件的列,那么我们可以按照以下方式上传附件

byte[]fileContent = GetFileContents();

item.Attachments.Add("SOME FILE", fileContent);
item.Update();

从列表项下载所有现有附件可以按如下方式执行

public static Dictionary<string,byte[]> 
  DownloadSharePointListItemAttachement(
   string listName, 
   int itemID)
        {
            Dictionary<string, byte[]> attachments 
  = new Dictionary<string, byte[]>();
            // get the web form the context
            SPWeb web 
  = SPControl.GetContextWeb(HttpContext.Current);
            // get the list reference
            SPList list = GetListByName(listName);            
            // get the folder
            SPFolder folder = 
                web.Folders["Lists"].
   SubFolders[listName].SubFolders["Attachments"].
   SubFolders[itemID.ToString()];
            foreach (SPFile file in folder.Files)
            {   // iterate thru the files
                byte[] binFile = file.OpenBinary();
                // attach the file into the list
                attachments[file.Name] = binFile;
            }
            return attachments;
        }

我们可以将文档上传到文档库,如下所示

        Byte[]fileContents = GetFileContents();
        // get the site reference from the context
        SPWeb site = SPControl.GetContextWeb(Context);
        // get the folder
        SPFolder folder = site.GetFolder(folderPath);
        string fileUrl = fileName;
        // attach the file now 
        SPFile file = folder.Files.Add(fileUrl, fileContents);

X

使用视图和 CAML 筛选列表数据

我们通常需要以过滤视图的形式检索列表数据,而不是一次性获取所有项目。有两种出色的方法可以实现这一点。一种是视图,另一种是 CAML。

视图在概念上与我们在数据库上下文中熟悉的事物相同。在 SharePoint 中,视图由一个名为 SPView 的类表示,我们可以使用它从列表项集合中查看部分或过滤后的数据。我们可以从 SharePoint 网站页面的列表设置中创建视图。我们可以通过编程方式探索网站中所有可用的视图,如下所示

SPWeb web = SPControl.GetContextWeb(this.Context);
SPList authors = web.Lists["authors"];
SPView activeAuthors = authors.Views["Active Authors"];
SPListItemCollection items = authors.GetItems(activeAuthors); 
foreach ( SPListItem item in items ) 
{ 
// process this item... 
}

这种方法在某些情况下是可以接受的;然而,大多数情况下,我们需要根据用户的输入应用动态过滤器。在这种情况下,预定义的视图并没有多大帮助。我们可以不向 GetItems 方法传递 SPView 对象,而是传递一个 SPQuery 对象,该对象定义了过滤条件和可选的排序选项。协作应用程序标记语言 (CAML) 是这里的粘合剂。CAML 定义了一个或多个过滤条件,可用于在列表项之间进行过滤。以下示例展示了如何使用 CAML 检索所有标题字段包含“PetZold”的作者项目。

SPQuery query = new SPQuery(); 
query.Query = @"<Where><Contains> 
 <FieldRef Name='Title'/><Value Type='Text'>PetZold</Value> 
 </Contains></Where>"; 
// retrieve the filtered items 
SPListItemCollection items = authors.GetItems(query);

一个简单的 CAML 查询的结构定义如下。

<Where><
[Operator]> <
FieldRef Name='[FieldTitle]'/><
Value Type='[FieldType]'>[Value]
</Value> 
</[Operator]>
</Where>

我们可以将 *[Operator]* 占位符替换为以下操作符之一

  • Eq = 等于
  • Neq = 不等于
  • BeginsWith = 以...开头
  • Contains = 包含
  • Lt = 小于
  • Leq = 小于或等于
  • Gt = 大于
  • Geq = 大于或等于
  • IsNull = 为空
  • IsNotNull = 不为空

我们还可以定义包含多个 OR/AND 条件的查询。以下是如何定义一个包含两个 OR 条件的查询,以选择所有“名称”字段等于“Mark”或“Joe”的项

<Where> <Or> <Eq><FieldRef Name='Name'/>
 <Value Type='Text'>Mark</Value></Eq> <Eq><FieldRef 
 Name='Name'/><Value Type='Text'>Joe</Value></Eq> </Or> 
 </Where> 

的局限性块只能包含两个条件。如果我们想要更多,我们必须定义一个/ 部分包含一个内部/ 部分代替两个条件之一。以下示例显示了如何为前面描述的查询添加进一步的可能值。

<Where> <Or> <Eq><FieldRef Name='Name'/>
 <Value Type='Text'>Mark</Value></Eq> <Or> <Eq>
 <FieldRef Name='Name'/><Value Type='Text'>Joe</Value></Eq> 
 <Eq><FieldRef Name='Name'/><Value Type='Text'>Linda</Value></Eq> 
 </Or> </Or> </Where>

可以在这里找到一个很酷的工具来创建 CAML

X

使用 SharePoint 控件作为 UI 元素

SharePoint 附带了许多精美的 UI 控件(例如日期时间选择器控件)。我们可以将这些开箱即用的 UI 控件用于我们的 Web 部件用户控件 (*.ascx),以创建出色且一致的外观和感觉 UI。

让我们看看如何在自定义 Web 部件中使用 SharePoint 日期时间选择器控件。

让我们打开我们正在 Web 部件中呈现的用户控件(.ascx 文件)。在文件顶部添加以下注册代码块

<%@ Register Tagprefix="SharePointSD"
Namespace="Microsoft.SharePoint.WebControls" 
Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>

这将为内置的 SharePoint 日期时间控件提供一个本地标签前缀。现在将以下标记放入 ascx 中。

<SharePointSD:DateTimeControl runat="server" 
id="dtpDateTime" DateOnly="True">

<asp:TextBox runat="server" MaxLength="45" 
CssClass="ms-input" ID="dtpDateTimeIdentifierTextBox">
</asp:TextBox>
</SharePointSD:DateTimeControl>

这将提供以下用户界面

SharePoint

我们可以使用以下代码片段在服务器端读取选定的日期

DateTime selectedDate = dtpDateTime.SelectedDate;

通过这种方式,我们也可以使用其他有吸引力的控件来构建一个漂亮的 UI。您可以使用 SharePoint Designer 收集用户控件的标记。首先使用 SharePoint Designer 设计 UI,然后复制标记代码并将其粘贴到 C# 用户控件中以设计 UI。

X

自定义 Web 部件快捷菜单和自定义上下文菜单

SharePoint Web 部件在页面中每个 Web 部件的右上角提供了一个直观的快捷菜单。此菜单可用于最小化/还原、关闭 Web 部件,甚至将 Web 部件与其他 Web 部件连接。我们可以根据需要自定义此上下文菜单。我们可以从上下文菜单中删除一些元素,甚至可以添加自定义菜单项。

为了完成这类工作(修改现有菜单项或在上下文菜单中创建更多菜单项),我们需要覆盖 WebPart 基类中的 CreateWebPartMenu 方法。

我们可以创建具有客户端 (javascript) 处理程序或服务器端 (C# 或任何其他 .NET 语言) 处理程序的菜单项。

public override void CreateWebPartMenu() 
{ 
 SPWeb web 
  = SPControl.GetContextWeb(this.Context); 
 MenuItem mnuClientSideMenu 
  = new MenuItem( "Menu with Javascript Handler", 
  "javascript:return alert('Client side menu clicked.');"); 
 MenuItem mnuServerSideMenu 
  = new MenuItem( 
"Menu with C# Handler", 
"MENUID", 
new  EventHandler(mnuServerSideMenu_Click)); 
this.WebPartMenu.MenuItems.Insert(0,  mnuClientSideMenu); 
this.WebPartMenu.MenuItems.Insert(0, mnuServerSideMenu); 

} 
private void mnuServerSideMenu_Click(object sender, EventArgs e) 
{ 
 this.Text = "Server side menu clicked!"; 
}

以上代码片段将添加两个上下文菜单,如下所示

SharePoint

现在,如果您想移除或禁用任何系统提供的菜单(如最小化、关闭等),您可以通过检索该菜单的引用并设置适当的属性来完成。要引用系统菜单,我们可以使用一些预定义的 ID,甚至索引。预定义的 ID 如下:

  • MSOMenu_最小化
  • MSOMenu_还原
  • MSOMenu_关闭
  • MSOMenu_删除
  • MSOMenu_编辑
  • MSOMenu_连接
  • MSOMenu_导出
  • MSOMenu_帮助

以下是如何禁用最小化菜单

    MenuItem mnuMinimize = 
            this.WebPartMenu.MenuItems.ItemFromID( 
              "MSOMenu_Minimize"
          ); 
         mnuMinimize.Enabled = false; 

我们可以如下移除所有菜单

    WebPartMenu.MenuItems.Clear();

除了这个快捷菜单修改之外,SharePoint 还为文档库中的每个列表项和文档提供了漂亮的上下文菜单。我们也可以修改它。请看屏幕截图中的以下列表。

SharePoint

在这里,我们可以在下拉菜单中添加一个新的上下文菜单项,该菜单项可以对列表项执行自定义操作。为此,我们需要在页面中添加一个内容编辑器 Web 部件,并且需要将其布局设置为“隐藏”。内容编辑器 Web 部件是一个可用于将 HTML 代码块或 JavaScript 插入 SharePoint 页面的 Web 部件。要添加新的自定义上下文菜单项,我们需要编辑内容编辑器 Web 部件的源代码。

SharePoint

点击源编辑器按钮将弹出一个窗口,我们可以在其中编写自定义 HTML 或 JavaScript。现在打开该窗口并编写以下 JavaScript

<script language="javascript">
/*
* @ Desc: Adds a custom menu items into the menu
*/
function Custom_AddListMenuItems(m, ctx)
{
  var strDisplayText = "Show Project details";
  var strAction =  "document.location.href=
 'ProjectDetails.aspx?listID="+ctx.listName+
  "&itemID="+currentItemID+"'";
  var strImagePath = "/_layouts/images/edit.gif";
  // Add our new menu item
  CAMOpt(m, strDisplayText, strAction, strImagePath);
  // add a separator to the menu
  CAMSep(m);
  // false means that the standard menu items should also rendered
  return false;
}

这里我们正在编写一些实用函数

/*
* @Desc: Get the site name
*/
function __getSiteName()
{
    var _siteName = '';
    try
    {
        var completeUrl 
            = document.location.href;
        var _server_index 
            = completeUrl.indexOf('/',7);
        if ( _server_index >= 0 )
        {
            var _site_index 
                  = completeUrl.indexOf('/', 
                    _server_index + 1);
            if ( _site_index >= 0 )
            {
                _siteName 
   = completeUrl.substring(_server_index + 1 ,
     _site_index);
            }
 }
    }
    catch(err)
    {
    }
    //alert( _siteName );
    return _siteName ;
}
function __getServerUrlInitials()
{
    var _hostInitial = '';
    try
    {
 var completeUrl = document.location.href;
 var _my_index = completeUrl.indexOf('/',7);
 //alert(_my_index);
 if ( _my_index >= 0 )
 {
            _my_index = completeUrl.indexOf('/', 
  _my_index + 1);
     if ( _my_index >= 0 )
     {
    _hostInitial = completeUrl.substring(0,_my_index);
            }
 }
    }
    catch(err)
    {
    }
    //alert( _hostInitial);
    return _hostInitial;
}
function __moveToPage(targetUrl)
{
 var destinationUrl = __getServerUrlInitials();
        destinationUrl = destinationUrl + '/' +  targetUrl;
        document.location.href = destinationUrl;
}
</script>

在这里,我们正在 Custom_AddListMenuItems 函数中创建一个新的菜单项。这是一个 SharePoint JavaScript 库定义的函数,我们可以在其中填充新的自定义项。CAMOpt 实际上会将菜单项添加到上下文菜单中。

SharePoint

现在它只是将用户重定向到另一个页面,并以查询字符串的形式传递列表 ID 和项目编号,以便目标页面可以根据菜单选择显示操作。但是我们也可以编写服务器端事件处理程序。但这需要一些技巧。我们需要创建一个实现 ICallbackEventHandler 的 Web 部件,以提供 ASP.NET 回调功能。(如果您不知道 ASP.NET 回调的作用,请阅读有关回调的信息)。我们知道回调会给我们一个客户端方法——调用它可以从客户端向服务器端提交请求。然后我们可以将 Web 部件布局保持隐藏。并且从 JavaScript 菜单处理程序中,我们可以调用该回调客户端函数来提交请求。

X

使用表单身份验证配置 SQL Server 身份验证

默认情况下,SharePoint 使用 Windows 身份验证。但在互联网场景中,使用 SQL Server 身份验证比 Windows 身份验证更可取。配置 SQL Server 身份验证而不是 Windows 身份验证并不困难。以下是我们可以做到这一点的方法。

1. 首先,我们将在 SQL Server 2000/2005 中创建一个数据库。为此,我们将使用 aspnet_regsql.exe 实用程序,它将创建所有必需的表、存储过程。此实用程序位于 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 目录中。我们将使用 GUI 模式创建数据库。在命令提示符下,浏览到该目录并输入以下命令

>aspnet_regsql.exe

它将弹出一个窗口。按照说明为您的 SharePoint 应用程序创建一个用户数据库。在我的例子中,数据库名称是 *Custom_Users*。该数据库将存储所有用户信息及其角色。

2. 现在我们将创建一些用户和角色。有很多方法可以做到这一点,例如使用 API、执行我们数据库的 SP、在 Visual Studio 2005 中使用 ASP.NET 配置工具。我们将使用 ASP.NET 配置工具。为此,在 Visual Studio 2005 中创建一个网站。在其 *web.config* 文件中添加以下连接字符串。

<connectionStrings>
  <remove name="LocalSqlServer" />
  <add name="LocalSqlServer" 
    connectionString=
  "Data Source=SHAREPOINT\OFFICESERVERS;Initial 
                Catalog=Custom_Users;Integrated Security=SSPI;" />
</connectionStrings>

保持连接字符串名称为 LocalSqlServer,因为我们将使用 machine.config 文件中的一些默认配置。现在我们需要启用角色管理器。为此,在添加以下

<rolemanager enabled="true" />

现在点击解决方案资源管理器中的 ASP.NET 配置按钮(在下图中高亮显示)。

SharePoint

这将弹出一个带有以下页面的浏览器窗口。

SharePoint

现在点击提供程序配置链接,测试您的成员资格提供程序和角色提供程序是否正常。如果正常,则转到安全页面添加用户和角色。

3. 此时您已经创建了所有角色和用户,我们将转到 SharePoint 2007。为此,我们需要配置我们的 SP Web 应用程序。我们可以在创建 SP Web 应用程序时对其进行配置。也可以稍后进行。在这里,我们将配置一个现有的 Web 应用程序,该应用程序之前已使用 Windows 身份验证进行配置。此应用程序将托管我们的网站集。

为此,请浏览 SharePoint Central Administration 网站。点击“应用程序管理”链接。在“应用程序安全性”部分下,点击“身份验证提供程序”链接。这将带您进入以下页面

SharePoint

现在点击提供程序配置链接,测试您的成员资格提供程序和角色提供程序是否正常。如果正常,请转到安全页面添加用户和角色。使用上图中突出显示的菜单选择您想要的 Web 应用程序。我的应用程序是 http://sharepoint:8888/。点击 *Default* 链接以重新配置您的应用程序的提供程序。这将带您进入以下页面:

SharePoint

在“身份验证类型”部分中选择“表单”。如果选择“表单身份验证类型”,将显示两个文本框,分别用于“成员资格提供程序名称”和“角色管理器名称”。现在将 AspNetSqlMembershipProvider 写入“成员资格提供程序名称”。“角色管理器”文本框留空。

SharePoint

4. 现在我们需要配置 *SharePoint Central Administration* 网站和我们的 SharePoint 应用程序的 *web.config* 文件。您可以在 *C:\Inetpub\wwwroot\wss\VirtualDirectories\{applicationPort}* 目录中找到它们。在每个文件中添加以下连接字符串

<connectionStrings>
  <remove name="LocalSqlServer" />
 <add name="LocalSqlServer" 
   connectionString="Data Source=SHAREPOINT\OFFICESERVERS;
  Initial Catalog=Custom_Users;
  Integrated Security=SSPI;" />
</connectionStrings>

将此连接字符串添加到中央管理站点将帮助我们验证站点管理员用户。添加这些行后,重置您的 IIS。

5. 现在是时候在我们之前创建/修改的 SharePoint 应用程序上创建一个网站集了。我创建了一个团队网站。创建网站集时,请指定一个您在 SQL Server 数据库中创建的用户作为网站集管理员。您可能还想使用您以前创建的网站集。要使用此类网站集,您需要将网站集管理员更改为您在 SQL Server 数据库中创建的用户。为此,请点击“应用程序管理”页面“SharePoint 网站管理”部分下的“网站集管理员”链接。在以下页面中,从“网站集”部分下的菜单中选择您的网站集。在此页面中指定您的网站集管理员。这些必须是您之前在 SQL Server 数据库中创建的用户。

6. 现在使用 SQL Server DB 中的用户登录到您的网站集。

7. 完成

X

备份和还原 SharePoint 网站

开发人员经常需要将整个站点复制到新机器。特别是在开发完 SharePoint 站点后,我们需要将其移植到暂存服务器,然后移植到部署服务器。

备份和恢复可用于完成此类工作。备份-恢复过程可以复制所有站点元素以及站点用户和我们对 SharePoint 站点页面所做的所有自定义更改。

为了备份 SharePoint 站点(包括内容数据库),我们需要使用 STSADM。以下是具体操作方法:

为了进行备份,

>stsadm –o backup 
    –url http://hostname:4548/ -filename "C:\\SiteBackup.dat" 
    –overwrite

用于恢复

>stsadm –o restore 
    –url http://hostname:4548/ -filename "C:\\SiteBackup.dat" 
    –overwrite

X

参考文献

X

结论

我希望这篇文章能帮助那些使用 Windows SharePoint Services 和 Office SharePoint Server 2007 开发自定义解决方案的人。

© . All rights reserved.