Элемент списка разрешений для нескольких пользователей программно (sharepoint) - PullRequest
2 голосов
/ 20 июня 2011

Я огляделся и пока не нашел решения. Я нашел фрагменты кода здесь и там, чтобы найти решение.

У меня есть библиотека документов под названием «Совместная работа с документами» с полем «Назначено». Это поле Люди / Группы. Эти люди смогут работать над конкретным документом (разрешение на элемент списка). Теперь, во-первых, у них будут скрытые разрешения (они не могут его видеть), но когда они добавлены в документ, они увидят его и смогут добавить, а также получат уведомление по электронной почте. Я приложил полный код ниже.

Итак, я не получаю никаких ошибок при прохождении отладки 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);
           }

        }
    }

Ответы [ 2 ]

5 голосов
/ 21 июня 2011

Нет, я совершил простую ошибку, установив флажок вместо обновленного. Также есть обходной путь для функции, запускаемой несколько раз при обновлении, просто сделайте столбец с именем "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";
                }
            }



        }

    }
1 голос
/ 20 июня 2011

Одна из проблем, с которой вы столкнулись в своем коде - вы создаете объект SPWeb в текущем контексте выполнения, но затем пытаетесь отправить почту, используя SPSecurity.RunWithElevatedPrivileges.Вы никогда не должны открывать Интернет с одной учетной записью, а затем использовать ее в другой.Вы должны заново создать контекст в RunWithElevatedPrivileges block , как это видно в этом примере .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...