`
isiqi
  • 浏览: 16497138 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

SharePoint WebPart开发实战(一):定制属性及配置界面

阅读更多
最近一段时间都在研究SharePoint下的开发,感觉SharePoint中的内容还是比较繁杂的,不知道自己入了门没有?顺手记录下了开发过程中的 一些心得和体会,以加深自己的理解和掌握,如有不对的地方,还请各位不吝指正。今天先讲讲SharePoint下Web Part的开发,这应该算是SharePoint下最常见的开发了吧,今天的重点是关于自定义属性及配置界面的实现。

一、开发环境

(1)Windows 2003 Server
(2)Windows SharePoint Service 3.0(或Microsoft Office SharePoint Server 2007)
(3)Visual Studio 2005
(5)SQL Server 2005
(6)Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions
(7)Windows SharePoint Services SDK 3.0

二、WSS 2.0和WSS 3.0下Web Part开发的不同

众所周知,Windows SharePoint Service 3.0(以下简称WSS 3.0)是基于ASP.NET 2.0进行了重写,因此与WSS 2.0有很多地方存在一些不同。对于Web Part的开发,也是如此。目前网络上的很多资料介绍的Web Part开发,还是基于WSS 2.0的,而非WSS 3.0风格的。
Web Part是首先在WSS 2.0作为仪表板(Dashboard)的替代技术引入的,后来ASP.NET 2.0中也引入了一个新版本的Web Part Framework,该框架可以脱离SharePoint的环境运行。WSS 3.0的Web Part框架也基于该ASP.NET Web Part Framework进行了完全的重构。不过为了兼容性(主要是考虑到以前的解决方案的升级),原WSS 2.0的Web Part框架也得以保留,但对于以后的开发而言,都应该基于WSS 3.0的ASP.NET框架进行。
例如,基于WSS 2.0的Web Part都是从 Microsoft.SharePoint.WebPartPages.WebPart类派生的,而WSS 3.0的Web Part应该从标准的ASP.NET类System.Web.UI.WebControls.WebParts.WebPart继承。下表是基于 ASP.NET Web Part Framework中一些新的属性和类型,以及为了兼容性而保留的对应WSS 2.0模型中的属性和类型,具体的示例将在下面的章节中出现。

ASP.NET Web Parts

SharePoint Backward Compatibility

WebBrowsableAttribute

BrowsableAttribute

WebDisplayName

FriendlyName

WebDescription

Description

Personalizable

WebPartStorage

PersonalizationScope

Storage

EditorPart

ToolPart

EditorPartCollection

ToolPart[]

CreateEditorParts()

GetToolParts()

RenderContents()

RenderWebPart()

SetPersonalizationDirty()

SaveProperties


三、SharePoint Web Part开发基础

Web Part是一种特殊类型的Web Control(Web控件),它被部署于Web Part Zone控件内。虽然基于ASP.NET的Web Part Framework可以脱离WSS环境运行,但是WSS 3.0中的Web Part Framework提供了一些附加的功能,包括:动态SharePoint站点模型、模板框架、安全框架以及使用WSS Web Part Gallery的Web Part管理。以下二图就是Web Part开发中涉及的基本类,虽然SharePoint针对Web Part Zone和Web PartManager类有特定的实现,但是我们仍将使用ASP.NET Web Part类作为我们开发Web Part应用程序的基类。






WSS 3.0中使用的Web Part Manager类为SPWebPartManager,它是在页面Web Part Zone对象和SharePoint内容数据库之间的桥梁。当在页面中添加一个Web Part时,实际上是在内容数据库中加入了一个Web Part的序列化实例。对于一个最简单的Web Part而言,只需从Web Part 基类System.Web.UI.WebControls.WebParts.WebPart.派生一个具体类,然后重写RenderContents方 法来以HTML方式呈现该Web Part,就像在ASP.NET中开发Web控件一样。一个Web Part的生命周期如下表所示:

方法/事件

描述

OnInit

处理控件的初始化

OnLoad

处理控件的装载

CreateChildControls

创建子控件

EnsureChildControls

确保CreateChildControls方法被调用,使用该方法来确保在访问控件的数据之前控件已经存在。

OnPreRender

处理在呈现可控件之前必须完成的任务,例如数据装载。异步页面任务应该从该方法中被启动。

Page.PreRenderComplete

在所有的控件都完成其OnPreRender 方法并且页面已经完成了异步任务的执行之后,将会触发该事件。

Render

呈现整个控件,包括外部标签。

RenderContents

仅仅呈现控件在外部标签和样式属性内的内容。



四、Web Part属性

除了类似输出”Hello World“这样内容的最简单Web Part之外,一般实际的Web Part都是可动态配置的,这是通过Web Part属性来实现的。
在WSS 2.0中,一个Web Part属性是这样子的:

[Description(
"DataSourceName"),
Category(
"Miscellaneous"),
DefaultValue(
""),
WebPartStorage(Storage.Shared),
FriendlyName(
"DataSourceName"),
Browsable(
false)]
publicstringDataSourceName
...{
get...{returnthis.dataSourceName;}
set...{this.dataSourceName=value;}
}


当然,这不是我们推荐的用法,而应该采用如下新的语法:
[WebDescription("DataSourceName"),
Category(
"Miscellaneous"),
DefaultValue(
""),
Personalizable(PersonalizationScope.Shared),
WebDisplayName(
"DataSourceName"),
WebBrowsable(
false)]
publicstringDataSourceName
...{
get...{returnthis.dataSourceName;}
set...{this.dataSourceName=value;}
}


上述两个声明是完全等价的,大家可以参考第二节中的对应表来一一比较。注意到上述属性中WebBrowsable的属性为false,如果该属性为 true的话,就是使用默认的属性编辑界面,也就是一个文本输入框,如果想定制该属性的输入界面,则应该将WebBrowsable属性置为false, 然后提供定制属性界面。
在WSS 2.0中,自定义属性配置界面是通过重写Web Part的GetToolParts方法实现的,例如:

/**////<summary>
///配置界面。
///</summary>
///<returns></returns>

publicoverrideToolPart[]GetToolParts()
...{
ToolPart[]tools
=newToolPart[3];
tools[
0]=newMicrosoft.SharePoint.WebPartPages.WebPartToolPart();
tools[
1]=newMicrosoft.SharePoint.WebPartPages.CustomPropertyToolPart();
tools[
2]=new MyToolPart();
tools[
2].Title="My Properties";
returntools;
}

其中,Microsoft.SharePoint.WebPartPages.WebPartToolPart类提供标准的属性配置界面,如布局,大小等;而Microsoft.SharePoint.WebPartPages.CustomPropertyToolPart则提供默认的自定义属性配置界面,这是利用反射实现的,如上述属性WebBrowsable为false,则意味着使用该类来提供默认的配置界面;而第三项MyToolPart则是为自己实现的定制配置界面。
因为这是WSS 2.0中已经过时的用法,所以在此不再详述,我们重点关注一下WSS 3.0中的对应的实现。在WSS 3.0(ASP.NET 2.0)中,
自定义属性配置界面是通过重写Web Part的CreateEditorParts方法实现的:
/**////<summary>
///配置界面。
///</summary>
///<returns></returns>

publicoverrideEditorPartCollectionCreateEditorParts()
...{
EditorPartCollectionbaseParts
=base.CreateEditorParts();
List
<EditorPart>editorParts=newList<EditorPart>(1);
EditorPartpart
=newMyEditorPart();
part.ID
=this.ID+"_MyEditor";
editorParts.Add(part);
returnnewEditorPartCollection(baseParts,editorParts);
}

要实现一个EditorPart,最简单的是重写三个方法:
(1)CreateChildControls:负责创建EditorPart的子控件
(2)ApplyChanges:保存配置到Web Part的属性
(3)SyncChanges:从Web Part属性初始化EditorPart

以下是一个具体的WebPart的代码:
usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Xml.Serialization;
usingMicrosoft.SharePoint;
usingMicrosoft.SharePoint.Utilities;
usingSystem.ComponentModel;
usingSystem.Collections.Generic;

namespaceKingFactoryTagValueWebPart2
{
[Guid(
"3fd90ae1-9ff9-4b5e-8262-ac2649be9ebe")]
publicclassKingFactoryTagValueWebPart2:System.Web.UI.WebControls.WebParts.WebPart
{
privatestringdataSourceName;
privatestringrtTagName;
privatestringrefreshInterval;
privatestringwebUrl;

///<summary>
///构造函数。
///</summary>
publicKingFactoryTagValueWebPart2()
{
this.ExportMode=WebPartExportMode.All;
this.refreshInterval="5000";

}

///<summary>
///输出错误信息。
///</summary>
///<paramname="writer"></param>
///<paramname="errorInfo"></param>
privatevoidRenderError(HtmlTextWriterwriter,stringerrorInfo)
{
stringcontent="<span><tableclass="ms-WPBody"style="padding:0px;width:100%;">"+
"< tr><tdvalign="top"style="padding-left:4px;padding-right:4px;"> <imgsrc="/_layouts/1033/images/error.gif"alt="错误信息"/>< /td>"+
"<tdwidth="100%"style="padding-left:4px;padding-right:4px;">"+
errorInfo
+
"</td></tr></table></span>";
writer.Write(content);
}


///<summary>
///输出结果
///</summary>
///<paramname="writer"></param>
protectedoverridevoidRender(HtmlTextWriterwriter)
{
//检查网址
if(this.webUrl==null||this.webUrl==string.Empty)
{
RenderError(writer,
"错误:请选择网站");
return;
}


//检查数据源
if(this.dataSourceName==null||this.dataSourceName==string.Empty)
{
RenderError(writer,
"错误:请选择数据源");
return;
}

//检查变量
if(this.rtTagName==null||this.rtTagName==string.Empty)
{
RenderError(writer,
"错误:请选择变量");
return;
}

//刷新间隔
if(this.refreshInterval==null||this.refreshInterval==string.Empty)
this.refreshInterval="5000";


//生成输出
SPWebweb=SPContext.Current.Web;
stringcontent=string.Format("<iframesrc="{0}?UserName={1}&DataSourceName={2}&TagName={3}&RefreshInterval={4}"width="100%"height="100%"></iframe>",
this.webUrl,
SPEncode.UrlEncode(web.CurrentUser.LoginName),
SPEncode.UrlEncode(
this.dataSourceName),
SPEncode.UrlEncode(
this.rtTagName),
this.RefreshInterval);
writer.Write(content);
}


///<summary>
///获得编辑界面。
///</summary>
///<returns></returns>
publicoverrideEditorPartCollectionCreateEditorParts()
{
EditorPartCollectionbaseParts
=base.CreateEditorParts();
List
<EditorPart>editorParts=newList<EditorPart>(1);
EditorPartpart
=newKingFactoryTagValueEditorPart2();
part.ID
=this.ID+"_tagValueEditor";
part.Title = "KingFactory变量选择";
editorParts.Add(part);
returnnewEditorPartCollection(baseParts,editorParts);
}




[WebDescription(
"WebURL"),
Category(
"Miscellaneous"),
DefaultValue(
""),
Personalizable(PersonalizationScope.Shared),
WebDisplayName(
"WebURL"),
WebBrowsable(
false)]
publicstringWebURL
{
get{returnthis.webUrl;}
set{this.webUrl=value;}
}

[WebDescription(
"DataSourceName"),
Category(
"Miscellaneous"),
DefaultValue(
""),
Personalizable(PersonalizationScope.Shared),
WebDisplayName(
"DataSourceName"),
WebBrowsable(
false)]
publicstringDataSourceName
{
get{returnthis.dataSourceName;}
set{this.dataSourceName=value;}
}


[WebDescription(
"TagName"),
Category(
"Miscellaneous"),
DefaultValue(
""),
Personalizable(PersonalizationScope.Shared),
WebDisplayName(
"TagName"),
WebBrowsable(
false)]
publicstringRtTagName
{
get{returnthis.rtTagName;}
set{this.rtTagName=value;}
}


[WebDescription(
"RefreshInterval"),
Category(
"Miscellaneous"),
DefaultValue(
""),
Personalizable(PersonalizationScope.Shared),
WebDisplayName(
"RefreshInterval"),
WebBrowsable(
false)]
publicstringRefreshInterval
{
get{returnthis.refreshInterval;}
set{this.refreshInterval=value;}
}

}
}

以下为对应的EditorPart的代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingMicrosoft.SharePoint;
usingMicrosoft.SharePoint.Administration;

namespaceKingFactoryTagValueWebPart2
{
publicclassKingFactoryTagValueEditorPart2:EditorPart
{
protectedLabelLabel1;
protectedLabelLabel2;
protectedLabelLabel3;
protectedLabelLabel4;
protectedLabelLabel5;
protectedTextBoxrefreshInterval;
protectedTextBoxselectedTagName;
protectedTreeViewTagNameView;
protectedDropDownListwebSiteList;
protectedDropDownListdataSourceList;

///<summary>
///创建子控件。
///</summary>
protectedoverridevoidCreateChildControls()
{
base.CreateChildControls();

this.Label1=newLabel();
this.Label1.Text="选择网站:";
this.Label1.Width=80;
this.Label2=newLabel();
this.Label2.Text="选择数据源:";
this.Label3=newLabel();
this.Label3.Text="刷新间隔:";
this.Label4=newLabel();
this.Label4.Text="选择变量:";
this.refreshInterval=newTextBox();
this.selectedTagName=newTextBox();
this.TagNameView=newTreeView();
this.webSiteList=newDropDownList();
this.dataSourceList=newDropDownList();
this.dataSourceList.SelectedIndex=-1;
this.webSiteList.SelectedIndex=-1;
this.webSiteList.AutoPostBack=true;
this.webSiteList.SelectedIndexChanged+=newEventHandler(webSiteList_SelectedIndexChanged);
this.dataSourceList.AutoPostBack=true;
this.dataSourceList.SelectedIndexChanged+=newEventHandler(dataSourceList_SelectedIndexChanged);
this.TagNameView.ImageSet=TreeViewImageSet.XPFileExplorer;
this<span sty
分享到:
评论

相关推荐

    Sharepoint webpart 自定义开发(很详细)

    SharePoint WebPart是微软 SharePoint 平台上的一个重要组成部分,它允许开发者创建可重用的、交互式的用户界面组件,以增强 SharePoint 网站的功能。WebPart 的自定义开发是 SharePoint 开发中的核心技能,可以帮助...

    sharepoint webpart 开发 SmartPart

    在传统的 SharePoint WebPart 开发中,开发者需要编写大量的代码来处理各种事件和界面渲染,而 SmartPart 提供了一种更加直观和高效的方法。它允许开发者专注于 UserControl 的设计和逻辑,将 UserControl 直接嵌入...

    SharePoint WebPart 用户控件包装器

    本节通过具体案例介绍如何将一个普通 ASP.NET 用户控件转化为 SharePoint WebPart: - **创建 ASP.NET Web 应用程序**:在 Visual Studio .Net 2003 中新建一个 ASP.NET Web 应用程序项目。如果在 SharePoint ...

    有关SharePoint WebPart的一些文档笔记

    SharePoint WebPart是微软SharePoint平台中的核心组件,它是一种可重用、可配置且可自定义的用户界面元素,允许用户在SharePoint站点上构建交互式的网页。WebPart概念源自.NET Framework,为开发人员提供了一种在Web...

    SharePoint WebPart入门教程 PPT

    SharePoint WebPart是微软 SharePoint 平台上的一个重要组成部分,它允许开发者和用户自定义和增强 SharePoint 网站的功能和用户体验。本入门教程PPT将引导我们深入理解WebPart的概念、工作原理以及如何创建和使用...

    sharepoint webpart 2

    在SharePoint环境中,WebPart是一种可重用的、自包含的用户界面元素,它们可以单独配置和组合,以满足不同用户的需求。 **WebPart概述** WebPart的概念源自于.NET Framework中的ASP.NET WebParts技术,它提供了丰富...

    Sharepoint Webpart开发指导

    本文描述了针对Microsoft Office SharePoint Server 2007的WebPart的开发环境的搭建。开发环境使用的操作系统为Windows 2003 SP1以上,并安装了Windows SharePoint Service 3.0。

    如何在sharepoint2013里制作自定义webpart

    在SharePoint 2013中制作自定义WebPart是一项重要的开发任务,它允许你根据组织的需求定制工作区,提供个性化的用户体验。WebPart是SharePoint中的可重用组件,可以独立开发并添加到页面中,以展示内容、提供交互...

    vs.2003webpart开发

    1. **WebPart 开发**:WebPart 是 SharePoint 网站上的可重用组件,可以是任何类型的用户界面元素,如文本、图表、搜索框等。它们允许用户个性化其工作区,并与其他用户共享内容。 2. **SPS (Microsoft SharePoint ...

    sharepoint 2010 扩展webpart自定义属性边栏字段

    下面,我们将详细探讨如何在SharePoint 2010中扩展Web Part自定义属性,以实现边栏字段的定制。 1. **理解Web Part属性** - Web Part属性是定义Web Part行为的关键元素,它们可以是任何类型的数据,如字符串、布尔...

    SharePoint 开发实录:5,WebPart 发布

    在SharePoint开发中,WebPart是一种关键的组件,它允许开发者构建可重用的、自定义的用户界面元素,这些元素可以直接嵌入到SharePoint页面上。本篇将深入探讨WebPart的发布流程及其相关技术。 首先,WebPart是...

    Microsoft Office Sharepoint Server 2007开发系列课程(3):MOSS2007之WebPart开发

    1. **可定制性**:WebPart提供了一种灵活的方式,使开发者可以根据业务需求创建个性化的用户界面。 2. **模块化**:每个WebPart都是独立的功能单元,可以单独开发、部署和管理,便于维护和升级。 3. **交互性**:...

    SharePoint_WebPart_入门指南(全)

    - **内置WebPart**:SharePoint提供了一系列预定义的WebPart,如文档库、日历、新闻板等,用于快速搭建网站。 - **自定义WebPart**:开发者可以根据需求创建自定义WebPart,通过编程实现特定功能,例如与数据库交互...

    WebPart开发

    WebPart是Microsoft SharePoint平台中的一个重要组成部分,它允许开发者创建可重用的、自定义的用户界面元素,这些元素可以被嵌入到SharePoint页面中,为用户提供个性化的交互体验。在SharePoint环境中,WebPart是一...

    SharePoint 2013 WebPart Demo

    在 "SP2013WebPart" 压缩包中,很可能是包含了一个或多个示例 WebPart 的源代码和部署文件,用于帮助用户理解和实践 SharePoint 2013 中的 WebPart 开发。 1. **WebPart 基础** - **定义**: WebPart 是 SharePoint...

    SharePoint AJAX webpart

    SharePoint AJAX WebPart是开发SharePoint应用程序时常用的一种技术,它允许用户在不刷新整个页面的情况下更新部分网页内容,提供更流畅的用户体验。这个自定义的SharePoint.Ajax.Library是为了解决SharePoint内置...

    SharePoint中一个简单的用SPGridView显示数据的webpart示例

    在SharePoint开发中,WebPart是一种可重用的组件,用于构建自定义用户界面。本示例主要展示了如何创建一个基于SPGridView的WebPart,该WebPart能够展示SharePoint列表中的数据,并提供排序、过滤和分页功能。下面将...

    webpart 教程

    9. **WebPart可视化编辑**:SharePoint提供了直观的用户界面,允许非开发人员通过拖放操作来配置WebParts,无需编写代码。 10. **WebPart导入与导出**:WebParts可以被导出为XML文件,然后在其他SharePoint环境中...

    webpart开发学习资料

    【标题】"WebPart开发学习资料"涉及到的是在Web开发领域中的一个重要概念——WebPart,它是微软 SharePoint 平台上的核心组件之一,用于构建高度可定制的交互式Web应用程序。WebPart是SharePoint中实现模块化开发的...

Global site tag (gtag.js) - Google Analytics