程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> MOSS中的WebPart開發基礎教程

MOSS中的WebPart開發基礎教程

編輯:關於C#
 

由於在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.NET 2.0定義的WebPart基類,其命名空間為System.Web.UI.WebControls.WebParts。在moss中推薦使用asp.net2.0的webpart。

在一個ASP.NET 2.0的應用中使用WebPart,我們必須創建一個.aspx頁面並包括一個WebPartManager控件和至少一個WebPartZone控件。在MOSS中的WebPart是架構在一個名為SPWebPartManager的控件基礎上的,他重寫了asp.net中的WebPartManager的許多標准方法,同樣WebPartZone我們也需要使用Microsoft.SharePoint.WebPartPages命名空間下的,這些其實都已經在默認的母版頁都中了。

MOSS本身也提供了很多開箱即用的WebPart,例如Conent Editor WebPart,Data view WebPart,List View WebPart,Image WebPart,Members WebPart,Page viewer WebPart。下圖為WebPart的聲明周期。

05

然後我們就通過幾個例子來說明MOSS中WebPart的相關開發:

一:上傳附件到文檔庫

使用asp.net中的FileUpload控件,設置我們要上傳的網站地址和列表的標題,代碼如下:

using System;  using ………    namespace CaryWebPart  {      [Guid("288802c4-4dfe-45b6-bb28-49dda89ec225")]      public class FileUploadWP : System.Web.UI.WebControls.WebParts.WebPart      {          FileUpload objFileUpload = new FileUpload();          protected override void CreateChildControls()          {              Controls.Add(objFileUpload);                Button btnUpload = new Button();              btnUpload.Text = "Save File";              this.Load += new System.EventHandler(btnUpload_Click);              Controls.Add(btnUpload);          }            private void btnUpload_Click(object sender, EventArgs e)          {              using (SPSite objSite = new SPSite(SiteCollectionUrl))              {                  using (SPWeb objWeb = objSite.OpenWeb(SiteUrl))                  {                      SPList objList = objWeb.Lists[ListName];                      if (objFileUpload.HasFile)                      {                          try                          {                              objList.RootFolder.Files.Add(objFileUpload.FileName,                              objFileUpload.PostedFile.InputStream, true);                          }                          catch(Exception ex)                          {                              string a = ex.Message;                          }                      }                  }              }          }            private string _strSiteCollectionUrl;          [Personalizable(PersonalizationScope.Shared), WebBrowsable(true), 
WebDisplayName("網站集URL"), WebDescription("請輸入網站集URL")] public string SiteCollectionUrl { get { return _strSiteCollectionUrl; } set { _strSiteCollectionUrl = value; } } private string _strSiteUrl; [Personalizable(PersonalizationScope.Shared), WebBrowsable(true),
WebDisplayName("網站URL"), WebDescription("請輸入網站URL")] public string SiteUrl { get { return _strSiteUrl; } set { _strSiteUrl = value; } } private string _strListName; [Personalizable(PersonalizationScope.Shared), WebBrowsable(true),
WebDisplayName("列表名稱"), WebDescription("請輸入列表名稱")] public string ListName { get { return _strListName; } set { _strListName = value; } } } }
下面是部署後的截圖:

06

說明:

1.Personalizable說明該屬性是可配置的。
2.PersonalizationScope.Shared 設置該屬性的是否所有人都可見,可以設置Shared和User兩種 。
WebBrowsable(true) 表示在編輯部件裡是可見的。
3.SPSite的OpenWeb方法的一個重載方法的URL參數,是相對地址。
4.例子中需要將站點的web.config的<trust level="Full" originUrl="" /> 設置為Full才可以上傳附件。

二:Webpart中使用資源

有兩種方式來訪問資源一種就是放在_layouts下,另一種就是web資源,它可以編譯到程序集當中去,我們主要說Web資源。首先新建一個項目,在項目中添加一個圖片,並且在Assemblyinfo.cs中添加如下代碼:

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

image/gif代表資源的類型,如果是js則寫成text/javascript
然後還需要創建一個虛擬的類,這個類不做任何動作,只是為了獲取到資源的引用而用,下面是該類的代碼:

using System;   using ………  namespace WebResource  {
public class PlaceHolder {} }

用下面代碼來獲取web資源:

string strResource = "WebResource.icons.recycbin.gif";
string strUrl = Page.ClientScript.GetWebResourceUrl(typeof(WebResource.PlaceHolder), strResource);
獲取到的url如下形式“/WebResource.axd?d=[Assembly key]&t=[last write time of resource assembly]”
/WebResource.axd?d=A34Cgk8tSLsOaGW2Mtx1-iMMZgj-CEJ77updNPilqoda3ab0CWc1mJqVyolRohMp0&t=633457672629813944
下面是使用BulletedList控件,並且將控件項的圖標設置為我們的web資源中的圖片,代碼如下:

namespace CaryWebPart { public class WebResourceWP : System.Web.UI.WebControls.WebParts.WebPart { protected override void CreateChildControls() { string strResource = "WebResource.icons.recycbin.gif"; string strUrl = Page.ClientScript.GetWebResourceUrl(typeof(WebResource.PlaceHolder), strResource); BulletedList objBullist = new BulletedList(); 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); } } }
 

下圖是效果圖:

07

三:WebPart 動作菜單

有三種類型:
1. Client-side verbs:在客戶端執行,使用webpartverb類,構造函數需要傳兩個參數,第一個是verbs的id,第二個是點擊的時的處理程序,是js的程序。代碼如下:

WebPartVerb objFirst = new WebPartVerb("FirVerbId", "javascript:alert('Hello Verb!');");                  objFirst.Text = "第一個verb";                  objFirst.Description = "第一個verb信息描述";                  objFirst.ImageUrl = "_layouts/images/test/recycbin.gif";
 

