zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    java 基础笔记 基本数据类型对象包装类
    java String 类 基础笔记
    java 线程 笔记 基础
    java 线程 基础笔记2
    java 异常学习 笔记
    广告简单概念整理-持续更新
    curl一些使用技巧
    简单学习正则表达式
    Linux命令简单操作之lsof
    Linux命令简单操作之find和xargs
  • 原文地址:https://www.cnblogs.com/s1nce/p/SharePoint2010-Custom-FieldType2.html
Copyright © 2011-2022 走看看