European Sharepoint 2013 Hosting Blog

Articles about European Sharepoint Hosting Service

Follow me on TwitterRSS Feeds

  • Home
  • About

SharePoint 2013 Hosting – HostForLIFE :: Downloading A File From SharePoint Online Site Using The SharePoint App

Jan 14th

Posted by Peter in European SharePoint 2013 Hosting

Generally in SharePoint Online, until we provide an O365 license to any user account, it will not be identified by SPO. To do some generic tasks such as downloading files, or reading some list, we try to avoid regular user accounts and try to use generic accounts. But unlike SP on-premise, we need to assign an O365 license to use this account in SPO.
SharePoint-2013-Hosting
Another approach we can use is by using a SharePoint App concept. With the help of this, we can do communicate with the SPO site and do things such as reading lists, downloading files, etc.
This approach basically generates an access token which will be used by the SharePoint App. This access token will be validated by the SharePoint online site.
I am not explaining how to register an SP app and providing that particular app permission on the SharePoint online site. Comment if you need any assistance on that. I will be happy to include that also.
I have created this simple console application which can be used and modified as per need. Please create a simple C# console application and include this file.
The first thing which we need to do is to generate access toke with the help of app id and app secret.
We need the below variables values to be identified and replaced in the code to work.
  1. tenantID – You can find tenant id from https://portal.azure.com – Azure Active Directory à Properties
  2. strAppID – This is the App Guid which will be created at https://<sitename>.sharepoint.com/_layouts/15/appregnew.aspx
  3. strAppSecret – App secret
  4. strOrgDomain – Your organization domain will be used in “{organisationdomain}.sharepoint.com”;
Once these values are updated, there will be a web request created to get the access token which will be used by the SP app.
Once access toke is generated, we can use .NET’s WebClient class to download the file. Please update the below variables in the code
string webUrl = “Your SPO site url”
string documentLibName = This should be the path of the file. In the given example I have taken ‘Shared%20Documents/test’ where ‘test’ is a folder inside library.
string fileName = “file name with extension”;
You can refer to my Git Repository for the code.
The code is fairly straight forward and I have put the comments for better understanding.
Tweet
cheap europe sharepoint 2013 hosting, cheap european sharepoint server 2010 hosting, europe sharepoint 2013 hosting, fast SharePoint 2013 Hosting, France Sharepoint 2013 Hosting, free SharePoint 2013 Hosting, india SharePoint 2013 Hosting, recommended SharePoint 2013 Hosting, SharePoint 2013 Hosting belgium, SharePoint 2013 Hosting germany, SharePoint 2013 Hosting Italy, SharePoint 2013 Hosting netherlands, SharePoint 2013 Hosting poland, SharePoint 2013 Hosting review switzerland, SharePoint 2013 Hosting UK, SharePoint Hosting 2013 Paris Server, Spain Sharepoint 2013 Hosting, tips SharePoint 2013 Hosting, Top Sharepoint 2013 hosting, trick SharePoint 2013 Hosting

SharePoint 2013 Hosting – HostForLIFE :: How to Copy Item Attachments To SharePoint Library Using PnP PowerShell?

Jan 7th

Posted by Peter in Other Related Post

In this blog, we are going to learn how to copy the attachments from a single list item to SharePoint library using PnP PowerShell. The following snippet helps, you to get the attachments from a list item and uploads to the shared Documents library in a current context site.SharePoint-2013-Hosting

1
2
3
4
5
6
7
$cred = Get-Credential
Connect-PnPOnline -Url https://ktskumartenant.sharepoint.com/sites/dev -Credential $cred
 
$listitem = Get-PnPListItem -List Employee -Id 2
$attachments = ForEach-Object{Get-PnPProperty -ClientObject $listitem -Property "AttachmentFiles"}
 
