一个页面上将web部件从一个地方拖放到另外一个地方,从而简单方便地实现界面定制工作。由于webpart本身是独立存在的,所以,开发人员可以专心地去实现webpart本身的业务逻辑代码
在Asp.NET2.0中,可以开发出被MOSS2007使用的web part,这个web part从System.Web.UI.WebControls.WebParts继承。从System.Web.UI.WebControls.WebParts继承的WebPart,我们称作是ASP风格的Webpart。这种webpart既可以用在ASP.NET站点中,也能用在MOSS站点中。MOSS中推荐使用ASP的webpart
MOSS本身提供了很多开箱即用的webpart,如内容编辑部件、搜索部件、图片部件等。
v
创建一个简单的
webpart
v
打开
vs2005,
创建一个类库项目,名为
webpartProject
,引用
System.web
、
System.drawing
的命名空间。添加一个类文件
WePartGid.cs
v
注意:这个类需要从
System.Web.UI.WebControls.WebParts.WebPart
继承
v
代码很简单,实例出一个
DataGrid
,并动态设置属性,够着数据源并绑定。最后创
建子控件并且输出。
v
编译成功后,打开VS2005
→项目→Web PartProject
属性
![](https://i-blog.csdnimg.cn/blog_migrate/280be1dbfc897385cee15c80ab6cb1c6.jpeg)
v
把输入路径设定为9000
端口应用程序端口下,目录一般在c:\Inetpub\wwwroot\wss\VirtualDirectories
这个目录下根据端口创建的目录,然后在
该目录下找到bin
目录即可,当VS2005
编译的时候,都会将程序集部署到这个目录中
以方便调试。需要注意:如果该程序集部署到GAC
,是需要强签名的。
v
自定义属性
v
为了让web part
更加灵活,具有通用性。需要把一些公共的属性独立出来,比如网站
集URL
、网站URL
和列表名称,让用户自行选择或者设定。这需要在webpart
中实现
自定义的属性。
v
新建工程项目,命名为CustProperties
,工程类型请选择为webpart
类型。这个很重
要,否则菜单中没有自动部署解决方案选项。
自定义属性的标志说明
属性
|
描述
|
Personalizable
|
标志一个属性是自定义属性
|
WebBrowsable
|
是否显示在属性编辑界面中
|
WebDisplayName
|
自定义属性的标题说明
|
WebDescription
|
自定义属性的描述
|
Category
这个属性并不是MOSS
专有的,而是ASP.NET
中提供的。它的功能是将属性分组,使用之前需要引入using System.ComponentModel
命名空间。
v
编译没有问题后,直接单击菜单→部署解决方案,系统会将web part
自动部署在MOSS
站点中。部署成功后,新建一个页面,命名为test.aspx
,编辑该页面,添加web
部件,可以找到刚才部署的名为CustProperties
的webpart
。在页面中,编辑CustProperties
这个web
部件。
v
通过自定义属性,可以把一些功能全部做成
![](https://i-blog.csdnimg.cn/blog_migrate/a5f03f2738702d4d390fb2b9a6705223.jpeg)
v
Web part
的提供和接收
v
在MOSS
站点汇总,对一个页面来说,web part
并不会一直存在于这个页面上,可能
现在存在,过段时间将会被删除。所以,这导致在webpart
开发中,无法硬编码去预
先访问另一个webpart
。为了解决这个问题,MOSS
提供了一个叫做webpart
连接(web Part Connection)
的机制。
v
在MOSS
中的web part
分为两类,一类是数据提供的webpart(provider web part),
一
类是数据接收的webpart
(Consumer Web part).webpart
连接机制提供的是一种松散
耦合的数据连接机制。数据提供的webpart
和数据接收的webpar
只关心自己的实现即
可。当它们需要连接时,通过webpart
连接机制的标准接口连接起来,从而实现了数
据的传递
webpart
,然后设定相应的属性就可以了。
v
通过案例快速熟悉两种webpart
的创建以及数据传递
v
新建项目WebPartConnection,
项目
类型为WebPart.
新增两个WebPart
类型的项一个
命名为ProviderWebPart,
一个命名为ConsumerWebPart.
vProviderWebPart
中发送的方法中必须添加ConnectionProvider
属性修饰
vConsumerWebPart
中的接收方法必须添加ConnectionConsumer
属性标志
v
编译通过后,进行自动部署解决方案。之后把ProviderWebPart
和ConsumerWebPart
添加到test.aspx
页面上,编辑ProviderWebPart
的属性,在属性
面板上的
“
个性设置
”
里输入一些内容
v
然后再次编辑ProviderWebPart
控件的属性,
v
选择
“
连接
”
→
“
发送对象
”
,此时系统会
v
根据当前页面的所有webpart
自动列举出能够
v
接收数据的webpart
,很显然只有ConsurmWebPart
![](https://i-blog.csdnimg.cn/blog_migrate/c16481d9ef7ef7f1ee66a30d78695feb.jpeg)
v
手工部署
v
打开c:\Inetpub\wwwroot\wss\VirtualDirectories\9000\
目录下的Web.Config
文件,修
改之前先备份。打开文件,找到类似这样的一些代码。
v <SafeControl Assembly="Microsoft.SharePoint.Search, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.Search.WebControls" TypeName="*" Safe="True" AllowRemoteDesigner="True" />
v
SafeControl
节点的说明
标题
|
说明
|
Assembly
|
程序集的信息
|
Version
|
版本号
|
Culture
|
区域性值
|
PublicKeyToken
|
公钥标记
强签名后会产生
|
Namespace
|
命名空间
|
TypeName
|
类名
|
Safe
|
安全标志
|
v
凡是部署到站点中的Web Part
都需要按照这段代码在Web.Config
中注册为一个安全
控件。如何能够得到Web Part
的上述信息?通过反射工具可以获取已经编译后的程
序集的信息,需要下载一个小工具,推荐使用Reflector
。把程序集WebPartProject
拖入到界面中即可。
v
根据获取的程序集信息创建代码
v<SafeControl
vAssembly=“WebPartProject,
vVersion=1.0.0.0,Culture=neutral,
vPublicKeyToken=null
”
vNamespace=
“WebPartProject
”
vTypeName=
“*
”
vSafe=“True”/>
![](https://i-blog.csdnimg.cn/blog_migrate/6bb80f87822e260b34df70a5897b5f29.jpeg)
v
然后把这段代码填入到Web.Config
文件相应的SafeControl
位置,之后保存。接下来
单击
“
网站操作
”
→
“
网站设置
”
→
“
修改所有网站设置
”
,打开界面
![](https://i-blog.csdnimg.cn/blog_migrate/c9109aa9ea68ec3395e720a80cf5ad56.jpeg)
v
单击
“Web
”
部件,可以看到,系统内已经有很多的Web
部件,其中,.dwp
是为了更好
地兼容以前WSS2.0
下的web
部件对象,.webpart
则是WSS3.0
提供的新的web
部件对
象。这两种类型的web
部件在MOSS2007
中都能够被很好地支持。
![](https://i-blog.csdnimg.cn/blog_migrate/9c559a9339775711df5c05b32d54fff8.jpeg)
v
单击
“
新建
”
,会打开所有已经注册地安全控件,找出刚才创建的名为WebPartProject
的WebPart
![](https://i-blog.csdnimg.cn/blog_migrate/a8f5e76c46d0f583c899107a29e7dc81.jpeg)
选中WebPartProject.WebPartGid
这个web
部件,然后单击
“
导入库
”
按钮,此时web
部件库界面上就能够看到创建的WebPart
了,而且自动标记为新的
v
接下来,将test.aspx
页面切换到编辑页面模式,单击
“
添加web
部件
”
,添加webpartgid
控件。
![](https://i-blog.csdnimg.cn/blog_migrate/a3ac4342418c481b5fbc3451ff11741e.jpeg)
v
如果需要自动部署,在新建VS2005
项目的时候必须在SharePoint
节点下选择WebPart
类型。当编译成功,部署解决方案。VS2005
会在当前的工程的bin\debug
目
录下,生成一些部署文件。
![](https://i-blog.csdnimg.cn/blog_migrate/109aca869e502eeded9eed5af37d2e03.jpeg)
v
部署到
GAC
vGAC
是全局程序集缓存的缩写,GAC
是计算机范围内的代码缓存,它存储专门安装
的程序集,这些程序集由计算机上的许多应用程序共享。在全局程序集缓存中部署
的应用程序必须具有强名称。
v
部署到GAC
有两种方式
v1
、直接把程序集拖放到c:\windows\assembly
目录下,即可部署
v2
、使用命令行,假设有个叫CommandEventhandler.dll
v
卸载命令
vD:\program files\microsoft visual studio 8\sdk\v2.0\bin\gacutil.exe” –uf commonEventHandler
v
部署命令
vD:\program files\microsoft visual studio 8\sdk\v2.0\bin\gacutil.exe” –if
vBin\debug\commandeventhandler.dll
v
在MOSS
页面上添加自己开发的Web Part
,有时间会报错,MOSS
系统提示错误信
息很不友好,只能用VS2005
来调试。
v
将在VS2005
中创建的Web Part
项目后,需要附加到W3WP.exe
这个进程中来调试。
首先代码段中设置断点,然后单击
“
调试
”
→
“
附加到进程
”
v
打开界面发现很多w3wp.exe
进程,有时候甚至有7~8
个进程,到底选哪个?
v
选择
“
开始
”
→
“
程序
”
→
“Microsoft Visual Studio 2005
”
→
“Visual Studio Tools”
→
“Visual Studio 2005
”
命令提示,输入iisapp
命令,这个命令第一次运行可能会提示
系统要写入注册表之类的信息,确定即可。这个命令会列出当前站点使用的w3wp.exe
进程,其中可以看到9000
端口网站的w3wp.exe
的PID
是3512
v
在附加进程的界面,很容易找到ID
为3512
的w3wp.exe
进程,然后附加该进程即可。
附加进程后的VS2005
自动处于运行状态。然后打开我的日常工作这个页面,刷新后
则会切换VS2005
的调试状态,这样就能调试了。
v
从之前的例子中可以看出,开发一个webpart
还是很困难的,在开发过程中,无法看
到可视化界面,完全是由代码写出来的,包括控件、样式、属性、事件等。
v
所以,这种开发方式很容易造成页面出错及崩溃。假如页面的要求复杂,如对页面
的美工要求很高的话,那么web part
的开发将会更加困难。
v
如果能把以前的用户控件(.ascx)
或者页面文件(.aspx
)能够直接嵌入在MOSS
页面
中,就能够加快程序的开发。
v
这就需要一个能容纳用户控件的webpart
,这样只需要做简单的设定,就能将已经做
好的控件包含进来,供系统使用。
用户控件包装器
QuickPart
vQuickPart
是一个国人编写的用户控件包装器。首先将QuickPart
进行部署
v
打开Web.Config
文件,将QuickPart
这个Web Part
控件作为安全控件进行部署。将下
面的代码添加到Web.Config
相应的SafeControl
区域中。
v<SafeControl Assembly="QuickPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2d0bb71b2dd16f9e" Namespace="Microsoft.PRC.SharePoint" TypeName="*" Safe="True"/>
v
注意:需要将Web.Config
文件中的<trust level=“WSS_Minimal” originUrl=“”/>
v
改为<trust level=
“Full
” originUrl=
“”/>
来提高信任级别。
v
同时将QuickPart.dll
复制到C:\Inetpub\wwwroot\wss\VirtualDirectories\9000\bin
目录
下,或者全局GAC
目录。然后单击
“
网站操作
”
→
“
网站设置
”
→
“
修改所有网站设置
”
,
添加Web
部件,单击
“
新建
”
按钮,在打开页面中,找到打钩的这两项。QuickPart
有
提供和接收两个控件,请全部选择。
最后单击
“
导入库
”
按钮即可。
接下来,重点讲解如何具体使用这个用户控件包装器。打开首页→网站操作→编辑网页,然后单击
“
添加Web
部件
”
,在打开的页面中,选择ProviderQuickPart
,单击
“
添加
”
按钮即可。
v
打开VS2005
,新建一个Web
工程,命名为GridViewWebPart
,添加一个用户控件,
命名为
“GridView.ascx
”
,在页面上拖入一个GridView
控件,ID
为myGrid
,可以对表
格控件随意设计一些样式。打开后台代码页面,输入以下代码:
v
protected void Page_Load(object sender, EventArgs e)
v
{
v
DataTable dt = GetData();
v
myGrid.DataSource = dt;
v
myGrid.DataBind();
v
}
private DataTable GetData()
{
DataTable dt = new DataTable("item");
DataColumn dc;
dt.Columns.Add("ID");
dt.Columns.Add("
项目
");
dt.Columns.Add("
创建时间
");
DataRow dr;
for (int i = 0; i < 10; i++)
{
dr = dt.NewRow();
dr["ID"] = i;
dr["
项目
"] = "
这是第
" + i + "
个项目
";
dr["
创建时间
"] = DateTime.Now;
dt.Rows.Add(dr);
}
return dt;
}
v
编译通过后,把生成的程序集bin\GridViewWebPart.dll
复制到C:\Inetpub\wwwroot\wss\VirtualDirectories\9000\bin
目录下。然后再将GridView.ascx
文件复制到c:\Inetpub\wwwroot\wss\VirtualDirectories\wpresourcecs
目录下
v
到此为止,用户控件的部署完成。
vQuickPart
添加到页面上效果
v
单击
“
编辑
”
→
“
修改共享Web
部件
”
,在页面右下角打开一个对话框,这个控件提供了
一个属性:User Contorl List,
在这个下拉框中,可以找到GridView
用户控件,选中即
可。同时将
“
标题
”
设定为
“
表格数据
”
,然后单击
“
确定
”
按钮
v
效果下页
v
可以看到,使用用户控件进行开发部署比起
v
之前使用WebPart
的开发部署来说,
v
方便简单是显而易见的,而且不容易出错
v
还可以充分利用以前的只是积累。
![](https://i-blog.csdnimg.cn/blog_migrate/05bce74bdcca30785360e34ef31defc1.jpeg)
v
完全可以自己写一个用户控件包装器来代替QuickPart
。通过编写自定义用户控件包
装器来学习一些Web Part
开发的高级知识。
v
打开VS2005
,新建一个项目,命名为SuperWebPart
,项目类型选择Web Part
。在
这个项目中,同样会把最终发布的所有的用户控件文件放到站点目录下的wpresource
目录中,当编辑这个用户控件包装器时,能够出现下拉框进行用户控件
的选择,。而不是默认指定某一个用户控件,从而极大增强包装器的通用性
v
在编辑WebPart
,如果是属性面板能出现一个选择用户控件的下拉列表框
v
新建一个TreeWebPart.cs
的类库文件,这个类需要从System.Web.UI.WebControls.WebParts.EditorPart
这个编辑部件类继承,这个类用
于编辑System.Web.UI.WebContorls.WebParts.WebPart
控件,并且需要重写ApplyChanges
、SyncChanges
、CreateChildContorls
等方法
v
新建SuperWebPart.cs
类库,这个类需要从System.Web.UI.WebContorls.WebParts.WebPart
和IWebEditable
接口继承
v
从代码中可以看到usercontorl=(UserContorl)Page.LoadContorl(@”/wpresources/”+this.Url);
vContorls.Add(usercontorl);
在属性界面选择用户控件的名称后,这个Webpart
运行时
会自动加载用户控件。其中Url
属性是在ApplyChanges
方法通过下拉列表进行赋值的
。
v
需要说明的是,用户控件文件需要放在c:\Inetpub\wwwroot\wss\Virtual Directories\9000\wpresources
目录下
v
把程序集SuperWebPart.dll
放到c:\Inetpub\wwwroot\wss\Virtual Directories\9000\bin
目录下,这样,SuperWebPart
就开发完了。
v
在
系统中,大量地用到了列表,列表按照表格方式展现,同时列表还能进行分
组、筛选、排序等操作。
vASP.NET2.0
操作提供了强大的GridView
来构建应用程序。在MOSS
中,提供了一个SPGridView
控件,这个控件继承于GridView
,并增加了很多扩展。MOSS
中看到得
列表就是这个SPGridView
控件生成的。
vSPGridView
的声明代码如下:
v<%@ Register Assembly=“Microsoft.SharePoint,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e94929c
” Namespace=
“Microsoft.SharePoint.WebControls
”
vTagPrefix=“SharePoint” %>
v<SharePoint:SPGridView ID=“SPGridView1” runat=“server” AutoGenerateColumns=
“False
” AllowPaging=
“True
” PageSize=
“10
”>
<AlternatingRowStyle CssClass=“ms-alternating”/>
<SelectedRowStyle CssClass=“ms-selectednav” Font-Bold=“True”/>
</SharePoint:SPGridView>
v
本示例主要完成SPGridView
控件的分页、过滤、数据绑定等操作。代码使用了一个SPDataSource
数据对象。这个对象有一个SPList
属性,从列表对象中得到list
对象,
赋值即可。SPGridView
控件绑定采用了DataSourceID
的方式,所以需要设定SPDataSource
数据对象的ID
属性。
v
新建用户控件SPGridView.ascx
。后台代码如下:
v
SPWeb web;
v
SPDataSource odsDataSource;
v
protected void Page_Load(object sender, EventArgs e)
v
{
v
web = SPControl.GetContextWeb(Content);
v
SPList list = web.Lists("case");
v
odsDataSource = new SPDataSource();
v
odsDataSource.ID = "ExampleSource";
v
Controls.Add(odsDataSource);
v
odsDataSource.List = list;
v
}
vSPGridView
控件不支持自动生成数据列,所有的列需要在代码中声明,同时必须指
定AutoGenerateColumns
为false
v//
添加字段
v
SPBoundField col = new SPBoundField();
v
col.DataField = "
标题";
v
col.SortExpression = "
标题";
v
col.HeaderText = "
标题";
v
SPGridView1.Columns.Add(col);
v
col = new SPBoundField();
v
col.DataField = "
状态";
v
col.SortExpression = "
状态";
v
col.HeaderText = "
状态";
v
SPGridView1.Columns.Add(col);
v
本示例主要对SPGridView
控件中的列增加下拉菜单以及参数传递等操作。
v
新建SPGridViewMenu.ascx
用户控件,添加一个SPMenuField
类型的字段,设定列
头和现实数据的字段。
v //
添加下拉菜单字段
v
SPMenuField colMenu = new SPMenuField();
v
colMenu.HeaderText = "
带下拉菜单的标题";
v
colMenu.TextFields = "
标题";
v
//
指定关联的菜单ID
v
colMenu.MenuTemplateId = "CustomsMenu";
v
colMenu.NavigateUrlFields = "
标题";
v
colMenu.NavigateUrlFormat = "action.aspx?key={0}";
v
colMenu.TokenNameAndValueFields = "name=
标题";
v
对程序员来说,使用包装器包装用户控件开发很方便。在c:\program files\common Files\Microsoft Shared\web server extensions\12\template\controltemplates
这个目
录下,发现很多系统用户控件,如欢迎的用户控件、网站操作的用户控件,MOSS
是如何调用这些用户控件的呢?答案就是DelegateControl
这个服务端控件,该控件
从SharePoint.WebControls
下继承。
v
示例1
:1
、创建用户控件命名为SearchBox.ascx
v2
、创建feature
v3
、部署
v
将SearchBox.ascx
用户控件复制到
v
“%CommonProgramFiles%\Microsoft Shared\Web server\extensions\12\template\controltemplates\
”
目录下