none
Перенаправление на окно с формой из обработчика событий? RRS feed

  • Вопрос

  • Добрый день! У мня есть обработчик событий который после создания документа в библиотеке Shartepoint Foundation 2010 ищет текущего пользователя во всех группах, возвращает список найденных групп пользователя и перезаписывает права на документ.

    Надо чтобы после того как он нашел группы, передать это список в оконную форму с возможностью отметить одну или более группы, затем нажать кнопку "Ок" и передать отмеченные группы обратно в обработчик событий для переназначение прав на документ. Как это сделать???

    Вот мой код обработчика событий:

    using System;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Microsoft.SharePoint.Utilities;
    using Microsoft.SharePoint.Workflow;

    namespace EventReceiverProject7.EventReceiver1
    {
        /// <summary>
        /// События элемента списка
        /// </summary>
        public class EventReceiver1 : SPItemEventReceiver
        {
            /// <summary>
            /// Добавлен элемент.
            /// </summary>
            public override void ItemAdded(SPItemEventProperties properties )
            {
                base.ItemAdded(properties);
                using (SPSite site = new SPSite(properties.WebUrl))
                {
                    using (SPWeb web = site.OpenWeb())
                    {
                        SPUser currentUser = web.CurrentUser;
                        SPGroupCollection asd = currentUser.Groups;
                        foreach (SPGroup group in asd)
                        {
                            SetSPListItemUserPermissions(properties.ListItem, group, SPRoleType.Contributor);
                        }
                    }
                }
            }

            /// <summary>
            /// Обновлен элемент.
            /// </summary>

            public override void ItemUpdated(SPItemEventProperties properties)
            {
                base.ItemUpdated(properties);

                using (SPSite site = new SPSite(properties.WebUrl))
                {
                    using (SPWeb web = site.OpenWeb())
                    {
                        SPUser currentUser = web.CurrentUser;
                        SPGroupCollection asd = currentUser.Groups;
                        
                        foreach (SPGroup group in asd)
                        {
                            SetSPListItemUserPermissions(properties.ListItem, group, SPRoleType.Contributor);
                        }
                     }
                }
           }
      
            public void SetSPListItemUserPermissions(SPListItem listItem, SPPrincipal Principal, SPRoleType roleType)
            {

                //Break role inheritance
                if (!listItem.HasUniqueRoleAssignments)
                    listItem.BreakRoleInheritance(false);
                listItem.Update();

                //Create new role
                var roleDefinition = listItem.Web.RoleDefinitions.GetByType(roleType);
                var roleAssignment = new SPRoleAssignment(Principal);
                roleAssignment.RoleDefinitionBindings.Add(roleDefinition);

                //Assign new role
                listItem.RoleAssignments.Add(roleAssignment);
                listItem.Update();
            }
        }
    }

    28 ноября 2012 г. 8:27

Ответы

