重写表单字段呈现逻辑,添加编辑权限控制----这是这个方案实现的核心了。

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)-打包解决方案






posted on 2008-03-03 22:57  jianyi  阅读(1853)  评论(11编辑  收藏  举报