$attachments | ForEach-Object { Copy-PnPFile -SourceUrl $_.ServerRelativeUrl –TargetUrl “Shared Documents/$($_.FileName)”

After running the powershell command, it asks us to confirm the sourceurl and target url. If the file already exists in the targeturl, we have to add -OverwriteIfAlreadyExists $true to avoid the file already exists error.

Below is the example copies the two attachments from the single list item to the folder within a SharePoint library.

Tweet
cheap europe sharepoint 2013 hosting, cheap european sharepoint server 2010 hosting, europe sharepoint 2013 hosting, fast SharePoint 2013 Hosting, France Sharepoint 2013 Hosting, free SharePoint 2013 Hosting, india SharePoint 2013 Hosting, recommended SharePoint 2013 Hosting, SharePoint 2013 Hosting belgium, SharePoint 2013 Hosting germany, SharePoint 2013 Hosting Italy, SharePoint 2013 Hosting netherlands, SharePoint 2013 Hosting poland, SharePoint 2013 Hosting review switzerland, SharePoint 2013 Hosting UK, SharePoint Hosting 2013 Paris Server, Spain Sharepoint 2013 Hosting, tips SharePoint 2013 Hosting, Top Sharepoint 2013 hosting, trick SharePoint 2013 Hosting

SharePoint Hosting – Add, Retrieve And Remove The Navigation Node Using JSOM

Dec 23rd

Posted by Peter in European SharePoint 2013 Hosting

Navigation Bar provides us with  the infrastructure to add different navigation link options in a site. We can provide the navigation links within “Top Navigation” and “Quick Launch Navigation”.
hostforlifebanner
Here, I am providing the code through which we can manipulate the navigation links both in Top navigation & Quick Launch navigation. I have added two navigation nodes; i.e., TeamSiteNavigation,TopNavigation.
I have used 3 buttons and their corresponding functions. Here, I am sharing the functionalities and their respective functions below.
1
For add="Add Navigation"(Function Name->addNavNode() )->
First, I have got the current context and web. Then I got the navigation collection of top navigation Bar. You can also get the Quick Launch by using “get_quickLaunch();”
Then I set properties for a new navigation node & created node as the last node in the collection.
1
For retrieve="Show Navigations Names"(Function Name->checkNavNames())->
Here I am retrieving the navigation collection of top navigation.
1
For remove="Remove Navigation"(FunctionName->removeNavNode())->
Here I am removing the navigation from the navigation collection, which I have provided in the text box.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
< script type = "text/javascript"  
language = "javascript" >  
    var navNodes = [{  
        Name: "TeamSiteNavigation",  
        url: "/sites/TeamSite",  
        fromExternal: false  
    }, {  
        Name: "TopNavigation",  
        url: "http://www.google.com",  
        fromExternal: true  
    }];  
var oNavNodeColl = null;  
var nodeCreationInfo = null;  
  
function addNavNode() {  
    var ctx = new SP.ClientContext.get_current();  
    if (ctx != undefined && ctx != null) {  
        var oWeb = ctx.get_web();  
        this.oNavNodeColl = oWeb.get_navigation().get_topNavigationBar();  
        for (var i = 0; i < navNodes.length; i++) {  
            var navObj = navNodes[i];  
            var nodeTitle = navObj.Name;  
            var navNodeUrl = navObj.url;  
            var navFromExternal = navObj.fromExternal;  
            this.nodeCreationInfo = new SP.NavigationNodeCreationInformation();  
            nodeCreationInfo.set_title(nodeTitle);  
            nodeCreationInfo.set_url(navNodeUrl);  
            nodeCreationInfo.set_isExternal(navFromExternal);  
            nodeCreationInfo.set_asLastNode(true);  
            this.oNavNodeColl.add(nodeCreationInfo);  
        }  
        ctx.load(this.oNavNodeColl);  
        ctx.executeQueryAsync(function() {  
            alert("successfully added")  
        }, function(sender, args) {  
            alert('Request failed. ' + args.get_messege() + '\n' + args.get_stackTrace());  
        });  
    }  
}  
  
function checkNavNames() {  
    var ctx = SP.ClientContext.get_current();  
    var oWeb = ctx.get_web();  
    var oNavNodeColl = oWeb.get_navigation();  
    var nodeColl = oNavNodeColl.get_topNavigationBar();  
    ctx.load(oNavNodeColl);  
    ctx.load(nodeColl, 'Include(Title,Children.Include(Title,Children))');  
    ctx.executeQueryAsync(function() {  
        var navNodeEnumerator = nodeColl.getEnumerator();  
        var nodeNames = "";  
        while (navNodeEnumerator.moveNext()) {  
            var oNavNode = navNodeEnumerator.get_current();  
            nodeNames = nodeNames + '\n' + oNavNode.get_title();  
        }  
        alert(nodeNames);  
    }, function(sender, args) {  
        alert('Request failed. ' + args.get_messege() + '\n' + args.get_stackTrace());  
    });  
}  
  
function removeNavNode() {  
    var navName = document.getElementById("Textbox").value;  
    var ctx = SP.ClientContext.get_current();  
    var oWeb = ctx.get_web();  
    var oNavNodeColl = oWeb.get_navigation();  
    var nodeColl = oNavNodeColl.get_topNavigationBar();  
    ctx.load(oNavNodeColl);  
    ctx.load(nodeColl, 'Include(Title,Children.Include(Title,Children))');  
    ctx.executeQueryAsync(function() {  
        var navNodeEnumerator = nodeColl.getEnumerator();  
        var nodeNames = "";  
        while (navNodeEnumerator.moveNext()) {  
            var oNavNode = navNodeEnumerator.get_current();  
            nodeNames = oNavNode.get_title();  
            if (nodeNames == navName) {  
                oNavNode.deleteObject();  
                ctx.executeQueryAsync(function() {  
                    alert("successfully deleted");  
                }, function(sender, args) {  
                    alert('Request failed. ' + args.get_messege() + '\n' + args.get_stackTrace());  
                });  
            }  
        }  
    }, function(sender, args) {  
        alert('Request failed. ' + args.get_messege() + '\n' + args.get_stackTrace());  
    });  
} < /script>   
< input id = "addButton"  
    type = "button"  
    value = "Add Navigation"  
    onclick = "addNavNode()" / >< br / >< div style = "marginTop:20px;" > & nbsp < /div>< input id = "checkButton"  
    type = "button"  
    value = "Show Navigations Names"  
    onclick = "checkNavNames()" / >< br / >< div style = "marginTop:20px;" > & nbsp < /div>< label > Enter navigation name to delete < /label>< input id = "Textbox"  
    type = "text" / >< input id = "removeButton"  
    type = "button"  
    value = "Remove Navigation"  
onclick = "removeNavNode()" >
Follow the below instructions and refer to the corresponding image to perform the Operation,
Click on Add Navigation,
After adding the node,
Click on Show Navigations Names,
Now we can check Navigation name in the alertbox,
Give the navigation node which you want to delete.
I’ve successfully deleted the navigation node.
Tweet
cheap europe sharepoint 2013 hosting, cheap european sharepoint server 2010 hosting, europe sharepoint 2013 hosting, fast SharePoint 2013 Hosting, France Sharepoint 2013 Hosting, free SharePoint 2013 Hosting, india SharePoint 2013 Hosting, recommended SharePoint 2013 Hosting, SharePoint 2013 Hosting belgium, SharePoint 2013 Hosting germany, SharePoint 2013 Hosting Italy, SharePoint 2013 Hosting netherlands, SharePoint 2013 Hosting poland, SharePoint 2013 Hosting review switzerland, SharePoint 2013 Hosting UK, SharePoint Hosting 2013 Paris Server, Spain Sharepoint 2013 Hosting, tips SharePoint 2013 Hosting, Top Sharepoint 2013 hosting, trick SharePoint 2013 Hosting

SharePoint Hosting – Change SharePoint Online List Or Library Internal Name

Dec 17th

Posted by Peter in Other Related Post

Recently we have provided a build and guideline document to our client and by mistake they have set up a library with the wrong internal name. In the beginning  it worked well but as the additional functionality was added, it broke. As the users have started working on that, we needed to fix the internal name anyway.
hostforlifebanner
Our library internal name is “TrainingDocuments” and display name is “Training Documents”. While Client has set up “Training Documents”

Solution

Initially we thought it might be not possible. But then we found 2 ways to do it,

Approach 1 – Using SharePoint Designer 2013

Follow the below steps to fix this using SharePoint Designer 2013,
  1. In SharePoint Designer, Open your site.
  2. Navigate to All Files navigation node (not List and Libraries node),

    Note
    you will need “Site Collection Administrator” permission in the site collection to see “All Files” option.

  3. Find your list there
  4. Right-click list
  5. Rename.

Approach 2 – Using PNP PowerShell

In case you are not able to connect the site in the SharePoint designer or you do not have it installed in your machine, you can do this using PNP PowerShell as well.
PowerShell to change Library Name,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#Set Parameters  
 
$<span class="attribute">SiteURL</span> = <span class="attribute-value">"Site URL"</span>  
 
$<span class="attribute">ListName</span> = <span class="attribute-value">"Library Internal Name"</span>  
 
$<span class="attribute">NewListURL</span> = <span class="attribute-value">"New Library Name"</span>  
 
    
#Connect to PNP Online  
 
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)  
 
   
 
 #this will change URL  
 
