Monday, January 23, 2012

SPLongOperation error for ItemAdding Event In SharePoint 2010



We recently upgrade one of our project from SharePoint 2007 to SharePoint 210. In that project we user event handler for list. In ItemAdding event we use to create new site which takes times for creation. So we use SPLongOperation to handle it  but in SharePoint 2010 its same code gives error for "Object reference null" for SPLongOperation being statement.
So we had following workaround for this problem.

Create Web Part with following Code and add this web part to publishing Page

protected override void CreateChildControls(){
 if (this.Page.Request.QueryString["Processid"] != null)
            {           

                using (SPLongOperation ctx = new SPLongOperation(this.Page))
                {
                    try
                    {
                        ctx.LeadingHTML = "Please wait while your operation is being executed.";
                        ctx.TrailingHTML = "Site is being created. Please wait....";
                        ctx.Begin();

                        System.Threading.Thread.Sleep(5000);
                        string eid = this.Page.Request.QueryString["Processid"].ToString();
                        int count = 1;
                        while (true)
                        {
                            using (SPWeb web = SPContext.Current.Site.OpenWeb(SPContext.Current.Web.ID))
                            {
                                if (web.Properties[eid].ToString() != "Completed" && count < 18)
                                {

                                    System.Threading.Thread.Sleep(5000);
                                    count++;
                                }
                                else
                                    break;
                            }
                        }
                        ctx.End(this.Page.Request.QueryString["h"].ToString());
                    }
                    catch (Exception ex)
                    {
                        this.lbl.Text = ex.Message.ToString() + Environment.NewLine + ex.StackTrace.ToString() ;
                    }
                }
            }
}

In event handler modify ItemAdding event as follows

 public override void ItemAdding(SPItemEventProperties properties)
        {
            base.ItemAdding(properties);
            string guid
                = string.Format("ProcessId{0}_{1}", DateTime.Now.ToString("MMddyyyy"), Guid.NewGuid().ToString());
            Thread thread = new Thread(() => FunctionName(properties,guid));
            thread .Start();

            properties.Status = SPEventReceiverStatus.CancelNoError;
            properties.Cancel = true;
            SPUtility.Redirect({Url of page on which out put above webpart}, SPRedirectFlags.Default, _currentContext,string.Format ("Processid={0}&h={1}",guid , properties.RelativeWebUrl));
        }

Hope this work for you also

Tuesday, January 17, 2012

Using PowerShell Command for Visual Upgrade

Upgrade Visual from SharePoint 2007 to SharePoint 2010 after restoring Content Database on SharePoint 2010 Server.

When we restore content database in SharePoint 2010 from SharePoint 2007, it required to upgrade the Visual to Version 4. Following command will update all the site and sub-sites for provided content database.

$ContentDatabaseName = Get-SPContentDatabase WSS_Content_SharePoint_Database_Restore

$ContentDatabaseName.Sites | Get-SPWeb -limit all | ForEach-Object {$_.UIversion = 4; $_.UIVersionConfigurationEnabled = $false; $_.update()}