重写表单字段呈现逻辑,添加编辑权限控制----这是这个方案实现的核心了。
wss有一套模板的机制,系统的一些控件,包括一些webpart,如果UI比较复杂,都会采用模板来实现,详细请参考:
WSS3.0开发--页面定制(1)--修改列表的表单页面
列表的表单页面,包括查看dispform.aspx,editform.aspx,newform.aspx都采用了一个模板:ListForm,
这个模板嵌入了一个控件--Microsoft.SharePoint.WebControls.ListFieldIterator,这个控件枚举列表的所有字段,生成编辑页面。
那么我们的工作核心就是重写这个ListFieldIterator控件。
通过Reflector查看ListFieldIterator的代码,幸运的是,它不是internal的,那么我们可以继承这个控件实现新的逻辑。不过不幸得是,
ListFieldIterator内部引用了TemplateContainer控件,这个控件的某些重要属性是internal的,我们的代码没法直接设置,
不过我们还有一招:采用反射。
下面是ListFieldIterator原始的CreateControl方法代码:
[SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
protected override void CreateChildControls()
{
this.Controls.Clear();
if (this.ControlTemplate == null)
{
throw new ArgumentException("Could not find ListFieldIterator control template.");
}
for (int i = 0; i < base.Fields.Count; i++)
{
SPField field = base.Fields[i];
if (!this.IsFieldExcluded(field))
{
TemplateContainer child = new TemplateContainer();
this.Controls.Add(child);
child.ControlMode = base.ControlMode;
child.FieldName = field.InternalName;
this.ControlTemplate.InstantiateIn(child);
}
}
}
下面是重写后的ListFieldIterator:
EditControlListFieldIterator
对比以上两个类的CreateControl方法,相信大家应该了解这个解决方案的核心了。
然后,编写新的模板文件:
CodeArt_Templates.ascx
OK,我们已经给系统“所有”表单添加了了新的呈现逻辑--只有编辑权限的用户才能可以看到编辑控件。
本系列的所有文章:
CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案(v1.0)
CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案的实现 -- 概要
MOSS字段编辑权限控制方案的实现(1)-管理页面的开发和配置信息的持久化
WSS页面定制系列(2)---定制单个列表的表单页面
WSS页面定制系列(3)---重写表单的保存逻辑
MOSS字段编辑权限控制方案(4)-打包解决方案
wss有一套模板的机制,系统的一些控件,包括一些webpart,如果UI比较复杂,都会采用模板来实现,详细请参考:
WSS3.0开发--页面定制(1)--修改列表的表单页面
列表的表单页面,包括查看dispform.aspx,editform.aspx,newform.aspx都采用了一个模板:ListForm,
这个模板嵌入了一个控件--Microsoft.SharePoint.WebControls.ListFieldIterator,这个控件枚举列表的所有字段,生成编辑页面。
那么我们的工作核心就是重写这个ListFieldIterator控件。
通过Reflector查看ListFieldIterator的代码,幸运的是,它不是internal的,那么我们可以继承这个控件实现新的逻辑。不过不幸得是,
ListFieldIterator内部引用了TemplateContainer控件,这个控件的某些重要属性是internal的,我们的代码没法直接设置,
不过我们还有一招:采用反射。
下面是ListFieldIterator原始的CreateControl方法代码:
[SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
protected override void CreateChildControls()
{
this.Controls.Clear();
if (this.ControlTemplate == null)
{
throw new ArgumentException("Could not find ListFieldIterator control template.");
}
for (int i = 0; i < base.Fields.Count; i++)
{
SPField field = base.Fields[i];
if (!this.IsFieldExcluded(field))
{
TemplateContainer child = new TemplateContainer();
this.Controls.Add(child);
child.ControlMode = base.ControlMode;
child.FieldName = field.InternalName;
this.ControlTemplate.InstantiateIn(child);
}
}
} 
然后,编写新的模板文件:
OK,我们已经给系统“所有”表单添加了了新的呈现逻辑--只有编辑权限的用户才能可以看到编辑控件。
本系列的所有文章:
CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案(v1.0)
CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案的实现 -- 概要
MOSS字段编辑权限控制方案的实现(1)-管理页面的开发和配置信息的持久化
WSS页面定制系列(2)---定制单个列表的表单页面
WSS页面定制系列(3)---重写表单的保存逻辑
MOSS字段编辑权限控制方案(4)-打包解决方案

浙公网安备 33010602011771号