本文讲述如何在SharePoint 2010/2013 中创建一个默认值为当前用户的客户化字段。
在项目中我们经常会遇到客户提出某个字段的默认设置为当前用户的需求,像这样的需求一般来说有两条路可以走:
1. 前端路线,大致思路是客户化new form,使用JS取当前用户,然后赋值到对应的字段,优缺点有:
a. 优点:前端代码安全性好,不会对SharePoint server本身造成影响
b. 缺点:重用性不好,每次有这样的需求只能拷贝代码重用
2. 后台路线,大致是写个类继承SPFieldUser,覆盖其DefaultValue属性,优缺点有:
a. 优点:重用性好,直接部署wsp就可以重用了
b. 缺点:用服务器端代码,对SharePoint server有影响,写得不好容易坏事
本文只讲述后台路线的步骤,因为个人觉得重用性好更重要,更省时间:
1. 新建一个Farm Solution,命名为 TestCurrentUserField
2. 添加SharePoint 映射路径(Template\Xml)
3.新建一个CurrentUserField类继承自SPFieldUser,CurrentUserField.cs代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint; namespace TestCurrentUserField { class CurrentUserField : SPFieldUser { public CurrentUserField(SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName) { } public CurrentUserField(SPFieldCollection fields, string fieldName): base(fields, fieldName) { } public override string DefaultValue { get { SPWeb web = SPContext.Current.Web; SPUser user = web.CurrentUser; string defaultValue = string.Format("{0};#{1}", user.ID.ToString(), user.Name); if (this.SelectionGroup > 0) { SPGroup group = web.Groups[this.SelectionGroup]; if ((group != null) && (group.ContainsCurrentUser)) { return defaultValue; } } else { return defaultValue; } return string.Empty; } set { base.DefaultValue = value; } } } }
4. 在第二步添加的xml文件夹下添加 fldtypes_currentuser.xml,内容为:
<?xml version="1.0" encoding="utf-8"?> <FieldTypes> <FieldType> <Field Name="TypeName">CurrentUser</Field> <Field Name="ParentType">User</Field> <Field Name="TypeDisplayName">Current User</Field> <Field Name="TypeShortDescription">Person or Group (Current user is default)</Field> <Field Name="UserCreatable">TRUE</Field> <Field Name="ShowInListCreate">TRUE</Field> <Field Name="ShowInSurveyCreate">TRUE</Field> <Field Name="ShowInDocumentLibraryCreate">TRUE</Field> <Field Name="ShowInColumnTemplateCreate">TRUE</Field> <Field Name="FieldTypeClass">TestCurrentUserField.CurrentUserField,$SharePoint.Project.AssemblyFullName$</Field> <Field Name="FieldEditorUserControl">/_controltemplates/UserFieldEditor.ascx</Field> <PropertySchema> </PropertySchema> </FieldType> </FieldTypes>
5. 部署解决方案,并新建一个测试列表,添加一个客户化过的CurrentUserField
6.添加一条测试记录,默认值就带出来了
跟多客户化字段的信息,请参考:
http://msdn.microsoft.com/en-us/library/office/bb861799(v=office.14).aspx