SharePoint Web 部件基础知识(第一部分)






3.24/5 (8投票s)
2006年4月4日
5分钟阅读

57163

179
一篇关于编程和部署 SharePoint Web 部件的文章
引言
我使用 Code Project 作为参考已经有好几年了,终于决定自己也贡献一些东西。我为 SharePoint 编写了一些 Web 部件组件大约两年了,虽然不是我经常做的事情,但我发现了一些意外的收获,我将与 Code Project 的读者分享。
一些 Microsoft SharePoint 文档不是很清晰,因此阐明这些是我写这篇文章的目标之一。我还决定,对于 Microsoft 程序员来说,Code Project 是网络上最好、最稳定、最显眼的资源之一,而 Code Project 到目前为止在 SharePoint 技术 Web 部件方面文章很少。这是我非常感兴趣的一个领域,所以我决定尽我所能来填补这个空白。
这篇文章会比较简短,因为我计划写一篇关于部署 Web 部件的配套文章,然后是一篇关于 Web 部件通信的文章。Web 部件通信功能是使 Web 部件组件开发真正有用的一个方面。
那么,与 SharePoint、Windows SharePoint Service 或 SharePoint Portal Services 相比,Web 部件是什么?
SharePoint 是一个运行在 IIS 中的门户包,它利用 ASP.NET 框架来实现其基本功能。因此,ASP.NET 开发人员是胜任 Web 部件开发角色的逻辑人选。Windows SharePoint Services 的开发受到了第一个Wiki,即Portland Pattern Repository的启发。
Web 部件组件编译为 .NET 库(.dll),并且需要一个 filename.dwp 文件才能成功部署到站点的 Web 部件库中。此外,如果您决定从头开始创建自己的 Web 部件,则需要添加一个 WP Manifest(Manifest.xml)和一个 web part dwp(filename.dwp)文件才能成功部署一个组件。如果您打算部署,您应该为您的 Web 部件解决方案添加一个新的 cab 文件项目。这样您就可以利用 staadm.exe 工具方便地进行部署。
背景(所需软件和环境)
必需
- Windows 2003 Server
- Windows SharePoint Services v2.0
- Visual Studio 2003
- Web 部件模板
可选(强烈推荐)
- Virtual PC
- VMWare 或 Virtual Server 2005(目前有免费版本可供下载)
链接:http://www.microsoft.com/windowsserversystem/virtualserver/default.mspx
代码方面
WebPartRender
和 CreateChildControls
方法是 SharePoint 中生成输出的关键。如果不使用它们或错误地使用它们,您将在首次部署后一无所获。
Web 部件利用 output.Write("");
和 ControlName.RenderControl(output);
方法来渲染 html/文本以及 WebControls
。CreateChildControls
方法可用于实例化 WebControls
以及特定 WebControl 的任何属性。WebPartRender
方法最常用于 html 和文本输出格式化,但也是生成控件输出所必需的。
Web 部件需要引用 SharePoint 库才能工作(参见下面的代码)。其他引用应根据您可能想要或需要开发的 Web 部件的扩展功能添加。所有 Web 部件都需要一个配套的 .dwp 文件才能在站点 Web 部件库中可见。一个良好或有用的 Web 部件的大部分构成对于任何 ASP.NET 开发人员来说都将是熟悉的。
//Sample Code
using System;
using System.ComponentModel;
using System.Data;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using System.Security;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.WebPartPages;
namespace AKWebPart
{
/// <summary>
/// Description for AKWebPart.
/// Simple Web Part
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:AKWebPart runat=server></{0}:AKWebPart>"),
XmlRoot(Namespace="AKWebPart")]
[GuidAttribute("5623DE5D-A636-4831-AFA0-6ED54F2A4A25")]
public class AKWebPart : Microsoft.SharePoint.WebPartPages.WebPart
{
//Quick Note: The names for the textboxes used are geared
//towards connecting to the northwind sample database
private System.Web.UI.WebControls.TextBox TextBoxID;
private System.Web.UI.WebControls.TextBox TextBoxLastName;
private System.Web.UI.WebControls.TextBox TextBoxFirstName;
private System.Web.UI.WebControls.TextBox TextBoxAddress;
private System.Web.UI.WebControls.TextBox TextBoxCity;
private System.Web.UI.WebControls.TextBox TextBoxRegion;
private System.Web.UI.WebControls.TextBox TextBoxCountry;
private System.Web.UI.WebControls.Button connectButton;
/// <summary>
/// Render this control to the output parameter specified.
/// </summary>
/// <param name="output"> The HTML writer to write out to </param>
protected override void RenderWebPart(HtmlTextWriter output)
{
output.Write("<table border=0 id='EmpTable' bgcolor='#DFDFDF/'>");
output.Write("<fieldset dir='ltr' id='DataFieldset'
style='border-style:solid; border-width:1px;
width: 623px; height: 404px; padding-left:4px;
padding-right:4px; padding-top:1px; padding-bottom:1px'>
<legend><font face='Arial'>Data Fields</font></legend>");
output.Write("<tr><td>");
output.Write("</td><td> </td><td> </td></tr>");
output.Write("<tr><td>");
TextBoxID.RenderControl(output);
output.Write("</td><td>");
TextBoxLastName.RenderControl(output);
output.Write("</td><td>");
TextBoxFirstName.RenderControl(output);
output.Write("</td></tr><tr><td>");
TextBoxAddress.RenderControl(output);
output.Write("</td><td>");
TextBoxCity.RenderControl(output);
output.Write("</td><td>");
TextBoxRegion.RenderControl(output);
output.Write("</td></tr><tr><td>");
TextBoxCountry.RenderControl(output);
output.Write("</td><td>");
connectButton.RenderControl(output);
output.Write("</td><td> </td></tr>");
output.Write("</fieldset></table><br>");
}
protected override void CreateChildControls()
{
TextBoxID = new TextBox();
TextBoxID.ID = "TextBoxID";
TextBoxID.Text = "0";
TextBoxLastName = new TextBox();
TextBoxLastName.ID = "TextBoxLastName";
TextBoxFirstName = new TextBox();
TextBoxFirstName.ID = "TextBoxFirstName";
TextBoxAddress = new TextBox();
TextBoxAddress.ID = "TextBoxAddress";
TextBoxCity = new TextBox();
TextBoxCity.ID = "TextBoxCity";
TextBoxRegion = new TextBox();
TextBoxRegion.ID = "TextBoxRegion";
TextBoxCountry = new TextBox();
TextBoxCountry.ID = "TextBoxCountry";
connectButton = new Button();
connectButton.ID = "ConnectButton";
connectButton.Text = "Submit";
Controls.Add(TextBoxID);
Controls.Add(TextBoxLastName);
Controls.Add(TextBoxFirstName);
Controls.Add(TextBoxAddress);
Controls.Add(TextBoxCity);
Controls.Add(TextBoxRegion);
Controls.Add(TextBoxCountry);
Controls.Add(connectButton);
connectButton.Click +=new EventHandler(CellButtonClicked);
}
private void CellButtonClicked(object sender, EventArgs e)
{
//Non Functional here but it does fire a postback event
}
}
}
下面是 filename.dwp 的基本语法,此处为 AKWebPart.dwp。Assembly 标签基本上引用了组件的命名空间。
<!-Sample dwp file-->
<?xml version="1.0" encoding="utf-8"?>
<WebPart xmlns="http://schemas.microsoft.com/WebPart/v2" >
<Title>AK Web Part</Title>
<Description>A silly little demonstration Web Part</Description>
<Assembly>AKWebPart</Assembly>
<TypeName>AKWebPart.AKWebPart</TypeName>
<!-- Specify initial values for any additional base
class or custom properties here. -->
</WebPart>
<!--Sample Manifest.xml file-->
<?xml version="1.0"?>
<!-- You need only one manifest per CAB project for Web Part Deployment.-->
<!-- This manifest file can have multiple assembly nodes.-->
<WebPartManifest xmlns="http://schemas.microsoft.com/WebPart/v2/Manifest">
<Assemblies>
<Assembly FileName="AKWebPart.dll">
<!-- Use the <ClassResource> tag to specify resources like image files
or JScript files that your Web Parts use. -->
<!-- Note that you must use relative paths when
specifying resource files. -->
<!--
<ClassResources>
<ClassResource FileName="Resource.jpg"/>
</ClassResources>
-->
<SafeControls>
<SafeControl
Namespace="AKWebPart"
TypeName="*"
/>
</SafeControls>
</Assembly>
</Assemblies>
<DwpFiles>
<DwpFile FileName="AKWebPart.dwp"/>
</DwpFiles>
</WebPartManifest>
关注点
部署 Web 部件的最简单方法是使用 stsadm.exe 工具。使用 STSADM 可以自动完成一些原本需要手动完成的任务。STSADM 会自动为您设置 Web 部件的适当信任级别。如果您手动完成,您将需要在多个位置进行多项操作才能使您的 Web 部件正常工作。首先, SharePoint 站点的文件系统根目录下的物理文件 web.config 需要为该组件添加一个条目。
例如:在 web.config c:\inetpub\wwwroot\web.config 的 safecontrols 部分,您需要添加如下条目。
<safecontrols>
<SafeControl Assembly="AKWebPart, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=f1840a0873385597"
Namespace="AKWebPart" TypeName="*" Safe="True" />
</safecontrols>
接下来,您需要将您的 dll 安装在主 Web 站点的 bin 目录中,并将 .dwp 文件安装在 wpcatalog 目录中。这些是位于标准 Web 站点文件目录中的物理目录。
stsadm.exe 通常位于 c:\Program Files\Microsoft Shared\web server extensions\60\bin。
主 web.config 文件位于主 SharePoint Web 站点的物理根目录。假设 SharePoint 已安装为根站点,则位置应为 c:/inetpub/wwwroot/web.config.。
Web 部件部署的关键组件的主要位置是文件位置
c:\inetpub\wwwroot\bin 和 c:\inetpub\wwwroot\wpcatalog
bin 位置包含 Web 部件部署的 dll,wpcatalog 位置包含 .dwp 文件,该文件提供在 Web 部件库中显示的 XML 数据。
您可以通过将相应的文件安装到上述命名目录中来手动安装 Web 部件,但我真的不推荐这样做。
有关 SharePoint 的更多信息,请阅读 CodeProject 上的这篇文章:
https://codeproject.org.cn/spoint/EssentialWSSSPS2003Archit.asp
历史
- 到目前为止的版本一,除非我看到错误或有人提出更正。
- 已添加第二部分 Web 部件部署。您可以在此处查看。