MOSS开发心得记录系列:【一】事前权限委托

前段时间一直忙于项目的开发一直没有更新博客,最近几天会把在项目中的一些心得写成博客跟大家一起分享。

OK下面进入今天的主体事前权限委托。

在这次的项目中首先就遇到了权限委托这个问题。权限委托一般可以分成事前和事后的两种委托方式,这里我只介绍事前的权限委托。因为事后的权限委托会比较难处理,不过要实现的话也是可以的只是相对事前的委托来说会比较繁琐一点。

先来讲讲事前委托的需求,A领导因出差需要把所有会经过他审批的流程权利移交给别人,等出差结束收回权限。

1.首先我们要建立一个列表库座位权限委托的记录

2.然后自己开发一个用户控件作为添加权限委托的入口,页面部署使用涂总的quickpart进行包装即可

用户控件支持当登陆用户不是管理员时权限委托人默认当前用户,如果是管理员可以指定权限委托人(这个设置的考虑是超级管理可以为出差但是忘记设置委托的人进行补录)。委托人还可以把不同的流程代理给不同的代理人,在流程名称中选择流程名称即可。

用户控件关键代码

 

private   bool  AddItem()
 
2          {
 
3              SPSite RootSite  =  SPContext.Current.Site; ;
 
4              SPWeb webs  =  RootSite.OpenWeb( " /Workflow " );
 
5                  
 
6               string  user  =   "" ;
 
7               if  ( ! (SPContext.Current.Web.CurrentUser.Name  ==   " 系统帐户 " ))
 
8              {
 
9                  user  =  SPContext.Current.Web.CurrentUser.Name;
10              }
11               else
12              {
13                  SPUserCollection users  =  webs.SiteUsers;
14                   foreach  (Microsoft.SharePoint.WebControls.PickerEntity pe  in   this .pedTrustor.ResolvedEntities)
15                  {
16                       string  principalType  =  pe.EntityData[ " PrincipalType " ].ToString();
17                       if  (principalType  ==   " User " )
18                      {
19                           string  loginName  =  pe.Key;
20                           foreach  (SPUser u  in  users)
21                          {
22                               if  (u.LoginName  ==  loginName)
23                              {
24                                  user  =  u.Name;
25                                   break ;
26                              }
27                          }
28                      }
29                  }
30              }
31              SPList list  =  webs.Lists[ " 权限委托登记表 " ];
32              SPQuery squery  =   new  SPQuery();
33               string  query  =   "" ;
34              query  =   string .Format( " <Where><And><Eq><FieldRef Name=' "   +  list.Fields[ " 权限委托人 " ].InternalName  +   " ' /><Value Type='User'>{0}</Value></Eq> "
35                                     +   " <Eq><FieldRef Name=' "   +  list.Fields[ " 流程名称 " ].InternalName  +   " '/><Value Type='Text'>{1}</Value></Eq></And></Where> " , user,  this .dropWorkflowType.SelectedItem.Text);
36              squery.Query  =  query;
37              SPListItemCollection items  =  list.GetItems(squery);
38               if  (items.Count  <=   0 )
39              {
40              SPListItem item  =  list.Items.Add();
41              item[ " 权限委托人 " =  webs.EnsureUser(pedTrustor.CommaSeparatedAccounts);
42              item[ " 权限代理人 " =  webs.EnsureUser(pedAgent.CommaSeparatedAccounts);
43              item[ " 委托开始时间 " =  DateTime.Parse( this .WebCalendar1.Text).ToShortDateString();
44              item[ " 委托结束时间 " =  DateTime.Parse( this .WebCalendar2.Text).ToShortDateString();
45              item[ " 权限委托是否有效 " =   this .drpEnable.SelectedItem.Text;
46              item[ " 流程名称 " ] = this .dropWorkflowType.SelectedItem.Text;
47              item.Update();
48               return   true ;
49              }
50               else
51              {
52                  Page.ClientScript.RegisterStartupScript( this .GetType(),  " isinput6 " " <script>alert(\ " 此流程的权限委托人已存在!\ " );</script> " false );
53                   return   false ;
54              }
55          }

 

 

 3.入口和列表设置完后编写Eventhandler来执行设置,在MOSS中发起流程后会在工作流任务列表中创建一条数据指定分配对象这样任务就会发送给分配对象进行审批,OK那我们就对工作流任务列表进行操作把分配对象进行修改。

意:光把分配对象替换成代理人是没有用的因为代理人针对该条数据本身是没有权限的需要另外赋权。

下面我们来看下Eventhanlder中的代码

 

public   override   void  ItemAdded(SPItemEventProperties properties)
 
2          {
 
3               this .DisableEventFiring();
 
4               string  user  =  properties.ListItem[ " 分配对象 " ].ToString().Split( ' # ' )[ 1 ];
 
5               string  workflowname  =  properties.ListItem[ " 工作流名称 " ].ToString();
 
6               string  siteurl  =  properties.OpenWeb().Site.Url;
 
7               using  (SPSite site  =   new  SPSite(siteurl))
 
8              {
 
9                   using  (SPWeb web  =  site.OpenWeb( " /workflow " ))
10                  {
11                      SPList list  =  web.Lists[ " 权限委托登记表 " ];
12                      SPQuery squery  =   new  SPQuery();
13                       string  query  =   "" ;
14                      query  =   string .Format( " <Where><And><Eq><FieldRef Name=' "   +  list.Fields[ " 权限委托人 " ].InternalName  +   " ' /><Value Type='User'>{0}</Value></Eq> "
15                                             +   " <Eq><FieldRef Name=' "   +  list.Fields[ " 流程名称 " ].InternalName  +   " '/><Value Type='Text'>{1}</Value></Eq></And></Where> " , user, workflowname);
16                      squery.Query  =  query;
17                      SPListItemCollection items  =  list.GetItems(squery);
18                       if  (items.Count  >   0 )
19                      {
20                          SPListItem item  =  items[ 0 ];
21                           if  (item[ " 权限委托是否有效 " ].ToString().Trim()  ==   " 有效 " )
22                          { 
23                              properties.ListItem[ " 分配对象 " =  item[ " 权限代理人 " ];
24                               string  dai  =  item[ " 权限代理人 " ].ToString().Split( ' # ' )[ 1 ];
25                              SPRoleAssignment sra  =   new  SPRoleAssignment((web.EnsureUser(dai)));
26                              SPRoleDefinition srd  =  web.RoleDefinitions[ " 参与讨论 " ];
27                              sra.RoleDefinitionBindings.Add(srd);
28                              properties.ListItem.RoleAssignments.Add(sra);
29                               this .DisableEventFiring();
30                              properties.ListItem.Update();
31                          }
32                           else
33                          {
34                               return ;
35                          }
36                      }
37                  }
38              }
39               this .EnableEventFiring();            
40          }

 

 

其实代码很简单就是把分配对象替换成代理人并给代理人赋权就OK了。我没有把事件触发写在adding事件里,感兴趣的朋友可以试试把触发代码写的adding事件中的效果是什么。

转载于:https://www.cnblogs.com/pottylee/archive/2010/01/14/1647750.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值