#Get the List  
 
$<span class="attribute">List</span>= <span class="attribute-value">Get</span>-PnPList -Identity $ListName -Includes RootFolder  
 
   
 
#sharepoint online powershell change list url  
 
$List.Rootfolder.MoveTo($NewListURL)  
 
Invoke-PnPQuery  
 
  
 
#this will change library title  
 
Set-PnPList -Identity $ListName -Title $NewListURL

PowerShell to change List Name

For list, we don’t need to execute command for root folder changes. So, the updated powershell is as follows:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#Set Parameters  
 
$<span class="attribute">SiteURL</span> = <span class="attribute-value">"Site URL"</span>  
 
$<span class="attribute">ListName</span> = <span class="attribute-value">"Library Internal Name"</span>  
 
$<span class="attribute">NewListURL</span> = <span class="attribute-value">"New Library Name"</span>  
 
    
 
#Connect to PNP Online  
 
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)  
 
Set-PnPList -Identity $ListName -Title $NewListURL
Tweet
cheap europe sharepoint 2013 hosting, cheap european sharepoint server 2010 hosting, europe sharepoint 2013 hosting, fast SharePoint 2013 Hosting, France Sharepoint 2013 Hosting, free SharePoint 2013 Hosting, india SharePoint 2013 Hosting, recommended SharePoint 2013 Hosting, SharePoint 2013 Hosting belgium, SharePoint 2013 Hosting germany, SharePoint 2013 Hosting Italy, SharePoint 2013 Hosting netherlands, SharePoint 2013 Hosting poland, SharePoint 2013 Hosting review switzerland, SharePoint 2013 Hosting UK, SharePoint Hosting 2013 Paris Server, Spain Sharepoint 2013 Hosting, tips SharePoint 2013 Hosting, Top Sharepoint 2013 hosting, trick SharePoint 2013 Hosting

