配色: 字号:
WebPartForSharePoint
2013-08-30 | 阅:  转:  |  分享 
  


1

本文描述了针对MicrosoftOfficeSharePointServer2007的WebPart的开发

环境的搭建。开发环境使用的操作系统为Windows2003SP1以上,并安装了

WindowsSharePointService3.0。

2环境搭建

2.1安装VisualStudio2005

MOSS的WebPart开发必须使用VisualStudio的2005版本,试验是用的是Team

版,根据网上的调查,专业版本就可以满足要求。

2.2安装sdk

开发WebPart,需要安装SharePointService3.0的软件开发包。可以从以下

地址获得:

http://download.microsoft.com/download/e/2/b/e2b1d36c-ca25-4860-aedf-

8eea2314637f/WssSDK.exe

因为本次开发的目标环境是MOSS,所以建议安装MOSS的开发包,其中也包含了

SharePointService3.0软件开发包的内容。可以从以下地址获得:

http://download.microsoft.com/download/5/c/3/5c3a0634-2f0c-4761-958e-

7fd93bf8ee30/OfficeServerSDK.exe

2.3安装扩展

VisualStudio2005默认的开发环境,是不支持MOSS类型的开发的,需要安装

扩展的软件包。可以从下面的地址获得:

http://download.microsoft.com/download/e/8/a/e8aa8476-5af6-4f38-aed2-

0247a99d2bc6/VSeWSS.exe

因为该软件包的安装,会检测环境中是否存在WSS,所以,要求开发环境的机器

必须安装WSS。

如果不安装该扩展包,将无法创建和使用WebPart类型的工程。

如果希望开发工作流的应用,还可以安装工作流的扩展软件包,可以从下面的地

址获得。

说明

http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=

zh-cn&SrcCategoryId=&SrcFamilyId=5d61409e-1fa3-48cf-8023-e8f38e709ba6

&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f7%2fe%2f4%2f7e466

ca4-9e63-4224-8c0f-15cab044f769%2fVisual+Studio+2005+Extensions+for+W

indows+Workflow+Foundation+(CHS).exe

对于WebPart的开发,这不是必须的。

2.4建工程,写代码

WebPart项目的代码,可以参考以下地址的文章中的内容。

http://blog.csdn.net/downmoon/archive/2005/06/17/396481.aspx

http://blogs.officezealot.com/mauro/archive/2006/05/04/9772.aspx

2.5修改assembly.cs文件。

在部署前,需要修改assembly文件,增加以下两句:

usingSystem.Security;

[assembly:AllowPartiallyTrustedCallers]

如果不进行以上修改,在安装WebPart时,会提示失败。

2.6复制文件

将编译后的Dll复制到Web应用程序目录下的bin目录下。Web应用程序的文件

夹位置类似以下路径:

C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin。

2.7修改web.config

WebPart使用前,需要修改Web应用程序的配置文件。

(1)增加SafeControls中增加一行,类似下面的写法。


TypeName=""Safe="True"AllowRemoteDesigner="True"/>

(2)修改信任级别。

改为
level="WSS_Medium"originUrl=""/>

也可以将WSS_Medium改为Full。

也可以参考下面地址进行修改,但是其中的方法主要针对SPS2003,在MOSS中

需要参考设置。

http://xivi.cnblogs.com/archive/2005/02/17/105323.html

http://xgp1226.blogdriver.com/xgp1226/598244.html

2.8在网站中增加webpart

使用具有管理权限的帐户登录网站,在“网站操作”中选择“网站设置”,如下

图。



在网站设置的页面中,选择Web部件,如下图。



在Web部件页面选择“新建”,如下图。



在新建Web部件页面中,根据名称,选择要导入的Web部件。



完成以上操作,就将web部件导入到Web应用程序的部件库中,下一步就可以在

网站中使用该部件。

2.9在页面添加WebPart

在准备使用WebPart的页面中,选择编辑页面,如下图。



