Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8351066
  • 博文数量: 444
  • 博客积分: 10593
  • 博客等级: 上将
  • 技术积分: 3852
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-09 15:26
文章分类

全部博文(444)

文章存档

2014年(1)

2013年(10)

2012年(18)

2011年(35)

2010年(125)

2009年(108)

2008年(52)

2007年(72)

2006年(23)

分类: WINDOWS

2009-10-22 14:30:35

基于AD的用户组织目录树选择工具的解决方案

默认情况下,MOSS具有的用户选择器非常不方便,我们的领导希望用组织目录树的方式来进行人员的选择,当然,这可难倒我了。最后我选择了自定义字段来进行开发,解决这样的问题。不知道是否也有人和我碰到同样的问题呢。

那么,首先我们来看moss默认的用户选择器

这个界面很适合老外的简单操作的风格,但是对于有中国特色的组织那就没有办法了。
那么,我们通过开发一个自定义字段来解决这样的一些问题。
首先我们把编写好的自定义字段安装上去,该步骤省略,等我的整体解决方案公布后会提供安装的方法,现在由于只是DEMO,就没有直接放代码了。
我们可以看到下图
2

已经有了用来调用组织单位的目录树的自定义字段了。

设置标题为选择人员,点击确定得到下图
3
从这个图中我们可以看出这个自定义字段有两个控件,一个是文本框,用来存储你选择的用户,另外一个是连接,由于用户选择器一般都比较大,我选择新弹出窗口来实现,而不直接写到自定义字段内,新弹出的窗口是一个标准的ASPX的文件,我们可以把它部署在_LAYOUTS目录地下。
下面我们点击选择,就会跳出下面的窗口
4

从这张图中你就可以看出大概的样子了。

左边这个是用TREEVIEW递归读取的AD的组织结构
当我们点击某个部门的时候,他将列举出该部门下的所有人员,如下图


细心的同学可以发现在中间的框里有一个包含下级的选择框,当我们打勾后将出现该部门的下属部门的所有人员,方便管理人员选择他的直接下级。
在人员列出后,我们打勾进行人员选择,点旁边的>>号即可将这些人员提交到第三栏,当前选择人员中。如下图
7
点击确定后,我们将回到MOSS界面,同时也会将值传递到刚才那个文本框里,如下图(注意:这里我们存储的是中文的名称,但是这并不妨碍我们实际存储的值为LOGinNAME。)
8

最后我们将该记录保存,在查看视图中可以发现,我们的记录事实上是以登录的帐号来进行保存的,以确定唯一性,如下图

9

好了。演示完毕,
目前只是demo,接下来还要做的是整理成WSP包,以及存储成user字段,参数设置等调整,请大家耐心等待。如果有什么问题,请到我的BLOG进行留言。
 
整个项目文件在此下载
 
 
目录树的.net程序在此下载
 
Tag标签: sharepoint
0
0
(请您对文章做出评价)
posted @ 2009-01-22 09:51 雷君 阅读(365) 评论(7)  编辑 收藏 网摘 所属分类: sharepoint

  回复  引用  查看    
#1楼2009-01-22 14:03 | virus      
我现在有一个需求,就是新闻的发布管理,我分三个列表库存放:未发布,已发布,已过期
在已发布中如果修改的话就要移动到未发布中去,我写了已发布列表的eventhandler
代码如下
public override void ItemUpdated(SPItemEventProperties properties)
{
//SPFileCollection releasedFiles = properties.ListItem.Web.GetFolder("DocLib").Files;
//SPFileCollection unReleasedFiles = properties.ListItem.Web.Folders["Pages"].Files;

//unReleasedFiles.Add(properties.ListItem.Name, releasedFiles[properties.ListItem.Name].OpenBinary(), true);
SPListItem item = properties.ListItem;
string filename = item.Name.ToString(); ;
using (SPSite site = item.Web.Site)
{
using (SPWeb web = item.Web)
{

if (Helper.IsAdmin(item.Web, "动态管理员") || Helper.IsSiteAdmin(item.Web))
{
//SPFileCollection sourceFiles = web.Folders["DocLib"].Files;
//SPFileCollection releasedFiles = web.GetFolder("DocLib").Files;
//SPFileCollection unReleasedFiles = web.Folders["Pages"].Files;
//byte[] bFile = releasedFiles[item.Name].OpenBinary();
//unReleasedFiles.Add(item.Name, bFile, true);

this.DisableEventFiring();

web.Folders["DocLib"].Files[properties.AfterUrl.Substring(properties.AfterUrl.IndexOf("/") + 1)].CopyTo(item.Web.Url + "/" +
item.Web.Lists["未发布动态"].RootFolder.Url + "/" + properties.AfterUrl.Substring(properties.AfterUrl.IndexOf("/") + 1), true);
web.Folders["DocLib"].Files[properties.BeforeUrl].Delete();
this.EnableEventFiring();

}
else
{
properties.Cancel = true;
properties.ErrorMessage = "只有站点集管理员和动态管理员可以修改条目";
}
}
}

}