SharePoint 2013 Hosting – HostForLIFE.eu :: File Server Migration To SharePoint Online Using SPMT PowerShell

Dec 10th

Posted by Peter in European SharePoint 2013 Hosting

Recently we had a project where we needed to migrate file server to SharePoint Online. So, we decided to go with SharePoint Migration Tool (SPMT). But we had 50 plus folders and all were needed to migrate to different site document libraries. As it takes long time to migrate using tool due to creating connection, we decided to use the PowerShell version.hostforlifebanner

Issue

We faced the below issues in this requirement,
  1. The documentation for this is not that accurate or in single place. We need to search here and there for things.
  2. SPMT tool migrates file server child items directly but when you use PowerShell, it migrates parent folder. Due to the curse of first point, it took some time for us to find the hidden solution. Go through this post to see that hidden gem.
  3. The last but not least is permission migration. SPMT has all this functionality but as I said earlier it is not documented well.
So, we will try to explain all our knowledge in detail here.

Solution

First, we need to prepare a csv which will be read by PowerShell and It will have connection details of source and migration.
Important notes for preparing csv,
  1. Do not include a header row in your CSV file.
  2. Remember to account for all six columns in the file, even if you are not needing a value for a given field.
  3. If you use the standard out-of-the-box Document library (“Shared Documents”), you must use the Display name “Documents” as the placeholder value for the Target Document Library in your CSV file. If you enter “Shared Documents” in that column, you will receive an “invalid document library” error.
