我环顾四周,还没有找到解决方案。我到处拾取代码片段来寻找解决方案。
我有一个名为“文档协作”的文档库,其中包含“分配给”字段。这是人员/组字段。这些人将能够处理特定文档(列表项权限)。现在,首先,他们将具有隐藏权限(他们看不到它),但是当添加到文档时,他们将看到它并能够贡献它,他们还将收到电子邮件通知。我在下面附上了完整的代码。
所以,当我进行 VS10 调试时,我没有收到任何错误。但它不发送任何电子邮件或不设置权限。怎么了?
using System;
using System.IO;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;
namespace ARDT.Notifications
{
/// <summary>
/// List Item Events
/// </summary>
public class Notifications : SPItemEventReceiver
{
/// <summary>
/// An item was checked in
/// </summary>
public override void ItemCheckedIn(SPItemEventProperties properties)
{
SPSite site = new SPSite("http://sp2010dev/ardt");
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Document Collaboration"];
SPListItem listItem = properties.ListItem;
SPUser userName = null;
String toAddress = null;
//EMail initializations
bool appendHtmlTag = false;
bool htmlEncode = false;
string subject = "Subject";
string message = "Message text";
//get usernames
string[] userNameArray = listItem.Fields["Assigned to"].ToString().Split(';');
for (int i = 0; i <= userNameArray.Length - 1; i++)
{
userName = web.AllUsers[userNameArray[i]];
toAddress = userName.Email;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//EMAIL USER
bool result = SPUtility.SendEmail(web, appendHtmlTag, htmlEncode, toAddress, subject, message);
//PERMISSIONS
//remove permissions first
web.AllowUnsafeUpdates = true;
listItem.BreakRoleInheritance(false);
SPRoleAssignmentCollection raCollection = listItem.RoleAssignments;
//remove exisiting permissions one by one
for (int a = raCollection.Count - 1; i > -0; i--)
{
raCollection.Remove(a);
}
//grant permissions for specific list item
SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
SPRoleAssignment roleAssignment = new SPRoleAssignment(userName);
roleAssignment.RoleDefinitionBindings.Add(roleDefintion);
listItem.RoleAssignments.Add(roleAssignment);
listItem.Update();
});
}
}
base.ItemCheckedIn(properties);
}
}
}
最佳答案
不,我犯了一个简单的错误,将其置于检查状态而不是更新状态,还有一个解决方法是在更新时多次运行该函数,只需在列表中创建一个名为“updateContributors”的列并使用默认值正确/是
这是代码/没有时间解释,但评论很好,祝你好运:
using System;
using System.IO;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;
//Debugging includes
using System.Diagnostics;
namespace ARDT.Notifications
{
/// <summary>
/// List Item Events
/// </summary>
public class Notifications : SPItemEventReceiver
{
/// <summary>
/// An item was updated
/// </summary>
public override void ItemUpdated(SPItemEventProperties properties)
{
if (properties.ListItem["updateContributors"].ToString().Equals("True"))
{
//work around so it goes through it only once instead of everytime the item is updated
properties.ListItem["updateContributors"] = "False";
SPSite site = new SPSite("http://sp2010dev/ardt/");
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Document Collaboration"];
SPListItem listItem = properties.ListItem;
SPUser userName = null;
String toAddress = null;
//EMail initializations
bool appendHtmlTag = false;
bool htmlEncode = false;
string subject = "You have been assigned to a Document";
string message = "Test Message";
//get usernames
string tempFieldValue = listItem["Assigned To"].ToString();
string[] userNameArray = listItem["Assigned To"].ToString().Split(';');
//remove permissions first
web.AllowUnsafeUpdates = true;
listItem.BreakRoleInheritance(false);
SPRoleAssignmentCollection raCollection = listItem.RoleAssignments;
//remove exisiting permissions one by one
for (int a = raCollection.Count - 1; a >= 0; a--)
{
raCollection.Remove(a);
}
for (int i = 1; i < userNameArray.Length; i++)
{
tempFieldValue = userNameArray[i].Replace("#", "");
userName = web.AllUsers[tempFieldValue];
toAddress = userName.Email;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//EMAIL USER
bool result = SPUtility.SendEmail(web, appendHtmlTag, htmlEncode, toAddress, subject, message);
//PERMISSIONS
//grant permissions for specific list item
SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
SPRoleAssignment roleAssignment = new SPRoleAssignment(userName);
roleAssignment.RoleDefinitionBindings.Add(roleDefintion);
listItem.RoleAssignments.Add(roleAssignment);
listItem.Update();
});
i++;
}
}
//base.ItemUpdated(properties);
//after final update has been done return true
properties.ListItem["updateContributors"] = "True";
}
}
}
}
关于c# - 以编程方式列出项目多个用户权限(共享点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413374/