[SharePoint 2010] 自定义字段类型开发(二)
在SharePoint 2010中实现View Action Button效果。
http://www.sharepointblogs.be/blogs/vandest/archive/2008/06/20/view-action-button.aspx
1. 创建自定义字段类ViewActionButton 继承自 SPTextField
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ 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="200" /> <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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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中读取字段的自定义属性。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
5. 下载
本文版权归菜鸟和博客园共有,欢迎转载,但请注明出处。