MOSS中WebPart开发简介
-
概述
-
WebPart生命周期.
当一个包含WebPart的WSS站点页面被响应请求或者是它被提交到Server端的时候,这时WebPart生存周期开始了
-
OnInit 初始化,加载相关配置文件 (如WebPart任务面板上的属性,样式等配置信息) .
-
LoadViewState 返回先前最后一次被处理的状态 (如webpart是展现,隐藏还是关闭)
-
CreateChildControls 创建WebPart UI ,通过Controls.Add()方法装载Web 控件 (Note:当Webpart是第一次展现的时候CreateChildControls方法发生在OnLoad方法之前,而经过一次postback之后,它发生在OnLoad方法之后)
-
OnLoad 从数据库或者其他系统重新获取要展现的数据 (如获取数据库连接)
-
User-Generated Events 响应用户生成事件 (如Button Click)
-
RendenContents 生成 html output,实现最终的UI展现 (由HTMLTextWriter class 来实现)
-
SaveViewState 保存控件状态 (ViewState 被序列化之后保存在一个hidden field 里)
-
Dispose 从内存中移除对象,释放临界资源 (如释放数据库连接)
-
OnUnLoad 最终完成内存清除工作
-
WebPart 关联
-
方法一: 一个WebPart的事件处理程序,把要传递的信息赋给别一个WebPart的属性,接收信息的WebPart通过此属性值来处理呈现.这二个WebPart必须在同一个页面上都要添加.
-
方法二: MOSS提供了一种专门的机制Web Part Connection,用于在WP之间传递数据.
SharePoint将要进行数据传递的WP分为两类:
Provider WP: 提供数据
Consumer WP: 接收数据
Web Part Connection 机制提供了一种松耦合的数据连接机制。Provider WP 和 Consumer WP都只用关心自己的实现即可,而不必关心数据的接收或提供者是谁,怎么去使用。
在部署之后,我们的页面上放置了Provider WP and Consumer WP, 这时候SharePoint机制会自动检测页面上所有Web Part 的类型,用数据通道把这俩种Web Part挂接起来,。如果发现某个Provider WP 所提供的数据正好可以被另外一个Consumer WP使用,那么管理员就可以在页面上直接将它们俩个连接起来。一个Provider WP 可被多个Consumer WP使用。通过数据通道,这样也就实现了Provider 和Consumer 之间的数据传递 。
-
-
-
开发步骤
-
首先用vs2008创建GetListWebPart的Class Library工程,右击工程属性为工程添加强名,打开工程的AssemblyInfo.cs文件添加 "using System.Security;" 命名空间与 "[assembly: AllowPartiallyTrustedCallers()]" 二行,为工程添加Microsoft.SharePoint和System.Web的引用.
-
添加文件ListWebPart的代码文件(也就是webpart一,主要用下拉列表列出二个LIST中的ITEM的TITLE),代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.SharePoint;
namespace GetListWebPart
{
public class ListWebPart:WebPart
{
protected DropDownList drpdownlist1;
protected DropDownList drpdownlist2;
public ListWebPart()
{
this.ExportMode = WebPartExportMode.All;
}
protected override void CreateChildControls()
{
drpdownlist1 = new DropDownList();
drpdownlist1.ID = "list1";
drpdownlist1.AutoPostBack = true;
drpdownlist1.DataSource = GetListItem("test1 list");
drpdownlist1.DataTextField = "Title";
drpdownlist1.DataValueField = "ID";
drpdownlist1.DataBind();
drpdownlist1.SelectedIndexChanged += new EventHandler(drpdownlist1SelectedIndexChanged);
this.Controls.Add(drpdownlist1);
drpdownlist2 = new DropDownList();
drpdownlist2.ID = "list2";
drpdownlist2.AutoPostBack = true;
drpdownlist2.SelectedIndexChanged += new EventHandler(drpdownlist2_SelectedIndexChanged);
drpdownlist2.DataSource = GetListItem("test2 list");
drpdownlist2.DataTextField = "Title";
drpdownlist2.DataValueField = "ID";
drpdownlist2.DataBind();
this.Controls.Add(drpdownlist2);
ChildControlsCreated = true;
//base.CreateChildControls();
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<table border='1' align='center' cellpadding='2' cellspacing='0' borderColor='gray' width='80%'>");
writer.Write("<tr><td colspan='2' align='center'>Weldon MOSS WebPart</td></tr>");
writer.Write("<tr><td align='center' > test1 list title:");
drpdownlist1.RenderControl(writer);
writer.Write("</td><td align='center'> test2 list title:");
drpdownlist2.RenderControl(writer);
writer.Write("</td></tr></table>");
//base.Render(writer);
}
void drpdownlist2_SelectedIndexChanged(object sender, EventArgs e)
{
//drpdownlist1.Items.Clear();
}
protected SPListItemCollection GetListItem(string listName)
{
//SPSite site = new SPSite("http://www.qsh.com:81/Docs/default.aspx");
SPSite site = SPContext.Current.Site;
SPWeb web = site.OpenWeb("Docs");
SPList list = web.Lists[listName];
SPListItemCollection items = list.Items;
return items;
}
void drpdownlist1SelectedIndexChanged(object sender, EventArgs e)
{
for (int i=0; i < WebPartManager.WebParts.Count; i++)
{
if (WebPartManager.WebParts[i].Title == "ListItemWebPart")
{
ListItemWebPart item = (ListItemWebPart)WebPartManager.WebParts[i];
SPSite site = SPContext.Current.Site;
SPWeb web = site.OpenWeb("Docs");
SPList list = web.Lists["test1 list"];
item.item = list.Items.GetItemById(Convert.ToInt32(drpdownlist1.SelectedValue));
}
}
}
}
}
-
添加ListItemWebPart的代码文件(WEBPART 二,当WEBPRTE 一的下拉选项变化时,负责呈现ITEM的具体信息)代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.SharePoint;
namespace GetListWebPart
{
public class ListItemWebPart:WebPart
{
public ListItemWebPart()
{
this.ExportMode = WebPartExportMode.All;
}
private SPListItem _item = null;
public SPListItem item
{
set { _item = value; }
get { return _item; }
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<table border='1' align='center' cellpadding='2' cellspacing='0' borderColor='gray' width='80%'>");
writer.Write("<tr><td colspan='100' align='center'>List Item Detail</td></tr>");
writer.Write("<tr>");
if (item == null)
writer.Write("<td>Please Select List Item in webpart</td>");
else
{
writer.Write("<td>" + item["Title"] + "</td>");
writer.Write("<td>" + item["DropList1"] + "</td>");
writer.Write("<td>" + item["drp2"] + "</td>");
writer.Write("<td>" + item["Created"] + "</td>");
writer.Write("<td>" + item["Author"] + "</td>");
}
writer.Write("</tr></table>");
}
}
}
-
部署
-
项目编译后把DLL放入MOSS站点所在文件夹中
"C:\Inetpub\wwwroot\wss\VirtualDirectories\www.qsh.com81\_app_bin"
-
打开Reflector查看GetListWebPart.dll 的Assembly信息(即Name后的内容)。
-
打开MOSS站点的WEB.CONFIG文件添加如下二行配置:
<SafeControl Assembly="GetListWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cbcb1fd6d083e9f7" Namespace="GetListWebPart" TypeName="ListWebPart" Safe="True" />
<SafeControl Assembly="GetListWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cbcb1fd6d083e9f7" Namespace="GetListWebPart" TypeName="ListItemWebPart" Safe="True" />
-
MOSS中添加,如下图:
进入站点设置,点Galleries -> Web Parts
点NEW.
选中我们之前创建的二个WEBPART,点Populate Gallery
返回,成功加入后如下:
打开要添加WEBPART的页面,点Edit Page,添加:
添加完成后如下:
-
-
(5) 调试
首先打开使用webPart的站点,再打开工程。依次点工程菜单上Debug -> Attach to Process。
在Attach to Process界面中可能出现几个w3wp.exe的进程,我们必须找到webPart站点对应的进程。这时进入命令行输入”iisapp”查看IIS6应用程序池所对应的进程ID,然后在选择正确的进程附加。
附加之后工程变成Debug状态,操作webPart页面,就可以进入工程中已设置断点的地方。