[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
    }
View Code

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="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>
View Code

请根据实际情况修改下列内容:

<%@ 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
    }
View Code

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>
View Code

 由于在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&amp;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" />&amp;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. 下载

 ViewActionButton.zip

posted @ 2013-11-25 15:01  一只小小菜鸟  阅读(347)  评论(3编辑  收藏  举报