none
мой первый обработчик RRS feed

  • Вопрос

  •  привет!

     К списку метонахождение мне надо написать обработчик , который позволял бы менять записи в этом списке.

    поля : Расположение, Начало, Окончание , Замещающий.

    список работников бдет храниться в AD.

    вот что я написал :

     

    using System;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Microsoft.SharePoint.Utilities;
    using Microsoft.SharePoint.Workflow;
    namespace Verifyjob.EventReceiver1
    {
        /// <summary>
        /// События элемента списка
        /// </summary>
        public class EventReceiver1 : SPItemEventReceiver
        {
            /// <summary>
            /// Добавляется элемент.
            /// </summary>
            public override void ItemAdding(SPItemEventProperties properties)
            {
                base.ItemAdding(properties);
            }
            
             SPWeb site = SPContext.Current.Web;  
            /// <summary>
            /// Обновляется элемент.
            /// </summary>
            public override void ItemUpdating(SPItemEventProperties properties)
            {
                base.ItemUpdating(properties); // важно ли расположение этой строчки ( после или до ) и вообще что она делает.
                if (site.CurrentUser == properties.ListItem["Autor"] && properties.List.Title == "Местонахождение")
                {
                        // ChangeWhereabout(properties);  // изменение
                    properties.AfterProperties["Расположение"] = properties.UserLoginName.ToString();
                    properties.AfterProperties["Начало"] = properties.UserLoginName.ToString();
                    properties.AfterProperties["Окончание"] = properties.UserLoginName.ToString();
                    properties.AfterProperties["Замещающий"] = properties.UserLoginName.ToString();
                }
                else
                {
                    // не изменять
                }
            }
            /*
            private void ChangeWhereabout(SPItemEventProperties properties)
            {
                
                
                
                
                throw new NotImplementedException();
            }
            // в main создать список сотрудников и к нему применять метод ItemUpdating
            */
        
        }
    }


    так примерно ?  надо ли  пользоваться :

     SPSite site = new SPSite("http://localhost/Deps/CD");
                       SPWeb web = site.OpenWeb();

    надо ли использовать то, что сотрудники хранятся в AD. ?

    наверно еще надо эту строчку написать : ( ? )

    	SPSecurity.RunWithElevatedPrivileges(delegate()

    буду благодарен за советы

    спасибо!

    4 апреля 2012 г. 7:36

Ответы

  •  так примерно ?

    Примерно так.

      надо ли  пользоваться :
     SPSite site = new SPSite("http://localhost/Deps/CD");
     SPWeb web = site.OpenWeb();

    Если нужно открыть другой SPWeb, то да. Однако в вашем коде вы не используется SPWeb. Вам достаточно SPContext.Current.Web.CurrentUser.

    надо ли использовать то, что сотрудники хранятся в AD. ?

    Это вопрос логики вашего приложения. Подумайте над ней и поймете, нужно ли вам это или нет.

    наверно еще надо эту строчку написать : ( ? )

    	SPSecurity.RunWithElevatedPrivileges(delegate()

    Если предпологается, что у текущего пользователя нет прав на выполнения кода, то это один из способов обойти нехватку прав. Луше эту строчку избегать.

    буду благодарен за советы

    Вы ощутите очень большую пользу от прочтения начальных книг по разработке под SharePoint 2010. например, очень хороша книга SharePoint 2010 as development platform. Вопросы, которые Вы спрашиваете, описанны в этих книгах.


    SharePoint MCPD, MCITP. Высказанное мною здесь - мои личные взгляды, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    • Помечено в качестве ответа Roman Zhukov 17 апреля 2012 г. 11:36
    4 апреля 2012 г. 13:55
    Модератор
  • Нужно указать путь к сайту где должен быть развернут обработчик! Я так понимаю вы в сталте работаете?

    |Мой Блог | Мой твиттер |

    • Предложено в качестве ответа Serg_Strotskiy 9 апреля 2012 г. 5:16
    • Помечено в качестве ответа Roman Zhukov 17 апреля 2012 г. 11:36
    6 апреля 2012 г. 5:53

Все ответы

  • SPSecurity.RunWithElevatedPrivileges(delegate() эта строчка будет выполнять код от системной учетки , т.е. с максимальными правами

    base.ItemUpdating(properties); - указывайте в конце

    Посмотрите

    http://gandjustas.blogspot.com/2011/05/blog-post.html

    http://gandjustas.blogspot.com/2011/06/2.html

    И все станет яснее


    |Мой Блог | Мой твиттер |


    4 апреля 2012 г. 7:40
  • прочитал, к сожалению яснее не стало

    у меня есть список метонахождение , у него есть поля Расположение, Начало , Окончание.

    как написать , чтобы обработчик позволял менять значения этих полей ?  ( это ведь основы, наверно )

    там описан метод, который определяет изменилось поле нет.

    спасибо!

    4 апреля 2012 г. 8:46
  • может быть так :

           

    using System;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Microsoft.SharePoint.Utilities;
    using Microsoft.SharePoint.Workflow;
    namespace test2mak.EventReceiver1
    {
        /// <summary>
        /// События элемента списка
        /// </summary>
        public class EventReceiver1 : SPItemEventReceiver
        {
           /// <summary>
           /// Обновляется элемент.
           /// </summary>
           public override void ItemUpdating(SPItemEventProperties properties)
           {
               if (properties.ListTitle == "Местоположение")
               {
                   Change(properties);
               }
               
               base.ItemUpdating(properties);
           }
           private void Change(SPItemEventProperties properties)
           {
              // SPSite site = null;
               SPWeb web = null;
               try
               {
                   SPSecurity.RunWithElevatedPrivileges(delegate()
                   {
                       //site = new SPSite("http://localhost/Deps/CD");
                      //  web = site.OpenWeb();
                        SPWeb site = SPContext.Current.Web;  
                        if (site.CurrentUser == properties.ListItem["Autor"])
                       {
                           // разрешать изменение.  как это записать ?!!!
                           properties.AfterProperties["Имя"] = properties.ListItem["Имя"]; // может быть так??
                       }
                       else
                       {
                           properties.Cancel = true;
                       }
                   });
               }
                   
             
               finally
               {
                   if (web != null) { web.Dispose(); }
                // if (site != null) { site.Dispose(); }
               }
           }
        }
    }

    помогите, пожалуста
    4 апреля 2012 г. 11:47
  •  так примерно ?

    Примерно так.

      надо ли  пользоваться :
     SPSite site = new SPSite("http://localhost/Deps/CD");
     SPWeb web = site.OpenWeb();

    Если нужно открыть другой SPWeb, то да. Однако в вашем коде вы не используется SPWeb. Вам достаточно SPContext.Current.Web.CurrentUser.

    надо ли использовать то, что сотрудники хранятся в AD. ?

    Это вопрос логики вашего приложения. Подумайте над ней и поймете, нужно ли вам это или нет.

    наверно еще надо эту строчку написать : ( ? )

    	SPSecurity.RunWithElevatedPrivileges(delegate()

    Если предпологается, что у текущего пользователя нет прав на выполнения кода, то это один из способов обойти нехватку прав. Луше эту строчку избегать.

    буду благодарен за советы

    Вы ощутите очень большую пользу от прочтения начальных книг по разработке под SharePoint 2010. например, очень хороша книга SharePoint 2010 as development platform. Вопросы, которые Вы спрашиваете, описанны в этих книгах.


    SharePoint MCPD, MCITP. Высказанное мною здесь - мои личные взгляды, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    • Помечено в качестве ответа Roman Zhukov 17 апреля 2012 г. 11:36
    4 апреля 2012 г. 13:55
    Модератор
  • В обработчике ItemUpdating при сравнении site.CurrentUser == properties.ListItem["Autor"] сравнивается текущий пользователь с пользователем, кто создал данный элемент; В данном случае сравнение не корректное, посмотри какие значения принимает site.CurrentUser и properties.ListItem["Autor"]

    properties.AfterProperties["Имя"] = properties.ListItem["Имя"]; - лишняя строчка

    properties.AfterProperties["Имя"] - значение поля после изменения

    properties.ListItem["Имя"] - значение поля до изменения

    4 апреля 2012 г. 14:29
  •  В данном случае сравнение не корректное, посмотри какие значения принимает site.CurrentUser и properties.ListItem["Autor"]

     

     не корекктное из-за принимающего аргумента " Autor " ?

    Сами ведь написали :

     -    properties.ListItem["Имя"] - значение поля до изменения  .

     буду сравнивать текущего пользователя со значением, которое стоит в поле " Имя " до изменения пользователем.

    if (site.CurrentUser == properties.ListItem["Имя"])

     спасибо!

    5 апреля 2012 г. 6:56
  •  грубо говоря , когда я запускаю ( нажимаю F5)  у меня запускается соединение с сервером , он запускается

      и я могу проверять мой обработчик на деле , так ?

     Если это так , то это здорово .

        за исключением того, что то что я написал не действует так. как надо.  ( Добавил  пользователя  и убедился в том. что я могу менять его записи. )

    5 апреля 2012 г. 7:12
  • Вы посмотрите, что вам вернет site.CurrentUser - он вернет loginNameа properties.ListItem["Autor"] будет name

    рубо говоря , когда я запускаю ( нажимаю F5)  у меня запускается соединение с сервером , он запускается

      и я могу проверять мой обработчик на деле , так ? - можете!


    |Мой Блог | Мой твиттер |


    5 апреля 2012 г. 7:14
  • а как тогда сравнимать ?

     SPWeb site = SPContext.Current.Web;
                        SPUser user = site.CurrentUser;
                        string user2 = (string)user;
                        string userName = user.Name;
                         
                        /*
                       
                SPWeb site = SPContext.Current.Web;
                SPUser user = site.CurrentUser;
                string userName = user.Name;
                string key = properties.List.Fields["Имя"].InternalName; 
                object item = properties.AfterProperties[key]; 
                 */
                        if (userName == properties.ListItem["Имя"] )
                        {
                            // properties.ListItem["Имя"]
                            // разрешать изменение.  как это записать ?!!!
                            //properties.AfterProperties["Имя"] = properties.ListItem["Имя"]; // может быть так?? не нужно 
                        }

    попробовал по именам, но во-первых идет сравние ссылок ну и нет желаемого результата. и приведение типов ( Ошибка 2 Преобразование типов  )

    и надо ли мне тогда каждую операцию прописывать , которую может сделать пользоваеть согласно полю ( Распложение, Начало , Окончание )

    может через equals ...

    5 апреля 2012 г. 9:18
  • SPFieldUserValue oFieldUserValue = new SPFieldUserValue(oWeb, properties.ListItem["Author"].ToString());

    if(web.CurrentUser.Name == oFieldUserValue.User.Name)

    попробуйте так!


    |Мой Блог | Мой твиттер |

    5 апреля 2012 г. 10:05
  • спасибо !

    вот . по идеии должно работать !!!

    но не работает. а может работает , но  properties.Cancel = true - не срабатывает.

    я хочу поставить запрет! на изменение если не проходит сравнение loginName.

     

    using System;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Microsoft.SharePoint.Utilities;
    using Microsoft.SharePoint.Workflow;
    namespace Eventtest222whereabout.EventReceiver1
    {
        /// <summary>
        /// События элемента списка
        /// </summary>
        public class EventReceiver1 : SPItemEventReceiver
        {
           /// <summary>
           /// Обновляется элемент.
           /// </summary>
           public override void ItemUpdating(SPItemEventProperties properties)
           {
               if (properties.ListTitle == "Местонахождение")
               {
                   Change(properties);
               }
               base.ItemUpdating(properties);
               
           }
           
            private void Change(SPItemEventProperties properties)
            {
                
                //SPWeb web = null;
                try
                {
                    
                        
                       
                        SPWeb web = SPContext.Current.Web;
                        SPList list = web.Lists["Местонахождение"];
                        SPListItem item = list.Items[0];
                        SPFieldUserValue userValue = new SPFieldUserValue(web, item["Имя"].ToString());
                       if(web.CurrentUser.LoginName == userValue.User.LoginName)
                       {
                            //do something!
                       }
                       
                        else
                        {
                            properties.Cancel = true;
                        }
                        
                }
                
                catch { }
            }
        }
    }

    5 апреля 2012 г. 11:14
  • с помощью точки отанова я понял, что я не захожу в  void ItemUpdating :(

    5 апреля 2012 г. 12:50
  • Обработчик то хоть на тот тип списка сделали?

    |Мой Блог | Мой твиттер |

    5 апреля 2012 г. 12:58
  • гм... когда создавал обработчик в строке : Элемент, который должен быть источником событий .

    выбрал : Настраиваемый список.

    среди тех, из которых можно было выбрать - Местонахождения не было.

    а как узнать на какой я тип списка создал обработчик? :)

    и мне видимо надо пользоваться  этим:

     SPSite site = new SPSite("http://localhost/Deps/Service");
                       
                        SPWeb web = site.OpenWeb();

     так ?)))) просто я уже написал эти строки в ItemUpdating и вроде результата не принесло.))

    5 апреля 2012 г. 13:05
  • Ну это уж вам виднее должно быть какой тип списка вы использовали.
    localhost/Deps/Service - при создании ER этот путь указывали?

    |Мой Блог | Мой твиттер |

    5 апреля 2012 г. 13:58
  • если Вы  про строчку : Како локальный сайт следует использовать для откладки 

    то я пользовался тем , что стандартно мне предлагалось, т.е http://sp_1/

    а надо что ли другой путь ?

    спасибо!

    6 апреля 2012 г. 5:25
  • нет. я этот путь не указывал.

    а надо ?

    6 апреля 2012 г. 5:37
  • Нужно указать путь к сайту где должен быть развернут обработчик! Я так понимаю вы в сталте работаете?

    |Мой Блог | Мой твиттер |

    • Предложено в качестве ответа Serg_Strotskiy 9 апреля 2012 г. 5:16
    • Помечено в качестве ответа Roman Zhukov 17 апреля 2012 г. 11:36
    6 апреля 2012 г. 5:53
  •  спасибо.  да)

    6 апреля 2012 г. 6:02