Note
If the language of the destination SharePoint site is other than English, check the Display name of the “Shared Documents” Document library by browsing to Documents library.
The format of csv is as below,
1
Source,SourceDocLib,SourceSubFolder,TargetWeb,TargetDocLib,TargetSubFolder
As we are migrating from file server, we will not pass the “SourceDocLib” & “SourceSubFolder” details. So, our csv detail will look like below,
File server path,,, TargetWeb,TargetDocLib,TargetSubFolder
For example,
C:\MigrationTests\testfiles,,,https://contoso.sharepoint.com/sites/Sample/,DocLibraryName,DocLibraryName_subfolder
In case you don’t want to migrate it to sub folder, the subfolder part will be blank.
File server path,,, TargetWeb,TargetDocLib,
For example,
C:\MigrationTests\testfiles,,,https://contoso.sharepoint.com/sites/Sample/,DocLibraryName,
In next blog we will use this csv in the PowerShell.
Tweet
cheap europe sharepoint 2013 hosting, cheap european sharepoint server 2010 hosting, CSS in SPFx, europe sharepoint 2013 hosting, fast SharePoint 2013 Hosting, France Sharepoint 2013 Hosting, free SharePoint 2013 Hosting, india SharePoint 2013 Hosting, recommended SharePoint 2013 Hosting, SharePoint 2013 Hosting belgium, SharePoint 2013 Hosting germany, SharePoint 2013 Hosting Italy, SharePoint 2013 Hosting netherlands, SharePoint 2013 Hosting poland, SharePoint 2013 Hosting review switzerland, SharePoint 2013 Hosting UK, SharePoint Hosting 2013 Paris Server, Spain Sharepoint 2013 Hosting, tips SharePoint 2013 Hosting, Top Sharepoint 2013 hosting

SharePoint 2013 Hosting – HostForLIFE.eu :: How To Create a Copy Of Site Page And Update Property Of The Web Parts

Dec 3rd

Posted by Peter in European SharePoint 2013 Hosting

In this article, we will learn how to copy a site page and update the property of web parts while creating a copy of the site page.

How to create a copy of the page

Step 1
First, we need to install SharePoint Patterns and Practices client-side libraries.
Use the below command to install the PNP package in your react spfx solution,
npm i @pnp/sp
Step 2
We will need the current context of the page. So, make sure you have defined the property of context and it has an assigned value as this.context as shown below:
1
2
3
4
export interface ICopyPageProps {  
   description: string;  
   context: any;  
}
We can assigna  value to property as in the below code,
1
2
3
4
5
6
7
const element: React.ReactElement<ICopyPageProps> = React.createElement(  
CopyPage,  
   {  
      description: this.properties.description,  
      context: this.context  
   }  
);

Step 3
Now we need to import the library into our SPFx web part and access the root sp object and other methods of client-side pages like @pnp/sp, @pnp/sp/webs, @pnp/sp/clientside-pages.
1
2
3
4
import { sp } from "@pnp/sp";  
import "@pnp/sp/webs";  
import { ClientsidePageFromFile, IClientsidePage, ClientsideWebpart  
} from "@pnp/sp/clientside-pages";

Step 4

Now we need the URL of the source page, from which page we want to create a copy of the page. We will store the URL of the source page in a variable.

 

1
var sourcePageURL = “https://****.sharepoint.com/sites/Test/SitePages/sourcepage.aspx”;

Step 5

Now we will get the template of the source page from the url as below:

 

