2013-09-13 1 views
1

Так что я пытаюсь выполнить такую ​​функциональность на моем SharePoint 2010 список:Получить SharePoint ListItem-х до и после свойства в Event Receiver

У меня есть поле выбора типа в моем списке, который имеет 7 значений и я хочу, чтобы пользователи не могли изменить значение этого поля со значений 2,3,4,5,6,7 до значения 1.

Я написал приемник событий для этого списка, вот мой код:

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

     string beforeStatus = properties.BeforeProperties["Status"].ToString(); 
     string afterStatus = properties.AfterProperties["Status"].ToString(); 

     if (beforeStatus != "1stValue" && afterStatus == "1stValue") 
     { 
      properties.Cancel = true; 
      properties.ErrorMessage = "This isn't allowed."; 
     } 
    } 

Я попытался использовать как ItemUpdated и ItemUpdating накануне nt, когда я был отлажен, я увидел, что приемник событий получил так, как должно быть, но beforeStatus и afterStatus получает null от предмета в обоих случаях.

Итак, как я могу получить значения поля элемента до и после обновления правильно? Заранее спасибо!

Примечание: внутренние и отображаемые названия полей являются Status.

ответ

4

Используйте ItemUpdating события, а затем afterproperties содержит измененное значение и ListItem содержит исходное значение поля.

Here Вы можете найти информацию о том, какие свойства доступны для каждого события.

Также важно, как вы редактируете элемент списка. Если по форме редактирования по умолчанию SharePoint все столбцы присутствуют в коллекции afterproperties, но если вы отредактируете элемент из настраиваемого кода (например, webpart, получение события), в этой коллекции будут присутствовать только обновленные столбцы.

Edit: Для хороших ошибок ищет вы можете перенаправить пользователя на страницу ошибки (которые необходимо создать)

properties.Cancel = true; 
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl; 
properties.RedirectUrl = "/_layouts/MySolution/CustomErrorPage.aspx?Error=" + errorMessage; 
+0

Я нашел ту же статью и решил эту всего пару минут, прежде чем (см мой ответ): D Спасибо, так или иначе! –

+0

И может ли он каким-либо образом оповестить какое-либо сообщение пользователю и вернуться в форму редактирования без сохранения? :) –

+0

О, и еще одно: если пользователь редактирует какое-то другое поле, чтобы он не обновлялся? Итак, мне нужно добавить 'properties.AfterProperties [" Status "] = beforeStatus;' в мой код и ничего не отменить? –

1

Я нашел решение этой проблемы самостоятельно:

Согласно этому article, я обнаружил, что если я хочу, чтобы получить как старые и новые значения, я должен использовать ItemUpdating приемник событий и используйте properties.ListItem, чтобы получить старые значения и properties.AfterProperties, чтобы получить новые.

Хотя сообщение об ошибке выглядит ужасно для пользователей: error

Я попытаюсь решить это сейчас :)

Смежные вопросы