很多场景下,我们都需要对一篇文章或者文档的点击次数进行统计,然而SharePoint本身并没有给我们设计这样一个字段,所以我们需要通过简单的字段开发来实现这样一个功能。

一、创建项目:

  1. 创建一个空的SharePoint项目,添加一个“SharePoint映射文件夹”,映射到Template/Xml下,用来保存我们对于字段描述的xml。

  2. 添加一个xml到映射的xml文件夹下,名字为fldtypes_字段名,前面的名字必须是这样规则,才会被SharePoint所识别,xml模板附后。

  3. 添加一个VisitorRecord.cs文件继承自SPField字段,添加一个VisitorRecordControl.cs文件继承自BaseFieldControl。

  4. 项目结构,如下图:

SharePoint 文档管理之点击次数

二、添加代码

  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. 新建项目,并没有显示我们的自定义字段,因为隐去了;

SharePoint 文档管理之点击次数

  2. 所有项目页面,我们的视图里有这个字段,可以看到每个项目的访问量;

SharePoint 文档管理之点击次数

  3. 点击详细页面,可以看到访问量,并且会+1

SharePoint 文档管理之点击次数

  4. 编辑页面下,也没有显示这个字段;

SharePoint 文档管理之点击次数

四、字段其他介绍:

  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()

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注