随笔 - 79  文章 - 1 评论 - 764 trackbacks - 105
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

camlquery 类库下载:
 http://www.codeplex.com/camlquery
SPCAMLEditor 下载:
 http://www.codeplex.com/SPCAMLEditor

与我联系

搜索

 

留言簿(27)

我参与的团队

随笔分类(68)

My Friends

SilverLight

wss

积分与排名

  • 积分 - 87263
  • 排名 - 464

最新随笔

最新评论

阅读排行榜

评论排行榜

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

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






Tag标签: 字段权限,moss,wss
posted on 2008-03-03 22:57 jianyi 阅读(741) 评论(13)  编辑 收藏

FeedBack:
#1楼  2008-03-05 10:19 pccai      
非常好....
  回复  引用  查看    
#2楼  2008-03-10 15:16 geng [未注册用户]
楼主水平很高
  回复  引用    
#3楼  2008-06-02 16:53 coco2233 [未注册用户]
jianyi大哥,如何在编辑界面获得某一个字段的当前值呢?
  回复  引用    
#4楼  2008-06-02 17:02 coco2233 [未注册用户]
jianyi大哥,有几个问题请教一下
1.如何在编辑界面获得某一个字段的当前值呢?
2.是不是可以控制某个字段在编辑时候的范围
比如说 一个DROPDOWNLIST字段,编辑的时候我只想让用户选择其中的某几项
如何实现?
麻烦了~~~
  回复  引用    
#5楼 [楼主] 2008-06-02 20:41 jianyi      
@coco2233
问题1:首先明确你的代码是运行在那里,如果也是运行在编辑页面上(不包括EventReceiver),可以利用SPContext.Current.FormContext.FieldControlCollection获得。FieldControlCollection是一个BaseFieldControl类型的集合,遍历一下按照BaseFieldControl的FieldName可以获取你需要的字段,然后从Value属性取值。

问题2:你可以自己写个字段(google:MOSS 自定义字段类型),按照你的逻辑来控制。
  回复  引用  查看    
#6楼  2008-06-17 19:51 1895 [未注册用户]
@jianyi
老大,如果有两个_Templates.ascx的页面在被使用,而每个又都对ListFieldIterator进行了重写,那会不会有冲突呢?moss会如何解决呢?

还有,如果想控制编辑时列表中的一个dropdownlist下拉列表中所可以选择的item,应该怎么实现呢?
  回复  引用    
#7楼 [楼主] 2008-06-18 14:48 jianyi      
@1895
每个表单,每个内容类型都可以有单独的模板.
想控制编辑时列表中的一个dropdownlist下拉列表中所可以选择的item---很多方法:开发自定义字段,定制表单界面,或者干脆写js.
  回复  引用  查看    
#8楼  2008-07-24 19:26 1895 [未注册用户]
@jianyi
我在EditControlListFieldIterator.CS里面写了一个属性formid,但是在Templates.ascx中引用EditControlListFieldIterator,如果想赋值给formid,
直接写<cc:EditControlListIterator runat="server" formid=“123” />是可以的,
但是
似乎不能用document.getElementById()这样来动态给formid赋值,有什么好的办法可以动态赋值么?老大
  回复  引用    
#9楼 [楼主] 2008-07-24 21:34 jianyi      
@1895
js当然不能给服务器控件属性赋值了。如果要用客户端JS赋值的话可以采用隐藏域实现。
  回复  引用  查看    
#10楼  2008-08-12 08:56 anyang [未注册用户]
我的意图是在新建项目列表,对某个字段没有权限的用户新建时不可见.其他部署没有问题
我在自己建的项目中引用 CodeArt.Sharepoint.dll
然后继承 EditControlListFieldIterator ,并重写 CreateChildControls()
if (set != null && !set.CanEdit(currentUser, author))
{
ControlModeProp.SetValue(child, SPControlMode.Display, null);
}

FieldNameProp.SetValue(child, field.InternalName, null);
这样写总是会出错,可以肯定的是出错的语句是
if (set != null && !set.CanEdit(currentUser, author))
请教? 我这样写有什么问题?急!

  回复  引用    
#11楼 [楼主] 2008-08-12 20:07 jianyi      
@anyang
这个解决方案我发布源码了:http://www.cnblogs.com/jianyi0115/archive/2008/05/14/1197159.html
自己调试下吧~
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录&n