2. Server-side verbs:在服務器端執行。參數中的事件處理程序使用服務器端的代碼。

WebPartVerb objSecond = new WebPartVerb("SecVerbId", new WebPartEventHandler(SecondVerbHandler));                  objSecond.Text = "第二個verb";                  objSecond.Description = "第二個verb信息描述";
 

3. Both:這種在服務器端和客戶端都執行動作。可以使用WebPartVerbCollection。

WebPartVerb[] objVerbs = new WebPartVerb[] {objFirst, objSecond};  WebPartVerbCollection objVerbCollection = new WebPartVerbCollection(base.Verbs, objVerbs);
 

下面是完整代碼:

using System;  using ………
namespace CaryWebPart  {      [Guid("288802c4-4dfe-45b6-bb28-49dda89ec225")]      public class VerbsWP: System.Web.UI.WebControls.WebParts.WebPart      {          public override WebPartVerbCollection Verbs          {              get              {                  WebPartVerb objFirst = new WebPartVerb("FirVerbId", "javascript:alert('Hello Verb!');");                  objFirst.Text = "第一個verb";                  objFirst.Description = "第一個verb信息描述";                  objFirst.ImageUrl = "_layouts/images/test/recycbin.gif";                    WebPartVerb objSecond = new WebPartVerb("SecVerbId", new WebPartEventHandler(SecondVerbHandler));                  objSecond.Text = "第二個verb";                  objSecond.Description = "第二個verb信息描述";                    WebPartVerb[] objVerbs = new WebPartVerb[] { objFirst, objSecond };                  WebPartVerbCollection objVerbCollection = new WebPartVerbCollection(base.Verbs, objVerbs);                    return objVerbCollection;              }          }            protected void SecondVerbHandler(object sender, WebPartEventArgs args)          {          }      }  }
如下圖:

08

四:創建編輯部件

所有的編輯部件都集成自EditorPart類,需要編輯的webpart的代碼如下:

using System;
using ………

namespace CaryWebPart  {      [Guid("288802c4-4dfe-45b6-bb28-49dda89ec225")]      public class ForEditWP:System.Web.UI.WebControls.WebParts.WebPart      {          protected override void RenderContents(HtmlTextWriter writer)          {              writer.Write("TestValue: " + TestValue);          }            public override EditorPartCollection CreateEditorParts()          {              EditWP objEditor = new EditWP();              objEditor.ID = ID + "testEditor1";              objEditor.Title = "Test Editor Title";              objEditor.ToolTip = "Test Editor tooltip";              objEditor.TabIndex = 100;              objEditor.GroupingText = "Test editor grouping text";                ArrayList objEditorParts = new ArrayList();              objEditorParts.Add(objEditor);              EditorPartCollection objEditorPartsCollection = new EditorPartCollection(objEditorParts);              return objEditorPartsCollection;          }            private string strNormalValue = String.Empty;          [Personalizable(PersonalizationScope.Shared), WebBrowsable(false), WebDisplayName("Normal value"), WebDescription("Normal value description")]          public string TestValue          {              get { return strNormalValue; }              set { strNormalValue = value; }          }      }  }  

CreateEditorParts方法:創建要與WebPart控件關聯的自定義EditorPart控件的實例。當用戶單擊WebPart控件上的編輯動作時,將調用該方法。然後就是開發上面Webpart對應的編輯部件,代碼如下:

using System;  using ………
namespace CaryWebPart  {      public class EditWP : EditorPart      {          TextBox txtNormalBox;          protected override void CreateChildControls()          {              txtNormalBox = new TextBox();              txtNormalBox.ID = "txtNormalBox";              txtNormalBox.Text = "[Custom editor part]";              txtNormalBox.TextMode = TextBoxMode.MultiLine;              txtNormalBox.Rows = 5;              Controls.Add(txtNormalBox);          }          public override bool ApplyChanges()          {              ForEditWP objNormal = (ForEditWP)WebPartToEdit;              objNormal.TestValue= txtNormalBox.Text;              return true;          }          public override void SyncChanges()          {              EnsureChildControls();              ForEditWP objNormal = (ForEditWP)WebPartToEdit;              txtNormalBox.Text = objNormal.TestValue;          }      }  }

ApplyChanges方法:將用戶輸入到EditorPart控件中的值保存到WebPartToEdit屬性中引用的WebPart控件的相應屬性中。

SyncChanges方法和上面的方法是對應的,他負責EditorPart控件中的值始終與關聯WebPart控件中的值保持同步。

如下圖:

09

 

五:部署

MOSS中部署一個webpart的大致流程:
1.搭建好開發環境,建立webpart工程,寫代碼。
2.修改assembly.cs文件
在部署前,需要修改assembly文件,增加以下兩句:
using System.Security;
[assembly: AllowPartiallyTrustedCallers]
如果不進行以上修改,在安裝WebPart時,會提示失敗。
3.復制文件
將編譯後的Dll復制到Web應用程序目錄下的bin目錄下。Web應用程序的文件夾位置類似以下路徑:
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin 。
4.修改web.config
WebPart使用前,需要修改Web應用程序的配置文件。
(1)增加SafeControls中增加一行,類似下面的寫法。
<SafeControl Assembly="HelloWebPart" Namespace="HelloWebPart" TypeName="*" Safe="True" AllowRemoteDesigner="True" />
(2)修改信任級別。
將<trust level="WSS_Minimal" originUrl="" />改為<trust level="WSS_Medium" originUrl="" /> 也可以將WSS_Medium改Full。
5.在網站中增加webpart(網站操作--網站設置--web部件--新建)

 

六:調試
調試也沒什麼好說的,附加w3wp.exe進程,然後設置斷點就可以了

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved