This was the situation:
I have a SharePoint Foundation 2010 project in VS2010. There I deploy some SharePoint lists with custom views an custom form pages.
In one case I wanted to override the RaisePostBackEvent method of the customized form page. In the method I wanted to do some actions before the Save button code is executed. (Its the standard Save button of a SharePoint list form: <SharePoint:SaveButton...>
.
The overridden RaisePostBackEvent locked like this:
1: protected override void RaisePostBackEvent(System.Web.UI.IPostBackEventHandler sourceControl, string eventArgument)
2: {
3: if (sourceControl is System.Web.UI.WebControls.Button )
4: {
5: System.Web.UI.WebControls.Button button = ((System.Web.UI.WebControls.Button )sourceControl);
6: if (button.ClientID.StartsWith(savebutton1.ClientID) || button.ClientID.StartsWith(savebutton2.ClientID))
7: {
8: using (SPWeb web = SPContext .Current.Web)
9: {
10: //some code
11: }
12: }
13: };
14:
15: base .RaisePostBackEvent(sourceControl, eventArgument);
16: }
17:
18:
When executing the custom list form page there was no errors when I filled all field input boxes with data and press the Save button. But as I tried the “required field” functionality – leaving some fields blank – the SharePoint system throws the following error message in the SharePoint log:
06/15/2010 18:11:19.94 w3wp.exe (0x1384) 0x0E5C SharePoint Foundation Runtime tkau Unexpected Microsoft.SharePoint.SPException: Trying to use an SPWeb object that has been closed or disposed and is no longer valid. at Microsoft.SharePoint.WebPartPages.SPWebPartManager.ThrowIfManagerIsInvalid() at Microsoft.SharePoint.WebPartPages.SPWebPartManager.get_LimitedWebPartManager() at Microsoft.SharePoint.WebPartPages.SPWebPartManager.LoadConnectionsState() at Microsoft.SharePoint.WebPartPages.SPWebPartManager.CreateWebPartsFromRowSetData(Boolean onlyInitializeClosedWebParts) at Microsoft.SharePoint.WebPartPages.SPWebPartManager.LoadWebParts() at Microsoft.SharePoint.WebPartPages.SPWebPartManager.OnPageInitComplete(Object sender, EventArgs e) at System.EventHandler.Invoke(Object sender, EventArgs e) at System.Web.UI.Page.OnInitComplete(EventArgs e) at Sal... b196095c-b664-4f3c-b764-f9b3ef8ac5db 06/15/2010 18:11:19.94* w3wp.exe (0x1384) 0x0E5C SharePoint Foundation Runtime tkau Unexpected ...esAppLists.Layouts.SalesApp.AddDecisionMakerForm.OnInitComplete(EventArgs e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) b196095c-b664-4f3c-b764-f9b3ef8ac5db 0
After some debugging and thinking about it I realized that it only happens when the I press the Save button and this action will not close the dialog frame of the list form page. This means: The postback action does more than “store data and leave the dialog frame”.
So I figured out that there is a overridden RaisePostBackEvent method on the page.
I removed the method for testing purpose… and the problem was away!
It seems to me that it is not possible to use using (SPWeb web = SPContext.Current.Web)
in such a method.