SPWebPartManager doesn't honour the WebPartCancelEventArgs.Cancel value while deleting the webpart
Some scenarios developers may want to restrict users from deleting webparts from a page, the scenarios varies.
SPWebPartManager has got a event named ‘OnWebPartDeleting’.The issue here is, the deletion of the webpart cannot be
avoided by setting the WebPartCancelEventArgs.Cancel = true; within the ‘OnWebPartDeleting’ event.
So the SPWebPartManager’s ‘OnWebPartDeleting’event is not going to help us in accomplishing our requirement, here I have a workaround, it may help you!
……….
<script runat="server">
protected void On_WebPartDeleting(object sender, WebPartCancelEventArgs e)
{
Page.Response.Write("Sorry! This webpart cannot be deleted!<br>");
e.Cancel = true;
}
</script>
<form >
<WebPartPages:SPWebPartManager OnWebPartDeleting="On_WebPartDeleting" id="m" runat="Server"/>
As a workaround your can implement this, not sure you like this approach:)
Develop a custom HttpModule to trace the WebPart delete events, basically tracing the ‘__EVENTARGUMENT’ value.
See below the implementation.
1: void application_PostAuthorizeRequest(object sender, EventArgs e)
2: {
3: HttpContext context = HttpContext.Current;
4:
5: if (context != null && context.Request.Params["__EVENTARGUMENT"] != null && Convert.ToString(context.Request.Params["__EVENTARGUMENT"]).Length > 1)
6: {
7: string contextValue = context.Request.Params["__EVENTARGUMENT"];
8:
9: if (contextValue.Contains("MSOMenu_Delete"))
10: {
11: try
12: {
13: string[] keyValue = contextValue.Split(new char[] { ';' });
14: Guid guid = new Guid(keyValue[0]);
15: SPWeb web = SPContext.Current.Web;
16: SPLimitedWebPartManager manager = web.GetLimitedWebPartManager(context.Request.RawUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
17: System.Web.UI.WebControls.WebParts.WebPart webpart = manager.WebParts[guid];
18: context.Response.Write("<h5><font color=red>Sorry, you do not have the rights to delete this webpart. Please contact your admin.</font></h5><br><a href=" + context.Request.RawUrl+ ">Back</a>");
19:
20: context.Response.Flush();
21: context.Response.End();
22: }
23: catch (Exception ex)
24: {
25: }
26: }
27: }
This is a tricky workaround, however if you are looking for options to achieve this functionality then this would help.
Enjoy!