前言:很多場景下,我們都需要對一篇文章或者文檔的點擊次數進行統計,然而SharePoint本身並沒有給我們設計這樣一個字段,所以我們需要通過簡單的字段開發來實現這樣一個功能。
一、創建項目:
1. 創建一個空的SharePoint項目,添加一個“SharePoint映射文件夾”,映射到Template/Xml下,用來保存我們對於字段描述的xml。
2. 添加一個xml到映射的xml文件夾下,名字為fldtypes_字段名,前面的名字必須是這樣規則,才會被SharePoint所識別,xml模板附后。
3. 添加一個VisitorRecord.cs文件繼承自SPField字段,添加一個VisitorRecordControl.cs文件繼承自BaseFieldControl。
4. 項目結構,如下圖:
二、添加代碼
1. 添加Xml描述
| <?xml version="1.0" encoding="utf-8" ?> <FieldTypes> <FieldType> <Field Name="TypeName">VisitorRecord</Field> <Field Name="ParentType">Text</Field> <Field Name="TypeDisplayName">瀏覽次數</Field> <Field Name="TypeShortDescription">每點擊一次DispForm頁,瀏覽次數+1</Field> <Field Name="UserCreatable">TRUE</Field> <Field Name="Sortable">TRUE</Field> <Field Name="AllowBaseTypeRendering">TRUE</Field> <Field Name="Filterable">TRUE</Field> <Field Name="FieldTypeClass">VisitorRecord.VisitorRecord,VisitorRecord, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a3d395e8da16bea6</Field> <RenderPattern Name="DisplayPattern"> <Column/> </RenderPattern> </FieldType> </FieldTypes> |
2. 添加VisitorRecord方法,如下表格:
| class VisitorRecord : SPField { public VisitorRecord(SPFieldCollection fields, string fieldName) : base(fields, fieldName) { Init(); } public VisitorRecord(SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName) { Init(); } void Init() { //設置在DisplayForm頁顯示 this.ShowInDisplayForm = true; //設置在EditFrom頁不顯示 this.ShowInEditForm = false; //在NewForm頁不顯示 this.ShowInNewForm = false; } public override BaseFieldControl FieldRenderingControl { get { BaseFieldControl vr1 = new VisitorRecordControl(); vr1.FieldName = this.InternalName; return vr1; } } } |
3. 添加VisitorRecordControl類代碼
| class VisitorRecordControl : BaseFieldControl { public void UpdateItemFieldValue() { try { SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(SPContext.Current.Site.ID)) { using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID)) { web.AllowUnsafeUpdates = true; SPList list = web.Lists[this.ListId]; SPListItem item = list.GetItemById(this.ItemId); if (item == null) return; if (ItemFieldValue != null) item[this.FieldName] = (Convert.ToInt32(this.ItemFieldValue.ToString()) + 1).ToString(); else item[this.FieldName] = "1"; item.SystemUpdate(); web.AllowUnsafeUpdates = false; } } }); }catch{} } protected override void Render(System.Web.UI.HtmlTextWriter output) { if (this.ControlMode == SPControlMode.Display) { this.UpdateItemFieldValue(); if (this.ItemFieldValue != null) { output.Write(this.ItemFieldValue.ToString()); } else { output.Write("0"); } } } } |
三、顯示效果介紹:
1. 新建項目,並沒有顯示我們的自定義字段,因為隱去了;
2. 所有項目頁面,我們的視圖里有這個字段,可以看到每個項目的訪問量;
3. 點擊詳細頁面,可以看到訪問量,並且會+1;
4. 編輯頁面下,也沒有顯示這個字段;
四、字段其他介紹:
1. 字段類型
可以看到我們一開始繼承的字段類型,是SPField類型,這個是基礎字段類型,當然,我們可以繼承SharePoint已經存在的內置字段類型,如下表:
| 單行文本 – SPFieldText 多行文本 – SPFieldMultiLineText 數字 – SPFieldNumber 貨幣 – SPFieldCurrency 是/否 – SPFieldBoolean 日期 - SPFieldDateTime 選項(單選) - SPFieldChoice |
2. 字段結構:
基本,我們可以理解SharePoint的字段有一個GAC下文件(xxx.dll),一個字段描述性文件(fldtypes_xxx.xml)在Template/xml下,可能還有一個用戶控件(xxx.ascx),在TEMPLATE/CONTROLTEMPLATES下。
3. 一些其他方法或事件
| //判斷輸入值的有效性 public override string GetValidatedString(object value) //重寫字段默認值 public override string DefaultValue //該字段是否允許被爬網 public override bool NoCrawl //字段刪除時執行的事件 public override void OnDeleting() //字段添加后執行的事件 public override void OnAdded() //字段更新后執行的事件 public override void OnUpdated() |
五、參考文檔:
http://msdn.microsoft.com/zh-cn/library/gg132914.aspx
http://www.cnblogs.com/flowman/archive/2012/10/31/2748049.html





