[SharePoint 2010] 自定义字段类型开发(二)
在SharePoint 2010中实现View Action Button效果。
http://www.sharepointblogs.be/blogs/vandest/archive/2008/06/20/view-action-button.aspx
1. 创建自定义字段类ViewActionButton 继承自 SPTextField
public class ViewActionButton : SPField
{
#region Constructors
public ViewActionButton(SPFieldCollection fields, string fieldName)
: base(fields, fieldName) { } public ViewActionButton(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName) { }
#endregion #region Reimplementation of Get/Set Custom Property
public new void SetCustomProperty(string propertyName, object propertyValue)
{
Type type = typeof(SPField);
MethodInfo setField = type.GetMethod("SetFieldAttributeValue", BindingFlags.NonPublic | BindingFlags.Instance);
object o = setField.Invoke(this, new object[] { propertyName, propertyValue.ToString() });
} public new string GetCustomProperty(string propertyName)
{
Type type = typeof(SPField);
MethodInfo getField = type.GetMethod("GetFieldAttributeValue", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(String) }, null);
object o = getField.Invoke(this, new object[] { propertyName }); return o as String;
}
#endregion
}
2. 创建字段属性用户控件ActionButtonPropertyControl
ActionButtonPropertyControl.ascx
<%@ 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" %>
<%@ Register TagPrefix="wssuc" TagName="InputFormControl" src="~/_controltemplates/InputFormControl.ascx" %>
<%@ 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#" AutoEventWireup="true" CodeBehind="ActionButtonPropertyControl.ascx.cs" Inherits="CustomFieldProject.ControlTemplates.ViewActionButton.ActionButtonPropertyControl" %>
<wssuc:InputFormControl runat="server" LabelText="Action URL:">
<Template_Control>
<span style="white-space: nowrap;">
<SharePoint:ProjectProperty runat="server" Property="Url" />/
<SharePoint:InputFormTextBox ID="iftxtUrl" runat="server" CssClass="ms-input" TextMode="SingleLine" Width="" />
<asp:RequiredFieldValidator ID="rfvUrl" runat="server" ControlToValidate="iftxtUrl" Display="Dynamic" ErrorMessage="*" />
</span>
</Template_Control>
</wssuc:InputFormControl> <wssuc:InputFormControl runat="server" LabelText="Format:">
<Template_Control>
<asp:DropDownList ID="ifrbFormat" runat="server">
<asp:ListItem Selected="True" Value="Button" Text="Button" />
<asp:ListItem Selected="False" Value="Hyperlink" Text="Hyperlink" />
</asp:DropDownList>
</Template_Control>
</wssuc:InputFormControl> <wssuc:InputFormControl runat="server" LabelText="CSS-Class:">
<Template_Control>
<SharePoint:InputFormTextBox ID="iftxtCssClass" runat="server" CssClass="ms-input" TextMode="SingleLine" Text="ms-ButtonHeightWidth" />
<asp:RequiredFieldValidator ID="rfvCssClass" runat="server" ControlToValidate="iftxtCssClass" Display="Dynamic" ErrorMessage="*" />
</Template_Control>
</wssuc:InputFormControl>
请根据实际情况修改下列内容:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ActionButtonPropertyControl.ascx.cs" Inherits="CustomFieldProject.ControlTemplates.ViewActionButton.ActionButtonPropertyControl" %>
ActionButtonPropertyControl.ascx.cs
public partial class ActionButtonPropertyControl : UserControl, IFieldEditor
{
#region Controls and Properties to get/set value of Controls
// protected InputFormTextBox iftxtUrl;
public string ActionURL
{
get { return iftxtUrl.Text; }
set { iftxtUrl.Text = value; }
} //protected DropDownList ifrbFormat;
public string Format
{
get { return ifrbFormat.SelectedValue; }
set { ifrbFormat.SelectedValue = value; }
} //protected InputFormTextBox iftxtCssClass;
public string CssClass
{
get { return iftxtCssClass.Text; }
set { iftxtCssClass.Text = value; }
}
#endregion #region IFieldEditor Members
public bool DisplayAsNewSection
{
get { return false; }
} public void InitializeWithField(SPField field)
{
// If it's no postback (first time loading on Edit Field)
if (!IsPostBack)
{
CustomFieldTypes.ViewActionButton myField = field as CustomFieldTypes.ViewActionButton;
if (null != myField)
{
// Set values in control based on values in myField
Type type = typeof(ActionButtonPropertyControl); foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
{
if (prop.CanWrite)
prop.SetValue(this, myField.GetCustomProperty(prop.Name), null);
}
}
}
} public void OnSaveChange(SPField field, bool isNewField)
{
CustomFieldTypes.ViewActionButton myField = field as CustomFieldTypes.ViewActionButton; if (null != myField)
{
// Set values in myField based on values in control
Type type = typeof(ActionButtonPropertyControl); foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
{
if (prop.CanWrite)
myField.SetCustomProperty(prop.Name, prop.GetValue(this, null));
}
}
}
#endregion
}
3. 创建自定义字段定义文件fldtypes_ViewActionButton
<?xml version="1.0" encoding="utf-8" ?> <FieldTypes>
<FieldType>
<Field Name="TypeName">ViewActionButton</Field>
<Field Name="TypeDisplayName">View Action Button</Field>
<Field Name="TypeShortDescription">View Action Button</Field>
<Field Name="ParentType">Text</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="Sortable">FALSE</Field>
<Field Name="Filterable">FALSE</Field>
<Field Name="CAMLRendering">TRUE</Field>
<Field Name="FieldEditorUserControl">/_controltemplates/ViewActionButton/ActionButtonPropertyControl.ascx</Field>
<Field Name="FieldTypeClass">CustomFieldProject.CustomFieldTypes.ViewActionButton, $SharePoint.Project.AssemblyFullName$</Field> <RenderPattern Name="DisplayPattern">
<SetVar Name="ActionURLWithParams">
<HttpVDir CurrentWeb="TRUE" />
<HTML>/</HTML>
<Property Select="ActionURL"/>
<HTML>
<![CDATA[?ID=]]>
</HTML>
<Column Name="ID" />
<HTML>
<![CDATA[&List=]]>
</HTML>
<ListProperty Select="Name" />
</SetVar> <Switch>
<Expr>
<Property Select="Format"/>
</Expr>
<Case Value="Button">
<HTML>
<![CDATA[<input type="button" class="]]>
</HTML>
<Property Select="CssClass"/>
<HTML>
<![CDATA[" value="]]>
</HTML>
<Property Select="DisplayName"/>
<HTML>
<![CDATA[" onclick="javascript:window.location=STSPageUrlValidation(']]>
</HTML>
<GetVar Name="ActionURLWithParams" />
<HTML>
<![CDATA[&Source=' + GetSource()); return false;" />]]>
</HTML>
</Case>
<Case Value="Hyperlink">
<HTML>
<![CDATA[<a class="]]>
</HTML>
<Property Select="CssClass"/>
<HTML>
<![CDATA[" href="]]>
</HTML>
<GetVar Name="ActionURLWithParams" />
<HTML>
<![CDATA[" onclick="javascript:this.href = unescapeProperly(escape(this.href)); GoToLink(this); return false;">]]>
</HTML>
<Property Select="DisplayName"/>
<HTML>
<![CDATA[<a />]]>
</HTML>
</Case>
<Default>
<HTML><![CDATA[<span style="font-style: italic;">Invalid format</span>]]></HTML>
</Default>
</Switch>
</RenderPattern>
<RenderPattern Name="EditPattern"></RenderPattern>
<RenderPattern Name="NewPattern" DisplayName="NewPattern"></RenderPattern>
<RenderPattern Name="PreviewDisplayPattern">
<HTML><![CDATA[<span style="font-style: italic;">View Action Button</span>]]></HTML>
</RenderPattern>
<RenderPattern Name="PreviewEditPattern"></RenderPattern>
<RenderPattern Name="PreviewNewPattern"></RenderPattern>
</FieldType>
</FieldTypes>
由于在SharePoint 2010中已经不推荐使用RenderPattern方式来呈现字段,需要将“CAMLRendering”设置成True,否则需要通过自定义XSLT来实现。
<Field Name="CAMLRendering">TRUE</Field>
请根据实际情况修改下列内容:
<Field Name="FieldTypeClass">CustomFieldProject.CustomFieldTypes.ViewActionButton, $SharePoint.Project.AssemblyFullName$</Field>
4. 创建自定义XSLT样式文件
如果已经CAMLRendering设置成True,则不必自定义XSLT样式。
目前仍然没有找到方法能够在XSLT中读取字段的自定义属性。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
version="1.0"
exclude-result-prefixes="xsl msxsl ddwrt"
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:ddwrt2="urn:frontpage:internal"> <xsl:template match ="FieldRef[@FieldType='ViewActionButton']" mode="Text_body">
<xsl:param name="thisNode" select="."/>
<xsl:variable name="ActionURL" select="current()/@ActionURL" />
<xsl:variable name="Format" select="current()/@Format" />
<xsl:variable name="CssClass" select="current()/@CssClass" /> <xsl:choose>
<xsl:when test="$Format='Button'">
<input type="button">
<xsl:attribute name="class">
<xsl:value-of select="$CssClass"/>
</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="$thisNode/@Name"/>
</xsl:attribute>
<xsl:attribute name="onclick">
javascript:window.location=STSPageUrlValidation('$ActionURL?ID=$thisNode/@ID&List=$List');
</xsl:attribute>
</input>
</xsl:when>
<xsl:otherwise>
<a target="_blank">
<xsl:attribute name="class">
<xsl:value-of select="$CssClass"/>
</xsl:attribute>
<xsl:attribute name="href">
<xsl:value-of select="$ActionURL" />?ID=<xsl:value-of select="$thisNode/@ID" />&List=<xsl:value-of select="$List" />
</xsl:attribute>
<xsl:value-of select="current()/@DisplayName"/>
</a>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
fldtypes_ViewActionButton.xsl
5. 下载
[SharePoint 2010] 自定义字段类型开发(二)的更多相关文章
- SharePoint 2010 自定义 字段 类型--------省市区联动
转:http://www.cnblogs.com/sp007/p/3384310.html 最近有几个朋友问到了有关自定义字段类型的问题,为了让更多的人了解自定义字段类型的方法,特写一篇博客与大家分享 ...
- 转载:SharePoint 2010 自定义 字段 类型--------省市区联动
最近有几个朋友问到了有关自定义字段类型的问题,为了让更多的人了解自定义字段类型的方法,特写一篇博客与大家分享,首先看一下解决方案目录 创建自定义类型分以下几个步骤: 第一步:添加SharePoint映 ...
- 开发MOSS自定义字段类型
前段时间,由于刚好项目定制的需要,笔者就开发了几个自定义字段类型.在这抽空做个详细笔记,方便初学者学习.这方面的资料也很多,如果自身觉得不大明白可以参考下SDK和网上的相关文章.本章的目的主要是给新手 ...
- sharepoint2010问卷调查(3)-实现问卷的开始和结束时间(采用自定义字段类型)
接着上面的图片调查,sharepoint自带的问卷调查是没有开始和结束时间的.这个在项目过程不太实用.问卷一般有开始和结束时间的.因此需要自己 动手开发一个自定义字段类型字段.如下图: 开发添加栏目会 ...
- sharepoint2010问卷调查(2)-实现问卷的图片调查(采用自定义字段类型)
1. 首先建立个图片库上传图片 并建立文件夹1和2,1下有1.1文件夹,2下2.1文件夹,2.1下有文件夹2.1.1. 在1文件夹下放如下图片: 2.建立自定义字段类型,如下图: 3.部署后建立栏目的 ...
- SharePoint 2010 ——自定义上传页面与多文件上传解决方案
最近项目遇到一个很麻烦的问题,原以为很容易解决,结果搞了那么久,先开个头,再慢慢写 SharePoint 2010 ——自定义上传页面与多文件上传解决方案 1.创建Sharepoint空白项目,创建应 ...
- sharepoint 2010自定义访问日志列表设置移动终端否和客户端访问系统等计算列的公式
上个月本人开发和上线了一个在SharePoint 2010上基于HTML5的移动OA网站,后端服务采用自定义的基于AgilePoint工作流引擎的Sharepoint Web服务,前端主要采用Jque ...
- SharePoint 2010自定义母版页小技巧——JavaScript和CSS引用
通常在我们的项目中,都会涉及到母版页的定制.并且必不可少的,需要配合以一套自己的JavaScript框架和CSS样式.你有没有遇到过这样的情况呢,在开发环境和UAT时都还算顺利,但是当最终部署到生产服 ...
- SharePoint 2013 自定义扩展菜单(二)
接博文<SharePoint 2013 自定义扩展菜单>,多加了几个例子,方便大家理解. 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomA ...
随机推荐
- MongoDB的导入导出(7)
导入/导出可以操作的是本地的mongodb服务器,也可以是远程的. 所以,都有如下通用选项: -h host 主机 --port port 端口 -u username 用户名 -p pas ...
- htaccess分布式配置文件常用写法
htaccess 写法 Apache中的.htaccess(或者”分布式配置”了针对目录改变配置的方法,即,在特定的文档目录中放置包含或多个指令的,以作用于此目录及其子目录.作为,所能的命令受到限制. ...
- php 冒泡 快速 选择 插入算法 四种基本算法
php四种基础算法:冒泡,选择,插入和快速排序法 来源:PHP100中文网 | 时间:2013-10-29 15:24:57 | 阅读数:120854 [导读] 许多人都说 算法是程序的核心,一个程序 ...
- python 线程之 threading(三)
python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...
- Jenkins + Ant + Git + Tomcat自动化部署
环境linux下,大致的配置内容如下: 首先安装JDK配置环境变量等. 其次安装ANT配置ANT_HONE并把bin目录加入PATH中. 然后安装Git,并生成sshkey配置ssh 安装tomcat ...
- [机器学习] 虚拟机VMware中使用Ubuntu的联网问题
在VMware中安装Ubuntu要解决两个问题: 1.VMware Tools安装使用 2.Ubuntu联网的虚拟机设置 1.VMware Tools安装 它的作用就是使用户可以从物理主机直接往虚拟机 ...
- Java web servlet 拦截器 以登陆为例子
以登陆为例子............... public class LoginFilter implements Filter { @Override public void destroy() { ...
- 2016huasacm暑假集训训练四 _排列
题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/D 这题要求错误的方式有多少种,就是一个错排公式,记得公式就行 ...
- MySQL(Percona Server) 5.6 主从复制
MySQL(Percona Server) 5.6.15 主库:192.168.2.21 从库:192.168.2.22 例如我们同步的数据库为:test. 如果需要同步多个数据库下面会有说明. My ...
- 安卓中級教程(6):annotation的基本用法
package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...