设为首页 收藏本站
查看: 901|回复: 0

[经验分享] [SharePoint 2010] 自定义字段类型开发

[复制链接]

尚未签到

发表于 2015-9-26 09:50:03 | 显示全部楼层 |阅读模式
  需求:实现针对单个字段修改权限的控制
  实现:从OOB的字段类型中扩展出新的字段类型,能够配置字段的编辑权限。参考资料:

  介绍:http://msdn.microsoft.com/zh-cn/library/ms446361(v=office.12).aspx
  演练:http://msdn.microsoft.com/zh-cn/library/bb861799(v=office.12).aspx

  1.创建自定义字段类
  创建一个类SecureField,继承至SPTextField。重写方法GetValidatedString。在此方法中可进行必填项验证及其他规则验证。



public class SecureField : SPFieldText
{
public SecureField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}
public SecureField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}
public override string GetValidatedString(object value)
{
if ((this.Required == true)
&&
((value == null)
||
((String)value == "")))
{
throw new SPFieldValidationException(this.Title
+ " must have a value.");
}
return base.GetValidatedString(value);
}
}
  2.创建自定义呈现控件
  呈现控件和呈现模板结合可以控制字段在不同模式(新建、编辑、显示)下的呈现。  
  创建类SecureFieldControl,继承至Microsoft.SharePoint.WebControls.TextField。由于要能够控制该字段根据当前用户的权限来呈现,需要在此类中重写CreateChildControls。  



public class SecureFieldControl : TextField
{
protected override void CreateChildControls()
{
if (this.Field != null)
{
base.CreateChildControls();
}
}
public override object Value
{
get
{
EnsureChildControls();
return base.Value;
}
set
{
EnsureChildControls();
base.Value = (String)value;
}
}
}
  3.创建自定义呈现模板
  呈现模板部署后位于:C:\Program Files\Common Files\Microsoft Shared\web server extensions\14(或12)\TEMPLATE\ControlTemplates目录下。配合之前的呈现控件,在CreateChildControls中切换不同的模版进行控件呈现。
  在项目中新建用户控件SecureFieldControl.ascx,删除cs和designer.cs文件,修改ascx文件中页面指令Control的属性。添加RenderingTemplate。
  我定义了两个RenderingTemplate,其中ID为SecureFieldControl的模板用来在编辑和新建的模式下使用,另一个在显示的模式下使用。



<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages"
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#" %>
<SharePoint:RenderingTemplate ID="SecureFieldControl" runat="server">
<Template>
<asp:TextBox ID="TextField" runat="server" />
</Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="FieldValueForDisplay" runat="server">
<Template>
<asp:Label ID="ValueForDisplay" runat="server" />
</Template>
</SharePoint:RenderingTemplate>
  定义好RenderingTemplate之后,需要修改呈现控件类SecureFieldControl。在类SecureFieldControl中重写DefaultTemplateName和DisplayTemplateName属性。
  其中SecureFieldControl和FieldValueForDisplay是已经定义好的RenderingTemplate的ID。



    protected override string DefaultTemplateName
{
get
{
if (this.ControlMode == SPControlMode.Display)
{
return this.DisplayTemplateName;
}
else
{
return "SecureFieldControl";
}
}
}
public override string DisplayTemplateName
{
get
{
return "FieldValueForDisplay";
}
set
{
base.DisplayTemplateName = value;
}
}
  4.创建自定义类型定义
  现在已经定义好控件类、控件呈现类和控件呈现模版。要实现根据当前用户的权限来切换呈现模板,还需要定义字段属性。我这里需要定义一个属性来保存字段编辑人员。
  首先,在项目中添加xml文件作为字段类型的定义文件。注意,该xml文件必须以"fldtypes"开头。我这里的名字是:fldtypes_SecureField.xml
  http://msdn.microsoft.com/zh-cn/library/ms415141(v=office.12).aspx



<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
<FieldType>
<Field Name="TypeName">SecureField</Field>
<Field Name="ParentType">Text</Field>
<Field Name="TypeDisplayName">SecureField</Field>
<Field Name="TypeShortDescription">自定义的安全字段</Field>
<Field Name="UserCreatable">TRUE</Field>
<Field Name="ShowOnListCreate">TRUE</Field>
<Field Name="ShowOnSurveyCreate">TRUE</Field>
<Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
<Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
<Field Name="FieldTypeClass">SP.EmployeeTran.SecureField, $SharePoint.Project.AssemblyFullName$</Field>
<PropertySchema>
<Fields>
</Fields>
</PropertySchema>
</FieldType>
</FieldTypes>
  设置好Field的各种属性后,接下来在PropertySchema中定义字段属性。



<PropertySchema>
<Fields>
<Field Name="SecurityPeoples" DisplayName="字段编辑人员" Type="UserMulti"  Mult="TRUE" UserSelectionMode="PeopleOnly">
</Field>
</Fields>
</PropertySchema>
  接下来,我们修改控件呈现类SecureFieldControl中的CreateChildControls来完成实现。
  我的需求是:网站管理员、组Admin中的成员及属性"SecurityPeoples"中的人员可以编辑字段。
  首先,在类SecureFieldControl中定义变量。



protected Label FieldValueForDisplay;

  接着修改CreateChildControls内容。



        protected override void CreateChildControls()
{
if (this.Field != null)
{
base.CreateChildControls();
this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
this.FieldValueForDisplay = (Label)TemplateContainer.FindControl("ValueForDisplay");
if (this.ControlMode != SPControlMode.Display)
{
if (!this.Page.IsPostBack)
{
if (this.ControlMode == SPControlMode.New)
{
textBox.Text = string.Empty;
}
else
textBox.Text = Convert.ToString(Value);
}
//control edit right
if (SPContext.Current.Web.CurrentUser.IsSiteAdmin) return;
                    foreach (SPGroup group in SPContext.Current.Web.CurrentUser.Groups)
{
if (group.Name == "Admin") return;
}
Microsoft.SharePoint.SPFieldUserValueCollection spuvc = (Microsoft.SharePoint.SPFieldUserValueCollection)this.Field.GetCustomProperty("SecurityPeoples");
if (spuvc == null) return;
textBox.Enabled = false;
textBox.BackColor = System.Drawing.Color.Silver;
string _targ = string.Empty;
foreach (Microsoft.SharePoint.SPFieldUserValue spuv in spuvc)
{
if (spuv.User == null)
_targ = spuv.LookupValue;
else
_targ = spuv.User.LoginName;
if (string.Compare(_targ, SPContext.Current.Web.CurrentUser.LoginName, true) == 0)
{
if (this.ControlMode != SPControlMode.Display)
{
textBox.Enabled = true;
textBox.BackColor = System.Drawing.Color.White;
}
break;
}
}
}
else
{
FieldValueForDisplay.Text = (String)this.ItemFieldValue;
}
}
}
  相关截图:
  项目结构
DSC0000.jpg
  创建新栏
DSC0001.jpg
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118957-1-1.html 上篇帖子: SharePoint高级内容--访问群体对象模型的开发之一 下篇帖子: HttpHandler 在SharePoint 2010中的应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表