zoukankan      html  css  js  c++  java
  • SharePoint 2010 文档管理之点击次数

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

    一、创建项目:

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

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

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

      4. 项目结构,如下图:

    image

    二、添加代码

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

    image

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

    image

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

    image

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

    image

    四、字段其他介绍:

      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

  • 相关阅读:
    求全排列,调用C++函数
    ZOJ 3508 (the war)
    HDU 1285
    SDUT--枚举(删数问题)
    SDUT--进制转换
    位运算
    [NOI2015]软件包管理器
    列队[noip2017]
    [APIO2007]动物园
    [NOI2001]炮兵阵地
  • 原文地址:https://www.cnblogs.com/jianyus/p/3237196.html
Copyright © 2011-2022 走看看