MOSS之六Web Part[转帖]

一个页面上将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.webSystem.drawing的命名空间。添加一个类文件WePartGid.cs
v注意:这个类需要从System.Web.UI.WebControls.WebParts.WebPart继承
v代码很简单,实例出一个DataGrid,并动态设置属性,够着数据源并绑定。最后创建子控件并且输出。

 

 
 
v编译成功后,打开VS2005→项目→Web PartProject属性
 
 
v把输入路径设定为9000端口应用程序端口下,目录一般在c:\Inetpub\wwwroot\wss\VirtualDirectories这个目录下根据端口创建的目录,然后在该目录下找到bin目录即可,当VS2005编译的时候,都会将程序集部署到这个目录中以方便调试。需要注意:如果该程序集部署到GAC,是需要强签名的。
 
v自定义属性
v为了让web part更加灵活,具有通用性。需要把一些公共的属性独立出来,比如网站URL、网站URL和列表名称,让用户自行选择或者设定。这需要在webpart中实现自定义的属性。
v新建工程项目,命名为CustProperties,工程类型请选择为webpart类型。这个很重要,否则菜单中没有自动部署解决方案选项。
 
 
v示例:CustProperties
 
 
自定义属性的标志说明 
属性
描述
Personalizable
标志一个属性是自定义属性
WebBrowsable
是否显示在属性编辑界面中
WebDisplayName
自定义属性的标题说明
WebDescription
自定义属性的描述
 
 
Category这个属性并不是MOSS专有的,而是ASP.NET中提供的。它的功能是将属性分组,使用之前需要引入using System.ComponentModel命名空间。
 
 
v编译没有问题后,直接单击菜单→部署解决方案,系统会将web part自动部署在MOSS站点中。部署成功后,新建一个页面,命名为test.aspx,编辑该页面,添加web部件,可以找到刚才部署的名为CustPropertieswebpart。在页面中,编辑CustProperties这个web部件。
v通过自定义属性,可以把一些功能全部做成
 
 

 
vWeb part 的提供和接收
vMOSS站点汇总,对一个页面来说,web part并不会一直存在于这个页面上,可能现在存在,过段时间将会被删除。所以,这导致在webpart开发中,无法硬编码去预先访问另一个webpart。为了解决这个问题,MOSS提供了一个叫做webpart连接(web Part Connection)的机制。
vMOSS中的web part分为两类,一类是数据提供的webpart(provider web part), 类是数据接收的webpartConsumer Web part).webpart连接机制提供的是一种松散耦合的数据连接机制。数据提供的webpart和数据接收的webpar只关心自己的实现即可。当它们需要连接时,通过webpart连接机制的标准接口连接起来,从而实现了数据的传递
webpart ,然后设定相应的属性就可以了。
 
 
 
v通过案例快速熟悉两种webpart的创建以及数据传递
v新建项目WebPartConnection,项目 类型为WebPart.新增两个WebPart类型的项一个命名为ProviderWebPart,一个命名为ConsumerWebPart.
vProviderWebPart中发送的方法中必须添加ConnectionProvider属性修饰
vConsumerWebPart中的接收方法必须添加ConnectionConsumer属性标志
 
 
 
v编译通过后,进行自动部署解决方案。之后把ProviderWebPartConsumerWebPart添加到test.aspx页面上,编辑ProviderWebPart的属性,在属性面板上的个性设置里输入一些内容
v然后再次编辑ProviderWebPart控件的属性,
v选择连接发送对象,此时系统会
v根据当前页面的所有webpart自动列举出能够
v接收数据的webpart,很显然只有ConsurmWebPart
 
 
 
 
 
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" />
 
 
 
vSafeControl节点的说明
 
标题
说明
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”/>
 
 
 
 
v然后把这段代码填入到Web.Config文件相应的SafeControl位置,之后保存。接下来单击网站操作网站设置 修改所有网站设置,打开界面

 
 
v单击Web部件,可以看到,系统内已经有很多的Web部件,其中,.dwp是为了更好地兼容以前WSS2.0下的web部件对象,.webpart则是WSS3.0提供的新的web部件对象。这两种类型的web部件在MOSS2007中都能够被很好地支持。
 
 
 
 
v单击新建,会打开所有已经注册地安全控件,找出刚才创建的名为WebPartProjectWebPart
 
 
 
 
 
选中WebPartProject.WebPartGid这个web部件,然后单击导入库按钮,此时web部件库界面上就能够看到创建的WebPart了,而且自动标记为新的
 
v接下来,将test.aspx页面切换到编辑页面模式,单击添加web部件,添加webpartgid控件。
 
 
 
 
 
v如果需要自动部署,在新建VS2005项目的时候必须在SharePoint节点下选择WebPart类型。当编译成功,部署解决方案。VS2005会在当前的工程的bin\debug录下,生成一些部署文件。
 
 
 
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
 
 
vMOSS页面上添加自己开发的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.exePID3512
v在附加进程的界面,很容易找到ID3512w3wp.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控件,IDmyGrid,可以对表格控件随意设计一些样式。打开后台代码页面,输入以下代码:
vprotected 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还可以充分利用以前的只是积累。
 
 
 
 
 
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控件,并且需要重写ApplyChangesSyncChangesCreateChildContorls等方法
v代码 TreeWebPart.cs

 

v新建SuperWebPart.cs类库,这个类需要从System.Web.UI.WebContorls.WebParts.WebPartIWebEditable接口继承
v示例代码:SuperWebPart
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。后台代码如下:
vSPWeb 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控件不支持自动生成数据列,所有的列需要在代码中声明,同时必须指AutoGenerateColumnsfalse
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示例11、创建用户控件命名为SearchBox.ascx
v2、创建feature
v3、部署
vSearchBox.ascx用户控件复制到
v“%CommonProgramFiles%\Microsoft Shared\Web server\extensions\12\template\controltemplates\目录下
原文地址:https://www.cnblogs.com/meiweijun/p/1613610.html