我现在有一个需求,就是新闻的发布管理,我分三个列表库存放:未发布,已发布,已过期
在已发布中如果修改的话就要移动到未发布中去,我写了已发布列表的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事件还像挺特殊的,不好用啊
还有就是部署事件处理的时候
我是这样写的
//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就可以了,还是上面的部署代码也要重新执行呢,
#5楼[
楼主]2009-01-22 14:41 |
1.新闻的发布管理,我分三个列表库存放:未发布,已发布,已过期
你为什么不放在一个列表呢.你可以放在一个列表里,然后建立一个状态的选择字段.通过改变状态来实现,这个比事件处理简单多了.
itemupdated我们在项目过程中都没有出现什么问题,估计是你自己代码写错的问题了.这个估计得详细去试了才知道,简单看这些代码可能也看不出什么
2.eventhandler部署的时候,如果那些assambly信息没有变更的话,只需要执行一次就行了.只需要部署到GAC就好,可以不用注册