可是修改的时候如果不修改文档的URL,可以copyto,delete没有执行
如果修改文档的URL,就那个都不执行了,可以帮我看看吗
这个itemupdated事件还像挺特殊的,不好用啊

  回复  引用  查看    
#2楼2009-01-22 14:10 | virus      
还有就是部署事件处理的时候
我是这样写的
//using (
// SPSite site = new SPSite("))
//{
// using (SPWeb web = site.OpenWeb("admintasks/corpTrend"))
// {
// SPList list = web.Lists["鏈?彂甯冨姩鎬?];
// //SPList list = web.Lists["宸插彂甯冨姩鎬?];
// while (list.EventReceivers.Count > 0)
// {

// list.EventReceivers[0].Delete();
// }

// list.EventReceivers.Add(SPEventReceiverType.ItemDeleting, "CorpTrendEventDemo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a43d2339e64c2a16", "CorpTrendEventDemo.CorpTrendUnReleasedItem");

// list = web.Lists["宸插彂甯冨姩鎬?];
// while (list.EventReceivers.Count > 0)
// {
// list.EventReceivers[0].Delete();
// }


// list.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "CorpTrendEventDemo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a43d2339e64c2a16", "CorpTrendEventDemo.CorpTrendReleasedItem");

// list.EventReceivers.Add(SPEventReceiverType.ItemDeleting, "CorpTrendEventDemo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a43d2339e64c2a16", "CorpTrendEventDemo.CorpTrendReleasedItem");
// list = web.Lists["宸茶繃鏈熷姩鎬?];
// while (list.EventReceivers.Count > 0)
// {
// list.EventReceivers[0].Delete();
// }


// list.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "CorpTrendEventDemo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a43d2339e64c2a16", "CorpTrendEventDemo.CorpTrendExpiredItem");

// list.EventReceivers.Add(SPEventReceiverType.ItemDeleting, "CorpTrendEventDemo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a43d2339e64c2a16", "CorpTrendEventDemo.CorpTrendExpiredItem");

// }

//}
上面的代码是不是在我第一次部署的时候执行就可以了,以后如果我修改了handler,就把dll拖入gac就可以了,还是上面的部署代码也要重新执行呢,

  回复  引用  查看    
#3楼2009-01-22 14:15 | virus      
我的这个问题两三天了,还是没有很好的解决,不知道你有没有遇到呢
  回复  引用  查看    
#4楼2009-01-22 14:15 | virus      
或者类似需求的解决办法呢

  回复  引用  查看    
#5楼[楼主]2009-01-22 14:41 | 雷君      
1.新闻的发布管理,我分三个列表库存放:未发布,已发布,已过期

你为什么不放在一个列表呢.你可以放在一个列表里,然后建立一个状态的选择字段.通过改变状态来实现,这个比事件处理简单多了.
itemupdated我们在项目过程中都没有出现什么问题,估计是你自己代码写错的问题了.这个估计得详细去试了才知道,简单看这些代码可能也看不出什么

2.eventhandler部署的时候,如果那些assambly信息没有变更的话,只需要执行一次就行了.只需要部署到GAC就好,可以不用注册

  回复  引用  查看    
#6楼2009-01-22 15:27 | virus      
@雷君
eventhandler第一次部署到gac之后,我没有添加事件接受方法,只是修改了原来的方法的代码,是不是就部署到gac就可以了,如果添加了事件接受方法,就需要重新EventReceivers.Add了吧

  回复  引用  查看    
#7楼[楼主]2009-01-22 15:30 | 雷君      
是这个意思
阅读(1088) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~