Nishand's Blog

Welcome to my personal blog, All the information in this bogs is my ideas,findings and thoughts on .Net, Asp.Net and SharePoint.
ALL POSTING ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND

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!

Published Monday, September 21, 2009 2:35 PM by nishandv

Comments

No Comments
Anonymous comments are disabled

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker