SharePoint 2010--為WebPart建立自定義屬性
通過為web part建立自定義屬性,我們可以通過改變web part的屬性實現web part在頁面上的動態顯示。這些屬性儲存在資料庫中,可以在頁面載入的時候進行重用。
接下來建立的web part將會顯示Address,web part提供自定義屬性可以供SharePoint 的使用者進行修改。我們有一些簡單的地址資訊如name,street,zip code和city。
- 建立專案
開啟Visual Studio,建立一個Visual Web Part project,命名為Example.AddressWebPart。
刪除預設的Visual Web Part:“VisualWebPart1”
新增一個Visual Web Part, 命名為Address
開啟Features資料夾,雙擊Feature1,改變feature名字為Address Feature,
為了使得web part在SharePoint上有一個很好的描述,我們可以對配置資訊做一些小的改動:雙擊Address.webpart檔案在Address資料夾中,改變web part的描述資訊:
<?xml version="1.0" encoding="utf-8"?> <webParts> <webPart xmlns="http://schemas.microsoft.com/WebPart/v3"> <metaData> <type name="Images.Address.Address, $SharePoint.Project.AssemblyFullName$" /> <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage> </metaData> <data> <properties> <property name="Title" type="string">Address</property> <property name="Description" type="string">Displays a personalizable address on the screen</property> </properties> </data> </webPart> </webParts>
我們也可以改變web part的category,例如改變category為“Utilities”web part就會在名字為Utilities的group中,開啟Elements.xml檔案:
<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/" > <Module Name="Address" List="113" Url="_catalogs/wp"> <File Path="Address\Address.webpart" Url="Address.webpart" Type="GhostableInLibrary" > <Property Name="Group" Value="Utilities" /> </File> </Module> </Elements>
- 自定義web part
首先,新增我們需要的屬性到Address.cs檔案中,Personalizable告訴Web Part framework去儲存屬性到資料庫中,WebBrowsable屬性高數web part framework在web part的編輯區顯示屬性:
namespace Images.Address { [ToolboxItemAttribute(false)] public class Address : WebPart { // Visual Studio might automatically update this path when you change the Visual Web Part project item. private const string _ascxPath = @"~/_CONTROLTEMPLATES/Images/Address/AddressUserControl.ascx"; [Personalizable(), WebBrowsable] public String Firstname { get; set; } [Personalizable(), WebBrowsable] public String Lastname { get; set; } [Personalizable(), WebBrowsable] public String Street { get; set; } [Personalizable(), WebBrowsable] public int Zip { get; set; } [Personalizable(), WebBrowsable] public String City { get; set; } protected override void CreateChildControls() { Control control = Page.LoadControl(_ascxPath); Controls.Add(control); } } }
現在我們可以檢視web part在SharePoint中的顯示結果,deploy當前的solution,新增建立的web part到一個SharePoint 的page上,點選“Edit Web Part”,我們可以看到定義的屬性在“miscellaneous”下面,如圖所示:
嘗試在文字框中出入一些值,web part framework將會儲存這些值到資料庫中,並關聯到web part。然而在web part中沒有顯示,我們需要新增control到“AddressUserControl.ascx”,新增control之前,對“AddressUserControl.ascx.cs”檔案做如下修改:
public partial class AddressUserControl : UserControl { public Address WebPart { get; set; } }
然後點選“Address.cs”檔案,編輯CreateChildControls事件:
protected override void CreateChildControls() { Control control = Page.LoadControl(_ascxPath); if (control != null) { ((AddressUserControl)control).WebPart = this; } Controls.Add(control); }
通過上述程式碼的改變,我們告訴AddressUserControl去填充在web part配置時的屬性。這樣我們就可以進入到在Address.cs檔案中定義的屬性。
最後新增control到AddressUserControl.ascx檔案:
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> <%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %> <%@ Import Namespace="Microsoft.SharePoint" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AddressUserControl.ascx.cs" Inherits="Images.Address.AddressUserControl" %> <asp:Label ID="lblFirstname" runat="server" style="font-weight: 700" ></asp:Label> <asp:Label ID="lblLastname" runat="server" style="font-weight: 700" ></asp:Label> <br /> <br /> <asp:Label ID="lblStreet" runat="server" ></asp:Label> <br /> <asp:Label ID="lblZip" runat="server" ></asp:Label> - <asp:Label ID="lblCity" runat="server" ></asp:Label>
新增Prerender事件到AddressUserControls.ascx.cs檔案:
protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (this.WebPart != null) { this.lblFirstname.Text = this.WebPart.Firstname; this.lblLastname.Text = this.WebPart.Lastname; this.lblStreet.Text = this.WebPart.Street; this.lblZip.Text = this.WebPart.Zip.ToString(); this.lblCity.Text = this.WebPart.City; } }
Deploy當前的solution,新增web part到一個SharePoint page上,修改它的屬性,結果顯示如下: