Sunday 10 February 2013

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()}

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

How to open hyperlinks into modal dialog box in SharePoint 2010


SharePoint 2010 provides new feature "Modal dialog box". In this blog we shows how to open hyperlinks in modal dialog box using simple jquery selector.

Declaration syntax for modal dialog box is as follows

//Using the DialogOptions class.
var options = SP.UI.$create_DialogOptions();

options.title = "Dialog box title";
options.width = 300;
options.height = 500;
options.url = "PageUrl";

SP.UI.ModalDialog.showModalDialog(options);


//Using a generic object.
var options = {
    title: "Dialog box title",
    width: 300,
    height: 500,
    url: "PageUrl" };
SP.UI.ModalDialog.showModalDialog(options);


Now we put above modal dialog syntax in jquery selector

$("[href(selection attributes)'Condition']").click ( function () {
                                                                   var options = {
                                                                   title: "Dialog box title",
                                                                   width: 300,
                                                                   height: 500,
                                                                   url: $(this).attr('href')
                                                                 };
                                                                   return false;// required to override default behavior of hyperlink tag
                                                                });

We have to open link which contains the query string parameters "ShowInDialog=1", then selection condition for it
$("[href*='ShowInDialog=1']")

Attribute for selection 
!= is not equal
^= is starts with
$= is ends with
*= is contains



Example for selecting hyper links which contains query string parameter "ShowInDialog=1" 
$("[href*='ShowInDialog=1']").click ( function () {

                                                                   var options = {
                                                                   title: "Dialog box title",
                                                                   width: 300,
                                                                   height: 500,
                                                                   url: $(this).attr('href')
                                                                 };
                                                                   return false;// required to override default behavior of hyperlink tag
                                                                });

Hide Sign in as Different User in SharePoint 2010


Open WelCome.ascx file in visual studio. you found this file in controltemplates folder. We want to show only sign out option for welcome menu. Remove menu templates as per your required and save as "Custom_Welcome.ascx"



<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint" %> <%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Control Language="C#" Inherits="Microsoft.SharePoint.WebControls.Welcome,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"   AutoEventWireup="false" compilationMode="Always" %>  <SharePoint:PersonalActions accesskey="<%$Resources:wss,personalactions_menu_ak%>" ToolTip="<%$Resources:wss,open_menu%>" runat="server" id="ExplicitLogout" Visible="false"> <CustomTemplate> <SharePoint:FeatureMenuTemplate runat="server" FeatureScope="Site" Location="Microsoft.SharePoint.StandardMenu" GroupId="PersonalActions" id="ID_PersonalActionMenu" UseShortId="true" > <SharePoint:MenuItemTemplate runat="server" id="ID_Logout" Text="<%$Resources:wss,personalactions_logout%>" Description="<%$Resources:wss,personalactions_logoutdescription%>" MenuGroupId="200" Sequence="300" UseShortId="true" />   </SharePoint:FeatureMenuTemplate> </CustomTemplate></SharePoint:PersonalActions><SharePoint:ApplicationPageLink runat="server" id="ExplicitLogin" ApplicationPageFileName="Authenticate.aspx" AppendCurrentPageUrl="true" Text="<%$Resources:wss,login_pagetitle%>" style="display:none" Visible="false" />



Open site master page on page search for register tag of  welcome control

<%@ Register TagPrefix="wssuc" TagName="Welcome" src="~/_controltemplates/Welcome.ascx" %>
replace with src="~/_controltemplates/Custom_Welcome.ascx" %>

Refresh the page and get happy...

An exception occurred when trying to issue security token

