再議WSS RenderingTemplate

修改WSS的控件的RenderingTemplate,可以靈活的控制表單頁面的顯示。
以前寫過幾篇相關的文章:
WSS3.0開發--頁面定製(1)--修改列表的表單頁面
WSS頁面定製系列(2)---定製單個列表的表單頁面
WSS頁面定製系列(3)---重寫表單的保存邏輯
WSS頁面定製系列(4)--利用SmartForm和用戶控件定製表單頁面

以上幾篇提到了RenderingTemplate的簡單修改方法,貌似很多朋友仍然不能掌握具體的方法,就再來一篇吧。

WSS裏有一個類TemplateBasedControl從這個類繼承下來,控件就具有了加載模板的功能。
看一下這個類的方法:
public class TemplateBasedControl : SPControl, INamingContainer
{
    // Methods
    public TemplateBasedControl();
    [SharePointPermission(SecurityAction.Demand, ObjectModel
=true)]
    
protected override void CreateChildControls();
    
public static TemplateBasedControl GetParentTemplateBasedControl(Control control);
    [SharePointPermission(SecurityAction.Demand, ObjectModel
=true)]
    
protected override void OnLoad(EventArgs e);
    [SharePointPermission(SecurityAction.Demand, ObjectModel
=true)]
    
protected override void Render(HtmlTextWriter output);

    
// Properties
    [TemplateContainer(typeof(TemplateContainer))]
    
public ITemplate AlternateTemplate { getset; }
    
public string AlternateTemplateName { getset; }
    
public override ControlCollection Controls { [SharePointPermission(SecurityAction.Demand, ObjectModel=true)] get; }
    
protected virtual ITemplate ControlTemplate { get; }
    [TemplateContainer(
typeof(TemplateContainer)), PersistenceMode(PersistenceMode.InnerProperty)]
    
public ITemplate CustomAlternateTemplate { getset; }
    [TemplateContainer(
typeof(TemplateBasedControl)), PersistenceMode(PersistenceMode.InnerProperty)]
    
public ITemplate CustomTemplate { getset; }
    
protected virtual string DefaultAlternateTemplateName { get; }
    
protected virtual string DefaultTemplateName { get; }
    
public SPContext RenderContext { getset; }
    [TemplateContainer(
typeof(TemplateBasedControl))]
    
public ITemplate Template { getset; }
    
public virtual TemplateContainer TemplateContainer { get; }
    
public string TemplateName { getset; }
    
protected TemplateOverride TemplateOverride { getset; }
    
public virtual SPWeb Web { get; }
}

注意兩個重要的屬性:DefaultTemplateName 和TemplateName,這兩個屬性配置了控件的默認模板和自定義模板。若沒有指定TemplateName,則TemplateName跟DefaultTemplateName一致,見如下代碼:
public string TemplateName
{
    
get
    
{
        
if (this.m_templateName == null)
        
{
            
this.m_templateName = this.DefaultTemplateName;
        }

        
return this.m_templateName;
    }

    
set
    
{
        
this.m_templateName = value;
    }

}


在系統的默認模板文件(Defaulttemplate.ascx)中,很多控件都是從TemplateBasedControl繼承的,應此他們具有加載模板的能力,很多情況下,一個模板控件還會加載其他的模板,模板中還會有模板控件,於是就形成了一個模板套模板的結構。
系統的模板控件在設計的時候,一般只會指定DefaultTemplateName,這樣,我們就可以通過修改TemplateName來替換默認模板。
ListFieldIterator控件,她只是重載了DefaultTemplateName屬性:
protected override string DefaultTemplateName
{
    
get
    
{
        
return "ListFieldIterator";
    }

}


表單頁面模板一般爲LitstForm ,如下:
ListForm

LitstForm 模板中嵌入了ListFieldIterator控件,這個控件遍歷生成所有的字段控件,ListFieldIterator控件的默認模板是ListFieldIterator,如下:
<SharePoint:RenderingTemplate ID="ListFieldIterator" runat="server">
    
<Template>
        
<TR><SharePoint:CompositeField runat="server"/></TR>
    
</Template>
</SharePoint:RenderingTemplate>
這個模板中又嵌入了CompositeField控件,CompositeField控件的默認模板是CompositeField,內容如下: 

<SharePoint:RenderingTemplate ID="CompositeField" runat="server">
    
<Template>
        
