Rozejrzałem się i jeszcze nie znalazłem rozwiązania. Zebrałem fragmenty kodu tu i tam, aby znaleźć rozwiązanie.
Mam bibliotekę dokumentów o nazwie „Współpraca nad dokumentami” z polem „Przypisane do”. To jest pole Osoby/Grupy. Te osoby będą mogły pracować nad określonym dokumentem (uprawnienia pozycji listy). Teraz na początku będą mieli ukryte uprawnienia (nie mogą tego zobaczyć), ale po dodaniu do dokumentu zobaczą go i będą mogli go współtworzyć, a także otrzymają powiadomienie e-mail. Poniżej załączam pełny kod.
Więc nie otrzymuję żadnych błędów, kiedy przechodzę przez debugowanie VS10. Ale nie wysyła żadnych e-maili ani nie ustawia uprawnień. Co jest nie tak?
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);
}
}
}
2 odpowiedzi
Nie, popełniłem prosty błąd, umieszczając go w zaznaczonym zamiast aktualizowanym, istnieje również obejście dla funkcji uruchamianej wielokrotnie podczas aktualizacji, po prostu utwórz kolumnę o nazwie „updateContributors” na swojej liście i domyślną wartość True / Yes
Oto kod / nie ma czasu na wyjaśnienia, ale dość skomentowany, powodzenia:
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";
}
}
}
}
Jeden z problemów, które masz w swoim kodzie - tworzysz obiekt SPWeb
w bieżącym kontekście wykonania, ale potem próbujesz wysłać pocztę za pomocą SPSecurity.RunWithElevatedPrivileges
. Nigdy nie należy otwierać sieci na jednym koncie, a następnie używać go na innym. Musisz ponownie utworzyć kontekst w bloku RunWithElevatedPrivileges
jak widać na tym przykładzie.
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.