页面进入编辑模式后,选择一个Web部件区域,点击“添加Web部件”,如下图。



在添加Web部件的页面中,选择要使用的Web部件,如下图。



如果需要进行更多的设置,可以在添加Web部件后,编辑Web部件,如下图。



2.10注意事项

1WebPart中的程序必须进行错误处理,不能将异常抛出到页面上,会造成整个

页面的错误。

2开发WebPart的机器是否一定需要安装WSS,目前还没有确定。也有通过添加

引用的方式来构建WebPart工程的。这种方法是否可以,还没有验证,地址如下,

供参考。

http://www.cnblogs.com/Sunmoonfire/archive/2006/11/08/554206.html

3默认的情况下,WebPart的开发时没有可视化的设计的,如果希望使用可视化

的开发方法,需要使用第三方的包装器,对可视化的ASP.NET用户控件进行包装。





调试方法

3.1本机调试

第一步:设置断点

1修改WebPart工程的输出路径设置为Web应用程序的bin目录。

2确认WebPart的名字已经被加入到SafeControls的内容中。

3增加断点。

第二步:附加到ASP.Net工作进程(w3wp.exe)

1在VS的“调试”菜单中,选择“附加到进程”。如下图。



2在对话框中选择w3wp.exe进程。如下图。



如果存在多个w3wp.exe进程,需要确认其中哪一个是目前调试的Web应用程序

使用的,可以使用刷新网页,通过任务管理器查看CPU运行情况的方法来确定是

那个进程。

3选择附加,就可以进入调试状态。

3.2远程调试

远程调试需要使用活动目录的管理方式,主要是因为调试ASP.NET程序,需要比

较高的权限,不验证身份的远程调试方式无法达到这个要求。

第一步:设置断点

1修改WebPart工程的输出路径设置为远程Web应用程序的bin目录。

2确认WebPart已经的名字已经被加入到SafeControls的内容中。

3增加断点。

第二步:启动远程调试服务

在运行WebPart的远程服务器上安装VisualStudio远程调试工具,并运行远程

调试监视器。如下图。



远程调试工具可以在VS2005的安装光盘中\vs\Remote

Debugger\x86\rdbgsetup.exe。

第三步:附加到ASP.Net工作进程(w3wp.exe)

1在VS的“调试”菜单中,选择“附加到进程”。如下图。



2在对话框中修改限定符,内容参考MOSS\Administrator@TFS的写法,格式为

域\用户名@机器名。如下图。



3在列出的进程中选择w3wp.exe进程。如果存在多个w3wp.exe进程,需要确认

其中哪一个是目前调试的Web应用程序使用的,可以使用刷新网页,通过任务管

理器查看CPU运行情况来确定是哪个进程。

4选择附加,就可以进入调试状态。

4附录

关于WebPart的开发,有三种方式的选择。

如果需要使用MOSS的接口,需要从MOSS的WebPart的基类继承。

如果不需要使用MOSS的接口,而需要使用ASP.NET的WebPart功能,可以从

ASP.NET的WebPart继承。

如果不属于以上两种,可以借助QuickPart引用UserControl的方法来实现。

QuickPart的相关链接如下:

http://www.codeplex.com/quickpart

这三种方式,都可以使用MOSS的对象模型来进行开发,主要的选择在于接口和

可视化的需求。

由于在asp.net1.1的时候asp.net中还没有webpart的概念,所以在sps2003

中的webpart都是依赖于Microsoft.SharePoint.dll的,必须继承自命名空间

为Microsoft.SharePoint.WebPartPages下的基类。到了asp.net2.0,asp.net

将sharepoint的webpart集成到asp.net框架中,新的ASP风格WebPart依赖

于System.Web.dll,继承自不同的一个由ASP.NET2.0定义的WebPart基类,

其命名空间为System.Web.UI.WebControls.WebParts。在moss中推荐使用

asp.net2.0的webpart。