Все ответы

  • В такой постановке - никак
    29 ноября 2012 г. 12:39
  • Добрый день

    Можно попробовать сделать следующий адгоритм:

    1) пользователь вносит изменения в элемент списка

    2) срабатывает обработчик событий, вызывается соответствующий базовый метод в переопределенной функции

    3) далее отменяете обработчик с редиректом на вашу форму.

    4)....

    5) профит.


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    30 ноября 2012 г. 9:41
  • А если сделать так что обработчик передает список группы в поле типа "пользователь или группа", но поле "пользователь или группа" добавляются динамически и с полем типа checkbox с множественным выбором. А потом после того как пользователь выбрал нужные группы перезаписывались права???
    3 декабря 2012 г. 9:53
  • Добрый день

    Можно попробовать сделать следующий адгоритм:

    1) пользователь вносит изменения в элемент списка

    2) срабатывает обработчик событий, вызывается соответствующий базовый метод в переопределенной функции

    3) далее отменяете обработчик с редиректом на вашу форму.

    4)....

    5) профит.


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    А есть примеры такого решения?
    7 декабря 2012 г. 13:56
  • А есть примеры такого решения?

    public override void ItemUpdating(SPItemEventProperties properties)
    {
        base.ItemUpdating(properties);
    
        //выташить нужные параметры из properties
        string propsAsUrlParams = SomeFuncSerializeProps(properties);
        //получить урлу для редиректа
        string redirectUrl = string.Format("/_layouts/SomeFolder/MyForm.aspx{0}", propsAsUrlParams );
    
        properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
    
        properties.RedirectUrl = redirectUrl
    }
    
    Попробуйте так примерно.


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    8 декабря 2012 г. 7:50
  • А как мне потом из формы вернуть нужные значения в обработчик для раздачи прав?
    10 декабря 2012 г. 7:11
  • А как мне потом из формы вернуть нужные значения в обработчик для раздачи прав?

    К сожалению никак.

    Event Receiver-ы не предназначены для интерактивных отображений диалогов.

    Но вы можете всю логику назначения прав реализовать на форме.

    Единственный вопрос - вы уверены что для предоставления пользователю возможности выбрать права при помощи диалогового окна, инициировать это событие нужно именно из Event Receiver's ?


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    10 декабря 2012 г. 7:51
  • Получается такая схема: пользователь создает документ -> срабатывает обработчик событий который берет все группы текущего пользователя и передает их в форму -> в форме будет список групп с полем выбора(checkbox) и кнопкой сохранить, после нажатия кнопки сохранить снимается состояние checkbox-ов и тут же назначаются права на документ. Я правильно описал схему?
    10 декабря 2012 г. 9:01
  • Получается такая схема: пользователь создает документ -> срабатывает обработчик событий который берет все группы текущего пользователя и передает их в форму -> в форме будет список групп с полем выбора(checkbox) и кнопкой сохранить, после нажатия кнопки сохранить снимается состояние checkbox-ов и тут же назначаются права на документ. Я правильно описал схему?

    Да все верно,

    Только есть нюанс, я бы порекомендовал передавать из ресивера в форму только некоторые данные, и уже в форме обрабатывать всю логику, связанную с получением всех групп текучего пользователя и тд.

    Receiver в данном случае использовать только как средство перенаправления запроса на вашу форму.


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    10 декабря 2012 г. 9:49
  • То есть мне надо сделать так что бы обработчик после создания документа направлял на форму, а в форме уже брались все группы текущего пользователя и выводились в диалоговом окне как список с чекбоксами и там же назначались права на документ?

    10 декабря 2012 г. 13:28
  • То есть мне надо сделать так что бы обработчик после создания документа направлял на форму, а в форме уже брались все группы текущего пользователя и выводились в диалоговом окне как список с чекбоксами и там же назначались права на документ?

    Да

    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    10 декабря 2012 г. 13:36
  • А не подскажите какой нибудь пример формы с динамическими полями checkbox и people picker? Или как можно стандартное поле "пользователь или группа" изменить его представление в виде списка с чекбоксами? А может просто вывести список групп с чекбоксами в форме?
    10 декабря 2012 г. 15:25
  • Как мне вывести список групп в диалоговое окно или форму для выбора одной или нескольких групп??? Вот из этого кода:

    public override void ItemAdded(SPItemEventProperties properties)
           {
               base.ItemAdded(properties);
               SPSite site = new SPSite(properties.WebUrl);

               SPWeb web = site.OpenWeb();
               SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["Test_Doc_Lib"];
               SPGroup oGroup = web.SiteGroups["Программисты"];
               var groups2 = new SPFieldUserValueCollection();
               groups2.Add(new SPFieldUserValue(web, oGroup.ID, oGroup.Name));
               SPUser currentUser = web.CurrentUser;
               SPGroupCollection asd = currentUser.Groups;
               var groups = new SPFieldUserValueCollection();
               foreach (SPGroup group in asd)
               {

                   //foreach (SPFieldUserValue group in groups)
                   groups.Add(new SPFieldUserValue(web, group.ID, group.Name));

               }
               EventFiringEnabled = false;
               // properties.ListItem["ответственный"] = oGroup;
               properties.ListItem["ответственный"] = groups + ";#" + groups2;
               properties.ListItem.Update();
               EventFiringEnabled = true;

               var userValues = (SPFieldUserValueCollection)properties.ListItem["ответственный"];
               foreach (SPFieldUserValue userValue in userValues)
               {
                   var user = properties.Web.SiteGroups.GetByID(userValue.LookupId);
                   SetSPListItemUserPermissions(properties.ListItem, user, SPRoleType.Contributor);
               }

           }

    Если есть пример кода буду очень благодарен.

    12 декабря 2012 г. 14:31
  • В code-behind на форме сделать все тоже самое (только вместо свойств объекта SPItemEventProperties использовать параметры передаваемые через URL)

    Для рендеринга самое простое решение - CheckBoxList


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    12 декабря 2012 г. 15:07
  • В code-behind на форме сделать все тоже самое (только вместо свойств объекта SPItemEventProperties использовать параметры передаваемые через URL)

    Для рендеринга самое простое решение - CheckBoxList


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    А как мне в CheckBoxList передать значения из SPFieldUserValueCollection или SPGroupCollection???
    13 декабря 2012 г. 14:00
  • А как мне в CheckBoxList передать значения из SPFieldUserValueCollection или SPGroupCollection???

    ...

    чтобы вы не искали - вот прямая ссылка.


    View Oleg Nesterov's profile on LinkedIn
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    • Помечено в качестве ответа Ruslan P 14 декабря 2012 г. 7:04
    • Изменено HeToC 14 декабря 2012 г. 7:26 тогда "пардоньте"
    13 декабря 2012 г. 15:58
  • Нет я не троллю, просто я начинающий программист sharepoint. Я только изучаю c# и sharepoint? но начальство поджимает со сроками. Спасибо большое за помощь!
    14 декабря 2012 г. 7:04