以前写过几篇相关的文章:
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 { get; set; }
public string AlternateTemplateName { get; set; }
public override ControlCollection Controls { [SharePointPermission(SecurityAction.Demand, ObjectModel=true)] get; }
protected virtual ITemplate ControlTemplate { get; }
[TemplateContainer(typeof(TemplateContainer)), PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate CustomAlternateTemplate { get; set; }
[TemplateContainer(typeof(TemplateBasedControl)), PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate CustomTemplate { get; set; }
protected virtual string DefaultAlternateTemplateName { get; }
protected virtual string DefaultTemplateName { get; }
public SPContext RenderContext { get; set; }
[TemplateContainer(typeof(TemplateBasedControl))]
public ITemplate Template { get; set; }
public virtual TemplateContainer TemplateContainer { get; }
public string TemplateName { get; set; }
protected TemplateOverride TemplateOverride { get; set; }
public virtual SPWeb Web { get; }
}
{ // 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 { get; set; }
public string AlternateTemplateName { get; set; }
public override ControlCollection Controls { [SharePointPermission(SecurityAction.Demand, ObjectModel=true)] get; }
protected virtual ITemplate ControlTemplate { get; }
[TemplateContainer(typeof(TemplateContainer)), PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate CustomAlternateTemplate { get; set; }
[TemplateContainer(typeof(TemplateBasedControl)), PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate CustomTemplate { get; set; }
protected virtual string DefaultAlternateTemplateName { get; }
protected virtual string DefaultTemplateName { get; }
public SPContext RenderContext { get; set; }
[TemplateContainer(typeof(TemplateBasedControl))]
public ITemplate Template { get; set; }
public virtual TemplateContainer TemplateContainer { get; }
public string TemplateName { get; set; }
protected TemplateOverride TemplateOverride { get; set; }
public virtual SPWeb Web { get; }
}
注意两个重要的属性:DefaultTemplateName 和TemplateName,这两个属性配置了控件的默认模板和自定义模板。若没有指定TemplateName,则TemplateName跟DefaultTemplateName一致,见如下代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
在系统的默认模板文件(Defaulttemplate.ascx)中,很多控件都是从TemplateBasedControl继承的,应此他们具有加载模板的能力,很多情况下,一个模板控件还会加载其他的模板,模板中还会有模板控件,于是就形成了一个模板套模板的结构。
系统的模板控件在设计的时候,一般只会指定DefaultTemplateName,这样,我们就可以通过修改TemplateName来替换默认模板。
如ListFieldIterator控件,她只是重载了DefaultTemplateName属性:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
表单页面模板一般为LitstForm ,如下:
![](/Images/OutliningIndicators/ContractedBlock.gif)
LitstForm 模板中嵌入了ListFieldIterator控件,这个控件遍历生成所有的字段控件,ListFieldIterator控件的默认模板是ListFieldIterator,如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
如果要全面定制一个表单页面,需要修改以上的所有模板。
下面,演示一下如何将一个表单定制成如下样式:
![](/images/cnblogs_com/jianyi0115/listFormCustom22.gif)
新建一个模板文件:TestTemplates.ascx,敲入一下代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
以上代码修改了ListFieldIterator,CompositeField两个控件的默认模板。
注意:这个修改几乎对所有的列表表单起作用,因为直接覆盖了ID为ListForm的模板。
若只需要对某个表单起作用,需要将第一个模板的ID改掉,不能跟系统已有模本ID重复,然后按照本文开头罗列的几篇文章中的方法,或者用SPD修改ListFormWebPart的模板名,或者用SmartForm加载新的模板。
文件保存后,重启IIS即可看到效果。