Élément de liste à plusieurs utilisateurs d'autorisations par programmation (sharepoint)
J'ai regardé et n'ai pas trouvé de solution pour le moment. J'ai ramassé des fragments de code ici et là pour trouver une solution.
J'ai un Doc Bibliothèque appelée "Collaboration" avec le champ "Assignés". C'est une des Personnes/Groupes de champ. Ces personnes seront en mesure de travailler sur un document(élément de la liste de l'autorisation). Aujourd'hui, au premier, ils ont caché des autorisations(ils ne peux pas le voir), mais lorsqu'il est ajouté à la doc, ils pourront voir et être capable de contribuer, aussi, ils recevront un email de notification. J'ai joint le code complet ci-dessous.
Donc, je n'obtiens aucune erreur, quand je vais à travers VS10 de débogage. Mais il ne pas envoyer de courriel ou de ne pas définir les autorisations. Quel est le problème?
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);
}
}
}
Vous devez vous connecter pour publier un commentaire.
nope, j'ai fait l'erreur simple de le mettre sous vérifié au lieu de la mise à jour, il y a également un travail autour de la fonction en cours d'exécution à plusieurs reprises lorsqu'il met à jour, il suffit de faire une colonne appelée "updateContributors" dans votre liste et la valeur par défaut True/Yes
Voici le code/pas le temps d'expliquer, mais assez commenté, bonne chance:
L'un des problèmes que vous avez dans votre code - vous créer le
SPWeb
objet dans le contexte d'exécution en cours, mais ensuite, essayez d'envoyer des messages à l'aide deSPSecurity.RunWithElevatedPrivileges
. Vous ne devez jamais ouvrir le web avec un compte et l'utiliser dans une autre. Il faut re-créer le contexte dansRunWithElevatedPrivileges
bloc comme on peut le voir dans cet exemple.