在一个ASP.NET2.0的应用中使用WebPart,我们必须创建一个.aspx页面并包

括一个WebPartManager控件和至少一个WebPartZone控件。在MOSS中的WebPart

是架构在一个名为SPWebPartManager的控件基础上的,他重写了asp.net中的

WebPartManager的许多标准方法,同样WebPartZone我们也需要使用

Microsoft.SharePoint.WebPartPages命名空间下的,这些其实都已经在默认的

母版页都中了。

MOSS本身也提供了很多开箱即用的WebPart,例如ConentEditorWebPart,Data

viewWebPart,ListViewWebPart,ImageWebPart,MembersWebPart,Pageviewer

WebPart。下图为WebPart的声明周期。



然后我们就通过几个例子来说明MOSS中WebPart的相关开发:

一:上传附件到文档库

使用asp.net中的FileUpload控件,设置我们要上传的网站地址和列表的标题,

代码如下:

usingSystem;

using???



namespaceCaryWebPart

{

[Guid("288802c4-4dfe-45b6-bb28-49dda89ec225")]

publicclassFileUploadWP:

System.Web.UI.WebControls.WebParts.WebPart

{

FileUploadobjFileUpload=newFileUpload();

protectedoverridevoidCreateChildControls()

{

Controls.Add(objFileUpload);



ButtonbtnUpload=newButton();

btnUpload.Text="SaveFile";

this.Load+=newSystem.EventHandler(btnUpload_Click);

Controls.Add(btnUpload);

}



privatevoidbtnUpload_Click(objectsender,EventArgse)

{

using(SPSiteobjSite=newSPSite(SiteCollectionUrl))

{

using(SPWebobjWeb=objSite.OpenWeb(SiteUrl))

{

SPListobjList=objWeb.Lists[ListName];

if(objFileUpload.HasFile)

{

try

{



objList.RootFolder.Files.Add(objFileUpload.FileName,

objFileUpload.PostedFile.InputStream,

true);

}

catch(Exceptionex)

{

stringa=ex.Message;

}

}

}

}

}



privatestring_strSiteCollectionUrl;

[Personalizable(PersonalizationScope.Shared),

WebBrowsable(true),

WebDisplayName("网站集URL"),WebDescription("请输入网站集

URL")]

publicstringSiteCollectionUrl

{

get{return_strSiteCollectionUrl;}

set{_strSiteCollectionUrl=value;}

}

privatestring_strSiteUrl;

[Personalizable(PersonalizationScope.Shared),

WebBrowsable(true),

WebDisplayName("网站URL"),WebDescription("请输入网站URL")]

publicstringSiteUrl

{

get{return_strSiteUrl;}

set{_strSiteUrl=value;}

}

privatestring_strListName;

[Personalizable(PersonalizationScope.Shared),

WebBrowsable(true),

WebDisplayName("列表名称"),WebDescription("请输入列表名称

")]

publicstringListName

{

get{return_strListName;}

set{_strListName=value;}

}

}

}

下面是部署后的截图:



说明:

1.Personalizable说明该属性是可配置的。

2.PersonalizationScope.Shared设置该属性的是否所有人都可见,可以设置

Shared和User两种。

WebBrowsable(true)表示在编辑部件里是可见的。

3.SPSite的OpenWeb方法的一个重载方法的URL参数,是相对地址。

4.例子中需要将站点的web.config的

置为Full才可以上传附件。

二:Webpart中使用资源

有两种方式来访问资源一种就是放在_layouts下,另一种就是web资源,它可

以编译到程序集当中去,我们主要说Web资源。首先新建一个项目,在项目中添

加一个图片,并且在Assemblyinfo.cs中添加如下代码:

[assembly:

WebResourceAttribute("WebResource.icons.recycbin.gif","image/gif")]

image/gif代表资源的类型,如果是js则写成text/javascript。

然后还需要创建一个虚拟的类,这个类不做任何动作,只是为了获取到资源的引

用而用,下面是该类的代码:

usingSystem;

using???

namespaceWebResource

{

publicclassPlaceHolder

{}

}

用下面代码来获取web资源:

stringstrResource="WebResource.icons.recycbin.gif";

stringstrUrl=

Page.ClientScript.GetWebResourceUrl(typeof(WebResource.PlaceHolder),

strResource);

获取到的url如下形式“/WebResource.axd?d=[Assemblykey]&t=[lastwrite

timeofresourceassembly]”

/WebResource.axd?d=A34Cgk8tSLsOaGW2Mtx1-iMMZgj-CEJ77updNPilqoda3ab0CW

c1mJqVyolRohMp0&t=633457672629813944

下面是使用BulletedList控件,并且将控件项的图标设置为我们的web资源中

的图片,代码如下:

namespaceCaryWebPart

{

publicclassWebResourceWP:

System.Web.UI.WebControls.WebParts.WebPart

{

protectedoverridevoidCreateChildControls()

{

stringstrResource="WebResource.icons.recycbin.gif";

stringstrUrl=

Page.ClientScript.GetWebResourceUrl(typeof(WebResource.PlaceHolder),

strResource);

BulletedListobjBullist=newBulletedList();

objBullist.BulletStyle=BulletStyle.CustomImage;

objBullist.BulletImageUrl=strUrl;

objBullist.Items.Add("One");

objBullist.Items.Add("Two");

objBullist.Items.Add("Three");

objBullist.Items.Add("Four");

Controls.Add(objBullist);

}

}

}

下图是效果图:



三:WebPart动作菜单

有三种类型:

1.Client-sideverbs:在客户端执行,使用webpartverb类,构造函数需要传

两个参数,第一个是verbs的id,第二个是点击的时的处理程序,是js的程序。

代码如下:

WebPartVerbobjFirst=newWebPartVerb("FirVerbId",

"javascript:alert(''HelloVerb!'');");

objFirst.Text="第一个verb";

objFirst.Description="第一个verb信息描述";

objFirst.ImageUrl=

"_layouts/images/test/recycbin.gif";



2.Server-sideverbs:在服务器端执行。参数中的事件处理程序使用服务器端

的代码。

WebPartVerbobjSecond=newWebPartVerb("SecVerbId",new

WebPartEventHandler(SecondVerbHandler));

objSecond.Text="第二个verb";

objSecond.Description="第二个verb信息描述";



3.Both:这种在服务器端和客户端都执行动作。可以使用

WebPartVerbCollection。

WebPartVerb[]objVerbs=newWebPartVerb[]{objFirst,objSecond};

WebPartVerbCollectionobjVerbCollection=new

WebPartVerbCollection(base.Verbs,objVerbs);



下面是完整代码:

usingSystem;

using???

namespaceCaryWebPart

{

[Guid("288802c4-4dfe-45b6-bb28-49dda89ec225")]

publicclassVerbsWP:System.Web.UI.WebControls.WebParts.WebPart

{

publicoverrideWebPartVerbCollectionVerbs

{

get

{

WebPartVerbobjFirst=newWebPartVerb("FirVerbId",

"javascript:alert(''HelloVerb!'');");

objFirst.Text="第一个verb";

objFirst.Description="第一个verb信息描述";

objFirst.ImageUrl=

"_layouts/images/test/recycbin.gif";



WebPartVerbobjSecond=newWebPartVerb("SecVerbId",

newWebPartEventHandler(SecondVerbHandler));

objSecond.Text="第二个verb";

objSecond.Description="第二个verb信息描述";



WebPartVerb[]objVerbs=newWebPartVerb[]{objFirst,

objSecond};

WebPartVerbCollectionobjVerbCollection=new

WebPartVerbCollection(base.Verbs,objVerbs);



returnobjVerbCollection;

}

}



protectedvoidSecondVerbHandler(objectsender,

WebPartEventArgsargs)

{

}

}

}

如下图:



四:创建编辑部件

所有的编辑部件都集成自EditorPart类,需要编辑的webpart的代码如下:

usingSystem;

using???

namespaceCaryWebPart

{

[Guid("288802c4-4dfe-45b6-bb28-49dda89ec225")]

publicclassForEditWP:System.Web.UI.WebControls.WebParts.WebPart

{

protectedoverridevoidRenderContents(HtmlTextWriterwriter)

{

writer.Write("TestValue:"+TestValue);

}



publicoverrideEditorPartCollectionCreateEditorParts()

{

EditWPobjEditor=newEditWP();

objEditor.ID=ID+"testEditor1";

objEditor.Title="TestEditorTitle";

objEditor.ToolTip="TestEditortooltip";

objEditor.TabIndex=100;

objEditor.GroupingText="Testeditorgroupingtext";



ArrayListobjEditorParts=newArrayList();

objEditorParts.Add(objEditor);

EditorPartCollectionobjEditorPartsCollection=new

EditorPartCollection(objEditorParts);

returnobjEditorPartsCollection;

}



privatestringstrNormalValue=String.Empty;

[Personalizable(PersonalizationScope.Shared),

WebBrowsable(false),WebDisplayName("Normalvalue"),

WebDescription("Normalvaluedescription")]

publicstringTestValue

{

get{returnstrNormalValue;}

set{strNormalValue=value;}

}

}

}

CreateEditorParts方法:创建要与WebPart控件关联的自定义EditorPart控

件的实例。当用户单击WebPart控件上的编辑动作时,将调用该方法。然后就是

开发上面Webpart对应的编辑部件,代码如下:

usingSystem;

using???

namespaceCaryWebPart

{

publicclassEditWP:EditorPart

{

TextBoxtxtNormalBox;

protectedoverridevoidCreateChildControls()

{

txtNormalBox=newTextBox();

txtNormalBox.ID="txtNormalBox";

txtNormalBox.Text="[Customeditorpart]";

txtNormalBox.TextMode=TextBoxMode.MultiLine;

txtNormalBox.Rows=5;

Controls.Add(txtNormalBox);

}

publicoverrideboolApplyChanges()

{

ForEditWPobjNormal=(ForEditWP)WebPartToEdit;

objNormal.TestValue=txtNormalBox.Text;

returntrue;

}

publicoverridevoidSyncChanges()

{

EnsureChildControls();

ForEditWPobjNormal=(ForEditWP)WebPartToEdit;

txtNormalBox.Text=objNormal.TestValue;

}

}

}

ApplyChanges方法:将用户输入到EditorPart控件中的值保存到WebPartToEdit

属性中引用的WebPart控件的相应属性中。



SyncChanges方法和上面的方法是对应的,他负责EditorPart控件中的值始终

与关联WebPart控件中的值保持同步。

如下图:



五:部署

MOSS中部署一个webpart的大致流程:

1.搭建好开发环境,建立webpart工程,写代码。

2.修改assembly.cs文件

在部署前,需要修改assembly文件,增加以下两句:

usingSystem.Security;

[assembly:AllowPartiallyTrustedCallers]

如果不进行以上修改,在安装WebPart时,会提示失败。

3.复制文件

将编译后的Dll复制到Web应用程序目录下的bin目录下。Web应用程序的文件

夹位置类似以下路径:

C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin。

4.修改web.config

WebPart使用前,需要修改Web应用程序的配置文件。

(1)增加SafeControls中增加一行,类似下面的写法。


TypeName=""Safe="True"AllowRemoteDesigner="True"/>

(2)修改信任级别。

改为
level="WSS_Medium"originUrl=""/>也可以将WSS_Medium改Full。

5.在网站中增加webpart(网站操作--网站设置--web部件--新建)

六:调试

调试也没什么好说的,附加w3wp.exe进程,然后设置断点就可以了



献花(0)
+1
(本文系zww_blog首藏)