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
Shankeith 20 czerwiec 2011, 19:09

2 odpowiedzi

Najlepsza odpowiedź

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";
                }
            }



        }

    }
5
bpeterson76 21 czerwiec 2011, 20:08

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.

1
Community 23 maj 2017, 14:54
Nie, popełniłem prosty błąd, umieszczając go w zaznaczonym zamiast aktualizowanym, istnieje również obejście dla funkcji uruchamianej wiele razy podczas aktualizacji, po prostu utwórz kolumnę o nazwie „updateContributors” na liście i domyślną wartość True / Yes
 – 
Shankeith
21 czerwiec 2011, 17:46