<TD nowrap="true" valign="top" width="190px" class="ms-formlabel"><H3 class="ms-standardheader"><SharePoint:FieldLabel runat="server"/></H3></TD>
        
<TD valign="top" class="ms-formbody" width="400px">
        
<!-- FieldName="<SharePoint:FieldProperty PropertyName="Title" runat="server"/>"
             FieldInternalName="<SharePoint:FieldProperty PropertyName="InternalName" runat="server"/>"
             FieldType="SPField<SharePoint:FieldProperty PropertyName="Type" runat="server"/>"
          
-->
            
<SharePoint:FormField runat="server"/>
            
<SharePoint:FieldDescription runat="server"/>
            
<SharePoint:AppendOnlyHistory runat="server"/>
        
</TD>
    
</Template>
</SharePoint:RenderingTemplate>

如果要全面定製一個表單頁面,需要修改以上的所有模板。
下面,演示一下如何將一個表單定製成如下樣式:

新建一個模板文件:
TestTemplates.ascx,敲入一下代碼:
<%@ Control Language="C#"   AutoEventWireup="false" %>
<%@Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls"%>
<%@Register TagPrefix="SPHttpUtility" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.Utilities"%>
<%@ Register TagPrefix="wssuc" TagName="ToolBar" src="~/_controltemplates/ToolBar.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="ToolBarButton" src="~/_controltemplates/ToolBarButton.ascx" %>
<SharePoint:RenderingTemplate ID="ListForm" runat="server">
    
<Template>
        
<SPAN id='part1'>
            
<SharePoint:InformationBar runat="server"/>
            
            
<SharePoint:FormToolBar runat="server"/>

<div>
<SharePoint:ListFieldIterator runat="server" TemplateName="ListFieldIterator2" />
</div>

            
<TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 cellspacing=0 width=100%>

            
<SharePoint:ChangeContentType runat="server"/>
            
<SharePoint:FolderFormFields runat="server"/>
            
            
<SharePoint:ApprovalStatus runat="server"/>
            
<SharePoint:FormComponent TemplateName="AttachmentRows" runat="server"/>
            
</TABLE>
            
<table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></td></tr></table>
            
<TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px"><tr><td width=100%>
            
<SharePoint:ItemHiddenVersion runat="server"/>
            
<SharePoint:ParentInformationField runat="server"/>
            
<SharePoint:InitContentType runat="server"/>
            
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&nbsp;" runat="server">
                    
<Template_Buttons>
                        
<SharePoint:CreatedModifiedInfo runat="server"/>
                    
</Template_Buttons>
                    
<Template_RightButtons>
                        
<SharePoint:SaveButton runat="server"/>
                        
<SharePoint:GoBackButton runat="server"/>
                    
</Template_RightButtons>
            
</wssuc:ToolBar>
            
</td></tr></TABLE>
        
</SPAN>
        
<SharePoint:AttachmentUpload runat="server"/>
    
</Template>
</SharePoint:RenderingTemplate>

<SharePoint:RenderingTemplate ID="ListFieldIterator2" runat="server">
    
<Template>
        
<SharePoint:CompositeField runat="server" TemplateName="CompositeField2"/>
    
</Template>
</SharePoint:RenderingTemplate>

<SharePoint:RenderingTemplate ID="CompositeField2" runat="server">
    
<Template>

        
<H3 class="ms-standardheader"><SharePoint:FieldLabel runat="server"/></H3>
         
<br/>
        
<!-- FieldName="<SharePoint:FieldProperty PropertyName="Title" runat="server"/>"
             FieldInternalName="<SharePoint:FieldProperty PropertyName="InternalName" runat="server"/>"
             FieldType="SPField<SharePoint:FieldProperty PropertyName="Type" runat="server"/>"
          
-->
        
<SharePoint:FormField runat="server"/>
        
<SharePoint:FieldDescription runat="server"/>
        
<SharePoint:AppendOnlyHistory runat="server"/>
         
<br/>
    
</Template>
</SharePoint:RenderingTemplate>

以上代碼修改了ListFieldIterator,CompositeField兩個控件的默認模板。

注意:這個修改幾乎對所有的列表表單起作用,因爲直接覆蓋了ID爲ListForm的模板。
若只需要對某個表單起作用,需要將第一個模板的ID改掉,不能跟系統已有模本ID重複,然後按照本文開頭羅列的幾篇文章中的方法,或者用SPD修改ListFormWebPart的模板名,或者用SmartForm加載新的模板。

文件保存後,重啓IIS即可看到效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章