Security Token Service Application Error:
Problems:  Unable to Login with Claim base authentication to SharePoint 2010 Site
Errors
An exception occurred when trying to issue security token: The requested service, 'http://localhost:32843/SecurityTokenServiceApplication/securitytoken.svc' could not be activated. See the server's diagnostic trace logs for more information.
Or
WebHost failed to process a request.
 Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/15688314
 Exception: System.ServiceModel.ServiceActivationException: The service '/SecurityTokenServiceApplication/securitytoken.svc' cannot be activated due to an exception during compilation.  The exception message is: Method not found: 'System.String System.ServiceModel.Activation.Iis7Helper.ExtendedProtectionDotlessSpnNotEnabledThrowHelper(System.Object)'.. ---> System.MissingMethodException: Method not found: 'System.String System.ServiceModel.Activation.Iis7Helper.ExtendedProtectionDotlessSpnNotEnabledThrowHelper(System.Object)'.
   at System.ServiceModel.WasHosting.MetabaseSettingsIis7V2.WebConfigurationManagerWrapper.BuildExtendedProtectionPolicy(ExtendedProtectionTokenChecking tokenChecking, ExtendedProtectionFlags flags, List`1 spnList)
   at System.ServiceModel.WasHosting.MetabaseSettingsIis7V2.WebConfigurationManagerWrapper.GetExtendedProtectionPolicy(ConfigurationElement element)
   at System.ServiceModel.WasHosting.MetabaseSettingsIis7V2.ProcessWindowsAuthentication(String siteName, String virtualPath, HostedServiceTransportSettings& transportSettings)
   at System.ServiceModel.WasHosting.MetabaseSettingsIis7V2.CreateTransportSettings(String relativeVirtualPath)
   at System.ServiceModel.Activation.MetabaseSettingsIis.GetTransportSettings(String virtualPath)
   at System.ServiceModel.Activation.MetabaseSettingsIis.GetAuthenticationSchemes(String virtualPath)
   at System.ServiceModel.Channels.HttpChannelListener.ApplyHostedContext(VirtualPathExtension virtualPathExtension, Boolean isMetadataListener)
   at System.ServiceModel.Channels.HttpTransportBindingElement.BuildChannelListener[TChannel](BindingContext context)
   at System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener[TChannel]()
   at System.ServiceModel.Channels.MessageEncodingBindingElement.InternalBuildChannelListener[TChannel](BindingContext context)
   at System.ServiceModel.Channels.BinaryMessageEncodingBindingElement.BuildChannelListener[TChannel](BindingContext context)
   at System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener[TChannel]()
   at System.ServiceModel.Channels.Binding.BuildChannelListener[TChannel](Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters)
   at System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(Boolean actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, IChannelListener& result, Boolean supportContextSession)
   at System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result)
   at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
   at System.ServiceModel.ServiceHostBase.InitializeRuntime()
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceHost.InitializeRuntime()
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
   --- End of inner exception stack trace ---
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
   at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath)
 Process Name: w3wp
 Process ID: 4780
Solution: Uninstall Security Update No. - KB2756920
http://blogs.technet.com/b/praveenh/archive/2013/01/15/issue-found-with-net-framework-3-5-1-security-update-kb2756920.aspx

Access Business Connectivity Services object using Client Application

Business Connectivity Service (BCS), enables users to read and write data from external systems - from web services, database, and Microsoft .NET Framework.
Following code snippet shows, how to access BCS object using Client Object Model

We already have BCS list named "Customer", contains columns Name, Address


// Specify your SharePoint Web Url

 ClientContext clientContext = new ClientContext("http://contoso:3434");
             
// Specify SharePoint list name
                List list = clientContext.Web.Lists.GetByTitle("Customer");

                CamlQuery query = new CamlQuery();
             
                query.ViewXml =
                    @"  <View>
                            <ViewFields>
                                <FieldRef Name='Name'/>
                                <FieldRef Name='Address'/>
                            </ViewFields>
                            <Query>
                                <Where>
                                <Eq>
                                <FieldRef Name='Name'/>
                                <Value Type='Text'>Jhon</Value>
                                </Eq>
                                </Where>
                            </Query>
                            <RowLimit>100</RowLimit>
                        </View>";

                ListItemCollection listItems = list.GetItems(query);

// Specify which field required to include in list object other wise it throws exception
                clientContext.Load(
                listItems, items => items.Include(
                 item => item["Name"], item => item["Address"]));


                clientContext.ExecuteQuery();

                foreach (ListItem listItem in listItems.ToList())
                {
                    Console.WriteLine("{0} ==> {1}", listItem["Name"].ToString(), listItem["Address"].ToString());
                }