前言:很多場景下,我們都需要對一篇文章或者文檔的點選次數進行統計,然而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)
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());
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