天天看點

SharePoint 2010 文檔管理之點選次數

  前言:很多場景下,我們都需要對一篇文章或者文檔的點選次數進行統計,然而SharePoint本身并沒有給我們設計這樣一個字段,是以我們需要通過簡單的字段開發來實作這樣一個功能。

一、建立項目:

  1. 建立一個空的SharePoint項目,添加一個“SharePoint映射檔案夾”,映射到Template/Xml下,用來儲存我們對于字段描述的xml。

  2. 添加一個xml到映射的xml檔案夾下,名字為fldtypes_字段名,前面的名字必須是這樣規則,才會被SharePoint所識别,xml模闆附後。

  3. 添加一個VisitorRecord.cs檔案繼承自SPField字段,添加一個VisitorRecordControl.cs檔案繼承自BaseFieldControl。

  4. 項目結構,如下圖:

SharePoint 2010 文檔管理之點選次數

二、添加代碼

  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. 建立項目,并沒有顯示我們的自定義字段,因為隐去了;

SharePoint 2010 文檔管理之點選次數

  2. 所有項目頁面,我們的視圖裡有這個字段,可以看到每個項目的通路量;

SharePoint 2010 文檔管理之點選次數

  3. 點選詳細頁面,可以看到通路量,并且會+1;

SharePoint 2010 文檔管理之點選次數

  4. 編輯頁面下,也沒有顯示這個字段;

SharePoint 2010 文檔管理之點選次數

四、字段其他介紹:

  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