1
const pageTemplate = await ClientsidePageFromFile(sp.web.getFileByServerRelativePath(sourcePageURL));

Step 6

Now we will generate the copy of the source page using the copy method. Copy method will have 4 parameters,
copy(web: IWeb, pageName: string, title: string, publish?: boolean, promotedState?: PromotedState): Promise<IClientsidePage>
  • web: The web where we will create the copy
  • pageName: The file name of the new page
  • title: The title of the new page
  • publish: If true the page will be published
Below is an example of how to use copy method:

1
const newPage = await pageTemplate.copy(sp.web, “Page Name”, “Page Title”, false);

Step 7

Using the copy method, a copy of the page will be created. Now we need to save this new page.
To save this new page, we need to use save method of pnp client side pages library. Save method has one parameter which has boolean value.
save(publish?: boolean): Promise<boolean>

If true the page is published, if false the changes are persisted to SharePoint but not published [Default: true]

Now a copy of the page is created.
It will create a copy page without updating any property of your web part.
If you want to update a property while creating a copy of the page use the below steps.

How to update the property of web parts while creating a copy of page

Step 1
After creating a copy and before saving the page, you need to get an instance of all web parts of the new page.
To get this, use the below method,
1
let WebpartPageWebpartInstance: string[] = this.getPageCustomWebPartsInstances(newPage);
The above line of code will give you array of all web parts of the seleced page.
Step 2
Now we will use loop ‘for each’ on the instance of the page which we get from step 1.
And in this loop we will get the property and we can update any property which you want to update. Here in the below code I am updating Category property. So, if there is Category property in any of the web parts it will update it to Accounts,
1
2
3
4
5
6
7
WebpartPageWebpartInstance.forEach(webpartInstanceId => {  
            const currentWebpart: ClientsideWebpart = newPageDraft.findControl((c) => c.id === webpartInstanceId);  
            let currentProps: any = howToControl.getProperties();  
            if (currentProps.Category != undefined) {  
                currentProps.Category = “Accounts”;  
            }  
        }
Step 3
After this loop, you can save your page using the page. save method.
Below is the full code snippet for all the processes. In this code I am updating the value of the category property. You can also update multiple properties of the web part. Make sure that the property name is case sensitive.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public async copyAndUpdateProperty(currentObj) {  
    var selectedPage = currentObj.state.selectedPage;  
    var currentContext: any = currentObj.props.context;  
    var siteUrl = currentContext.pageContext.web._serverRelativeUrl;  
    var sourcePageUrl = siteUrl + "/SitePages/" + selectedPage;  
    if (selectedPage != "Select" && this.state.category != "Select" && this.state.title != "" && this.state.name != "") {  
        this.setState({  
            isLoading: true  
        });  
        var siteUrl = currentContext.pageContext.web._serverRelativeUrl;  
        var sourcePageUrl = siteUrl + "/SitePages/" + selectedPage;  
        const pageTemplate = await ClientsidePageFromFile(sp.web.getFileByServerRelativePath(sourcePageUrl));  
        const newPageDraft = await pageTemplate.copy(sp.web, this.state.title, this.state.name, false);  
        const howToWebpartId = "E8DFA76D-1752-46CB-9844-AADF4D18F698";  
        let howToWebpartPageWebpartInstanceId: string[] = this.getPageCustomWebPartInstanceIdByWebpartId(howToWebpartId.toLowerCase(), newPageDraft);  
        howToWebpartPageWebpartInstanceId.forEach(webpartInstanceId => {  
            const howToControl: ClientsideWebpart = newPageDraft.findControl((c) => c.id === webpartInstanceId);  
            //update properties as needed... this should be a typed object to make it easier...  
            let currentProps: any = howToControl.getProperties();  
            currentProps.Category = this.state.category;  
        });  
        newPageDraft.save(true);  
        alert("Page copied successfully");  
        this.setState({  
            isLoading: false  
        });  
    } else {  
        alert("Please select all values");  
    }  
}  
private getPageCustomWebPartInstanceIdByWebpartId(webpartId: string, page: IClientsidePage): string[] {  
    const instances: string[] = [];  
    page.sections.forEach(section => {  
        section.columns.forEach(column => {  
            column.controls.forEach(control => {  
                if (control.data.webPartId == webpartId) {  
                    instances.push(control.id);  
                }  
            });  
        });  
    });  
    return instances;  
}

 

Now your new page will have updated properties.
Tweet
cheap europe sharepoint 2013 hosting, cheap european sharepoint server 2010 hosting, CSS in SPFx, europe sharepoint 2013 hosting, fast SharePoint 2013 Hosting, France Sharepoint 2013 Hosting, free SharePoint 2013 Hosting, india SharePoint 2013 Hosting, recommended SharePoint 2013 Hosting, SharePoint 2013 Hosting belgium, SharePoint 2013 Hosting germany, SharePoint 2013 Hosting Italy, SharePoint 2013 Hosting netherlands, SharePoint 2013 Hosting poland, SharePoint 2013 Hosting review switzerland, SharePoint 2013 Hosting UK, SharePoint Hosting 2013 Paris Server, Spain Sharepoint 2013 Hosting, tips SharePoint 2013 Hosting, Top Sharepoint 2013 hosting
«12345»102030...Last »
  • BLOGROLL

    • ASP.NET BLOG
    • ASP.NET MVC BLOG
    • Christian BLOG
    • Cloud Hosting ASP.NET
    • Europe Cloud Linux Hosting
    • HostForLIFE Blogspot
    • HostForLife.eu
    • Hosting Cheap ASP.NET
    • IIS BLOG
    • Silverlight BLOG
    • Windows ASP Hosting Review
    • Windows BLOG
  • Featured On

    • Best Windows Hosting ASP.NET
    • Cheap Hosting ASP.NET
    • Cheap Hosting Windows
    • Cloud Hosting ASP.NET
    • Discount Windows Hosting
    • Full Trust Hosting ASP.NET
    • Hosting For Ecommerce
    • Hosting Review ASP.NET
    • I Host Azure
    • Reliable Hosting ASP.NET
    • Review Hosting ASP.NET
    • Windows Hosting Bulletin
    • Windows Hosting Leader
    • Windows Web Hosting Review
  • Tags

    Belgium Sharepoint 2013 Hosting Best sharepoint 2013 hosting Cheap and recommended sharepoint hosting cheap european sharepoint 2010 hosting cheap european sharepoint server 2010 hosting cheap europe sharepoint 2013 hosting cheap sharepoint 2010 europe hosting cheap sharepoint 2010 foundation hosting CSS in SPFx european sharepoint 2010 hosting European Sharepoint 2013 Hosting europe sharepoint 2013 hosting Europe Sharepoint Hosting fast SharePoint 2013 Hosting France Sharepoint 2013 Hosting free SharePoint 2013 Hosting Germany Sharepoint 2013 Hosting HostForLife HostForLife.eu Hosting cheap european sharepoint server 2010 hosting Hosting cheap europe sharepoint 2013 hosting Hosting europe sharepoint 2013 hosting Hungary Sharepoint 2013 Hosting india SharePoint 2013 Hosting Madrid Sharepoint 2013 Hosting Netherlands sharepoint 2013 hosting Norway Sharepoint 2013 Hosting Portugal Sharepoint 2013 Hosting recommended SharePoint 2013 Hosting Russia Sharepoint 2013 Hosting sharepoint 2010 europe hosting sharepoint 2010 foundation hosting sharepoint 2013 hosting SharePoint 2013 Hosting belgium SharePoint 2013 Hosting germany SharePoint 2013 Hosting Italy SharePoint 2013 Hosting netherlands SharePoint 2013 Hosting poland SharePoint 2013 Hosting review switzerland SharePoint 2013 Hosting UK SharePoint Hosting 2013 Paris Server Spain Sharepoint 2013 Hosting tips SharePoint 2013 Hosting Top Sharepoint 2013 hosting trick SharePoint 2013 Hosting
RSS Feeds XHTML 1.1 Top