So I'm trying to accomplish this kind of functionality on my SharePoint 2010 list:
I have a field of type choice in my list, which has 7 values and i want users not to be able to change the value of that field from values 2,3,4,5,6,7 to value 1.
I've written an event receiver for that list, here's my code:
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.";
}
}
I've tried using both ItemUpdated
and ItemUpdating
event receivers, when I was debugging I saw that the event receiver get's called as it should be, but beforeStatus
and afterStatus
is getting null
from the item in both cases.
So, how can I get the values of the item's field before and after updating correctly? Thanks in advance!
Note: the field's internal and display names are both Status
.
Use ItemUpdating event and then afterproperties contains changed value and ListItem contains original value of a field.
Here you can find info what properties are avaialable in each events.
It is also important how do you edit the list item. If via SharePoint default edit form all columns are present in afterproperties collection, but if you edit an item from custom code (e.g. webpart, event receive) only updated columns are present in that collection.
Edit: For good looking errors you can redirect user to custom error page (which you have to create)
properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/MySolution/CustomErrorPage.aspx?Error=" + errorMessage;