Finding this information was not very easy, so decided to write this post.
This blog is maintained for providing solutions of SharePoint issues which I stuck into so that it can be referenced by some one in need or by myself later in future.
Wednesday, July 25, 2012
Tuesday, July 24, 2012
Microsoft Officially Announces SharePoint 2013
Wait is over !!!
Microsoft has announced the next version of SharePoint. It is SHAREPOINT 2013!
Two versions :
- SharePoint Foundation 2013 Preview
(Minimum RAM : 8GB, Processor : 64-bit, 4 cores )
- SharePoint Server 2013 Perview
(Minimum RAM : 24GB, Processor : 64-bit, 4 cores )
For details go to Hareware and Software Requirements
One good news !
SharePoint 2013 is based on Microsoft .NET Framework version 4.5 Release Candidate (RC). So this time SharePoint seems not to lag being .Net framework. :)
For more details on SharePoint 2013, visit official information here
Microsoft has announced the next version of SharePoint. It is SHAREPOINT 2013!
Two versions :
- SharePoint Foundation 2013 Preview
(Minimum RAM : 8GB, Processor : 64-bit, 4 cores )
- SharePoint Server 2013 Perview
(Minimum RAM : 24GB, Processor : 64-bit, 4 cores )
For details go to Hareware and Software Requirements
One good news !
SharePoint 2013 is based on Microsoft .NET Framework version 4.5 Release Candidate (RC). So this time SharePoint seems not to lag being .Net framework. :)
For more details on SharePoint 2013, visit official information here
Tuesday, June 12, 2012
"The collection has not been initialized. It has not been requested ..." in SharePoint 2010 ECMAScript Client Object Model.
This is a common error which you will see while working with ECMAScript Object Model of SharePoint 2010. There could be multiple reasons behind this issue as discussed below:
Cause 1:
Error occurs when you try to access properties of an object which has not been initialized.
Let's understand it through an example (excluding script start and end tags).
var currentUser;
var uLogin;
var uTitle;
var ctx;
function LoadUserDetails() {
//Get Context
ctx = new SP.ClientContext.get_current();
//Get logged in user
currentUser = ctx.get_web().get_currentUser();
ctx.load(currentUser);
ctx.executeQueryAsync(queryTrackerList, failure);
}
function AccessUserDetails() {
//Get user login name
uLogin = currentUser.get_loginName();
//Get User title
uTitle = currentUser.get_title();
alert('Current user login name : ' + uLogin);
alert('Current user display name : ' + uTitle);
Here, I am displaying current logged user details : Login Name and Display Name.
currentUser = ctx.get_web().get_currentUser();
Above code line returns an SP.User object which is uninitialized (does not contain any property value) until a call to executeQueryAsync method.
So if we call user object properties (get_loginName and get_title) in first method ' LoadUserDetails ', it will return us an error i.e. "The collection has not been initialized. It has not been requested ...".
Solution:
Alway access object properties only after it has been initialized. As, accessing SP.User properties in second method ' AccessUserDetails' will work without any problem as executeQueryAsync method has been called so object has been initialized and contains properties values.
Cause 2:
Let's say you have more than one functionalities on the same page which are interacting with SharePoint list/s to read/update/delete items.
JS file1:
$(window).load(function(){
ExecuteOrDelayUntilScriptLoaded(function(){func1();}, "sp.js");
});
function func1()
{
//Doing something...
}
JS file2:
$(window).load(function(){
ExecuteOrDelayUntilScriptLoaded(function(){func2();}, "sp.js");
});
function func2()
{
//Doing something...
}
As you can see, on page load two different functions are executing which are calling "ExecuteOrDelayUntilScriptLoaded" function. This would also result in the same error.
Solution :
If possible, try to do both functionalities with single JS file as given below...
$(window).load(function(){
ExecuteOrDelayUntilScriptLoaded(function(){func1();}, "sp.js");
});
function func1()
{
//Doing something...
ctx.executeQueryAsync(func2, func2); //func2 will be called on success or failure both
}
Thursday, May 24, 2012
Hide Old Events from Calendar's 'calendar view' in SharePoint
By default, SharePoint calendar provides two types of views : Calendar View and All Events View. Hidding old enteries from all events view is straight-forward. In this view, you can apply filter on 'End Time' field of calender event something like this expression:
'End Time'[Today] -> (Please note this is only a representation)
It hides all events older than today.
BUT, achieving same thing in Calendar view is not so easy as it doesn't show 'Start Time' and 'End Time' fields in filter column. But, still it's possible !
Here's the solution !!!
Select 'Created' field as a filter column. In operator control, select 'is greater than or equal to' and in value, type [Today].
So filter expression will look like : 'Created'[Today].
Click 'Ok' to save.
Now, click 'modify view in SharePoint designer' on calendar ribbon to make changes in view using SharePoint designer..
[Calendar Tools -> Calendar -> Modify Views -> Modify View in SharePoint Designer (Advanced).]
Calendar view opens in the SharePoint designer. Search for 'Created' keyword and you will find given line:
<Geq><FieldRef Name="Created"/><Value Type="DateTime"><Today/></Value></Geq>
This is CAML query which filters calendar items in view. Replace 'Created' with 'End Time' and save.
You will see that all events older than today are hidden in Calendar view.
Please let me know if you face any issue.
'End Time'
It hides all events older than today.
BUT, achieving same thing in Calendar view is not so easy as it doesn't show 'Start Time' and 'End Time' fields in filter column. But, still it's possible !
Here's the solution !!!
Select 'Created' field as a filter column. In operator control, select 'is greater than or equal to' and in value, type [Today].
So filter expression will look like : 'Created'
Click 'Ok' to save.
Now, click 'modify view in SharePoint designer' on calendar ribbon to make changes in view using SharePoint designer..
[Calendar Tools -> Calendar -> Modify Views -> Modify View in SharePoint Designer (Advanced).]
Calendar view opens in the SharePoint designer. Search for 'Created' keyword and you will find given line:
<Geq><FieldRef Name="Created"/><Value Type="DateTime"><Today/></Value></Geq>
This is CAML query which filters calendar items in view. Replace 'Created' with 'End Time' and save.
You will see that all events older than today are hidden in Calendar view.
Please let me know if you face any issue.
Friday, May 18, 2012
Best practices for planning My Sites
When you plan and set up My Sites, you should always follow Microsoft's best practices as given below :
For more details, visit this link.
- Dedicated Web Application : You should use a dedicated web application for hosting My Site host site collection for following reasons:
- To improve performance and manageability.
- As enabling self-service site creation feature on a web application makes them vulnerable for cross-site scripting, it is required to isolate any scripts running in My Site from affecting other sites in your environment (see more details).
- My Site host at Web Application Root : My Site host should exist at the Web application root unless it's a requirement to create it deeper in the path.
Note : Without this, you will get an error message saying that no site collection exists when enabling self-site creation for web application. If there is a requirement of creating My Site host deeper in the path, it must be under an explicit inclusion managed path. Additonally, you must create a site collection at the Web application root, although this site collection can be empty and created without a template.
- User's 'My Content Section' Naming Format : While setting up My Site, in the 'Site Naming Format' avoid choosing 'User name (do not resolve conflicts) option if you are not sure about the uniqueness of the user account (in multiple domains). This format is used to create a site collection for user when he/she first time clicks 'My Content' section of My Site.
- Plan for Profile Syncronization : Although configuring the User Profile service application is required for My Sites, synchronizing profiles between SharePoint Server 2010 and directory services or business applications is optional. This option is highly recommended for consistent and timely information on user's My Site.
- Configure Managed Metadata service application : The Managed Metadata service application enables Web applications to store and access keywords from a managed metadata term database.
For My Sites, this functionality is required for users to specify keywords as their areas of expertise in the Ask Me About section and to use keywords for social tagging by using the Tags and Notes and I Like It features on the My Profile page of a My Site.
A Managed Metadata service application is highly recommended for My Sites.
For more details, visit this link.
Thursday, May 17, 2012
SharePoint 2010 Databases
SharePoint 2010 is a combination of range of products like foundation, standard, enterprise editions, project server, FAST search server for SharePoint 2010.
All these products have their own databases which are categorized as below:
| Product version and edition | Databases |
|---|---|
| SharePoint Foundation 2010 | Configuration Central Administration content Content (one or more) Usage and Health Data Collection Business Data Connectivity Application Registry service (if upgrading from Microsoft Office SharePoint Server 2007 Business Data Catalog) Subscription Settings service (if it is enabled through Windows PowerShell) |
| Additional databases for SharePoint Server 2010 Standard edition | Search service application:
State Managed Metadata Word Automation services |
| Additional databases for SharePoint Server 2010 Enterprise edition | PerformancePoint |
| Additional databases for Project Server 2010 | Draft Published Archive Reporting |
| Additional database for FAST Search Server | Search administration |
For details, go to this link.
Tuesday, May 15, 2012
Rotating images using JQuery and Data View Web Part in SharePoint Foundation 2010
This post is about rotating images with fixed captions in SharePoint Foundation 2010. There are a few posts around which talks about gettting it done but doesn't work properly so thought to write a step-by-step blog on it.
Note: You can also rotate images using Content query web part (link), but for that you should have SharePoint Server 2010, as content query web part doesn't come with SharePoint foundation 2010!
Requirements:
- Download jquery-1.7.2.min.js
- Download captify.tiny.js (for fixed caption)
- Create a picture library or use the default one and put some pictures into it.
Keep both JQuery files in the <14 hive>\Templates\Layouts\JQuery (create this folder if doesn't exist)
1. Create a new site page.
2. Now edit page in normal mode in SharePoint designer. Put your cursor before SPAN tag with id 'layoutsData' and insert an Empty Data View.
Switch to 'Split' mode, click 'Click here to select a data source' and select the picture library.
Select 'Title' for image caption and 'URL Path' for link to image. Now insert selected fields as multiple item view. It will insert complete xslt required for rendering the picture library on page.
Switch to 'Code' view. Automatically generated code contains few XSLT tag which are of no use in our case so I have removed these. Select automatically generated <XSL> tag and overwrite it with the <XSL> tag given below.
<!----- XSL Tag: START ------>
<Xsl>
<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal">
<xsl:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="dvt_apos">'</xsl:param>
<xsl:variable name="dvt_1_automode">0</xsl:variable>
<xsl:template match="/" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:SharePoint="Microsoft.SharePoint.WebControls">
<xsl:call-template name="dvt_1"/>
</xsl:template>
<xsl:template name="dvt_1">
<xsl:variable name="dvt_StyleName">Table</xsl:variable>
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
<xsl:variable name="dvt_RowCount" select="count($Rows)" />
<xsl:variable name="IsEmpty" select="$dvt_RowCount = 0" />
<!-- Jquery file and plugin reference -->
<script type="text/javascript" src="_layouts/JQuery/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="_layouts/JQuery/captify.tiny.js"></script>
<script type="text/javascript">
$(window).load(function() {
// This code provides the fade-in and hide effect on regular interval
var InfiniteRotator =
{
init: function()
{
//initial fade-in time (in milliseconds)
var initialFadeIn = 1000;
//interval between items (in milliseconds)
var itemInterval = 5000;
//cross-fade time (in milliseconds)
var fadeTime = 2500;
//count number of items
var numberOfItems = $('#headers li').length;
//set current item
var currentItem = 0;
if(numberOfItems > 0) {
//show first item
$('#headers li').hide();
$('#headers li').eq(currentItem).fadeIn(fadeTime);
//$('#headers li').eq(currentItem).fadeOut(fadeTime);
if(numberOfItems > 1)
{
//loop through the items
var infiniteLoop = setInterval(function(){
$('#headers li').hide();
if(currentItem == numberOfItems -1){
currentItem = 0;
}else{
currentItem++;
}
$('#headers li').eq(currentItem).fadeIn(fadeTime);
}, itemInterval);
}
}
else {
$('#headers').append('<li><span>No images.</span></li>');
}
}
};
InfiniteRotator.init();
});
</script>
<script type="text/javascript">
$(function(){$('img.captify').captify({
speedOver: 'fast',
// speed of the mouseout effect
speedOut: 'normal',
// how long to delay the hiding of the caption after mouseout (ms)
hideDelay: 500,
// 'fade', 'slide', 'always-on'
animation: 'always-on',
// text/html to be placed at the beginning of every caption
prefix: '',
// opacity of the caption on mouse over
opacity: '0.7',
// the name of the CSS class to apply to the caption box
className: 'caption-bottom',
// position of the caption (top or bottom)
position: 'bottom',
// caption span % of the image
spanWidth: '100%'
}); });
</script>
<style type="text/css">
/*********** CAPTIFY CAPTION ***************/
.caption-top, .caption-bottom {
background: #000000;
color: #ffffff;
cursor:default;
padding:2px;
font-size:11px;
text-align:center;
}
.caption-top {
border-width:0px;
}
.caption-bottom {
border-width:0px;
}
.caption a, .caption a {
background:#000;
border:none;
text-decoration:none;
padding:2px;
}
.caption a:hover, .caption a:hover {
background:#202020;
}
#headers, #headers li{
margin:0;
padding:0;
list-style:none;
}
#headers li img{
display:none; /* hide the items at first only */
}
#rotating-item-wrapper {
position: relative;
}
</style>
<ul id="headers">
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
</xsl:call-template>
</ul>
</xsl:template>
<xsl:template name="dvt_1.body">
<xsl:param name="Rows"/>
<xsl:for-each select="$Rows">
<xsl:call-template name="dvt_1.rowview" />
</xsl:for-each>
</xsl:template>
<xsl:template name="dvt_1.rowview">
<div id="rotating-item-wrapper{generate-id()}">
<li>
<img src="{@FileRef}" class="captify" alt="{@Title}"/>
</li>
</div>
</xsl:template>
</xsl:stylesheet>
</Xsl>
<!----- XSL Tag : END ------>
Note : For your information, I have highlighted the text which is inserted after cleaning the xslt code.
Done! Just save the page and navigate to it. You should be able to see images fadding in with a regular interval having fixed caption.
Additional Notes : You can also filter the images/items by providing required filter criteria in this tag:
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[<filter_criteria>]"/>
Please let me know if you have any query.
References:
Result:
Note: You can also rotate images using Content query web part (link), but for that you should have SharePoint Server 2010, as content query web part doesn't come with SharePoint foundation 2010!
Requirements:
- Download jquery-1.7.2.min.js
- Download captify.tiny.js (for fixed caption)
- Create a picture library or use the default one and put some pictures into it.
Keep both JQuery files in the <14 hive>\Templates\Layouts\JQuery (create this folder if doesn't exist)
1. Create a new site page.
2. Now edit page in normal mode in SharePoint designer. Put your cursor before SPAN tag with id 'layoutsData' and insert an Empty Data View.
Switch to 'Split' mode, click 'Click here to select a data source' and select the picture library.
Select 'Title' for image caption and 'URL Path' for link to image. Now insert selected fields as multiple item view. It will insert complete xslt required for rendering the picture library on page.
Switch to 'Code' view. Automatically generated code contains few XSLT tag which are of no use in our case so I have removed these. Select automatically generated <XSL> tag and overwrite it with the <XSL> tag given below.
<!----- XSL Tag: START ------>
<Xsl>
<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal">
<xsl:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="dvt_apos">'</xsl:param>
<xsl:variable name="dvt_1_automode">0</xsl:variable>
<xsl:template match="/" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:SharePoint="Microsoft.SharePoint.WebControls">
<xsl:call-template name="dvt_1"/>
</xsl:template>
<xsl:template name="dvt_1">
<xsl:variable name="dvt_StyleName">Table</xsl:variable>
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
<xsl:variable name="dvt_RowCount" select="count($Rows)" />
<xsl:variable name="IsEmpty" select="$dvt_RowCount = 0" />
<!-- Jquery file and plugin reference -->
<script type="text/javascript" src="_layouts/JQuery/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="_layouts/JQuery/captify.tiny.js"></script>
<script type="text/javascript">
$(window).load(function() {
// This code provides the fade-in and hide effect on regular interval
var InfiniteRotator =
{
init: function()
{
//initial fade-in time (in milliseconds)
var initialFadeIn = 1000;
//interval between items (in milliseconds)
var itemInterval = 5000;
//cross-fade time (in milliseconds)
var fadeTime = 2500;
//count number of items
var numberOfItems = $('#headers li').length;
//set current item
var currentItem = 0;
if(numberOfItems > 0) {
//show first item
$('#headers li').hide();
$('#headers li').eq(currentItem).fadeIn(fadeTime);
//$('#headers li').eq(currentItem).fadeOut(fadeTime);
if(numberOfItems > 1)
{
//loop through the items
var infiniteLoop = setInterval(function(){
$('#headers li').hide();
if(currentItem == numberOfItems -1){
currentItem = 0;
}else{
currentItem++;
}
$('#headers li').eq(currentItem).fadeIn(fadeTime);
}, itemInterval);
}
}
else {
$('#headers').append('<li><span>No images.</span></li>');
}
}
};
InfiniteRotator.init();
});
</script>
<script type="text/javascript">
$(function(){$('img.captify').captify({
speedOver: 'fast',
// speed of the mouseout effect
speedOut: 'normal',
// how long to delay the hiding of the caption after mouseout (ms)
hideDelay: 500,
// 'fade', 'slide', 'always-on'
animation: 'always-on',
// text/html to be placed at the beginning of every caption
prefix: '',
// opacity of the caption on mouse over
opacity: '0.7',
// the name of the CSS class to apply to the caption box
className: 'caption-bottom',
// position of the caption (top or bottom)
position: 'bottom',
// caption span % of the image
spanWidth: '100%'
}); });
</script>
<style type="text/css">
/*********** CAPTIFY CAPTION ***************/
.caption-top, .caption-bottom {
background: #000000;
color: #ffffff;
cursor:default;
padding:2px;
font-size:11px;
text-align:center;
}
.caption-top {
border-width:0px;
}
.caption-bottom {
border-width:0px;
}
.caption a, .caption a {
background:#000;
border:none;
text-decoration:none;
padding:2px;
}
.caption a:hover, .caption a:hover {
background:#202020;
}
#headers, #headers li{
margin:0;
padding:0;
list-style:none;
}
#headers li img{
display:none; /* hide the items at first only */
}
#rotating-item-wrapper {
position: relative;
}
</style>
<ul id="headers">
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
</xsl:call-template>
</ul>
</xsl:template>
<xsl:template name="dvt_1.body">
<xsl:param name="Rows"/>
<xsl:for-each select="$Rows">
<xsl:call-template name="dvt_1.rowview" />
</xsl:for-each>
</xsl:template>
<xsl:template name="dvt_1.rowview">
<div id="rotating-item-wrapper{generate-id()}">
<li>
<img src="{@FileRef}" class="captify" alt="{@Title}"/>
</li>
</div>
</xsl:template>
</xsl:stylesheet>
</Xsl>
<!----- XSL Tag : END ------>
Note : For your information, I have highlighted the text which is inserted after cleaning the xslt code.
Done! Just save the page and navigate to it. You should be able to see images fadding in with a regular interval having fixed caption.
Additional Notes : You can also filter the images/items by providing required filter criteria in this tag:
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[<filter_criteria>]"/>
Please let me know if you have any query.
References:
Result:
Visual Studio 11 Beta - What's new in SharePoint Developer tools
Here are the most attractive features which are available/supported in Visual Studio 11 Beta:
1. SharePoint Lists and content types can be visually created using SharePoint List Designer in Visual Studio 11 Beta.
2. NowVisual Web Parts support sandbox solutions deployment
3. Silverlight web parts are available
4. SharePoint solutions can now be published to remote SharePoint server, no matter if it's on-primises or Office 365 (SharePoint Online), remote or local.
5. Full in-built support for performance testing of SharePoint Solutions in Visual studio.
6. Better intellisense and debugging support for Javascript solutions.
7. Right API intellisense for Sandbox solutions. So no need to worry if included API will work in Sandbox solution or not.
Quite interesting list !
For further details you can refer SharePoint Developer Team blog here.
1. SharePoint Lists and content types can be visually created using SharePoint List Designer in Visual Studio 11 Beta.
2. NowVisual Web Parts support sandbox solutions deployment
3. Silverlight web parts are available
4. SharePoint solutions can now be published to remote SharePoint server, no matter if it's on-primises or Office 365 (SharePoint Online), remote or local.
5. Full in-built support for performance testing of SharePoint Solutions in Visual studio.
6. Better intellisense and debugging support for Javascript solutions.
7. Right API intellisense for Sandbox solutions. So no need to worry if included API will work in Sandbox solution or not.
Quite interesting list !
For further details you can refer SharePoint Developer Team blog here.
Tuesday, May 8, 2012
Error occurred in deployment step ‘Recycle IIS Application Pool’: The local SharePoint server is not available.
While deploying a solution to sharepoint 2010, if user gets an error like "Error occurred in deployment step ‘Recycle IIS Application Pool’: The local SharePoint server is not available".
It means that account doesn't has sufficient rights to deploy a solution.
To solve the issue, you need to run Add-SPShellAdmin powershell command providing user name and content database GUID.
Syntax :
Add-SPShellAdmin -UserName user_name -database db_guid
[You can use Get-SPDatabase to get GUID for your content database. Make sure user running this command has permissions on SQL Server Database]
What it does?
i.) Add the user into WSS_Admin_WPG role
ii.) Provide him/her 'dbowner' and 'SharePoint_Shell_Access' permission in following databases :
It means that account doesn't has sufficient rights to deploy a solution.
To solve the issue, you need to run Add-SPShellAdmin powershell command providing user name and content database GUID.
Syntax :
Add-SPShellAdmin -UserName user_name -database db_guid
[You can use Get-SPDatabase to get GUID for your content database. Make sure user running this command has permissions on SQL Server Database]
What it does?
i.) Add the user into WSS_Admin_WPG role
ii.) Provide him/her 'dbowner' and 'SharePoint_Shell_Access' permission in following databases :
- Provided database in parameter.
- SharePoint_AdminContent_<guid>
- SharePoint_Config
Friday, May 4, 2012
Quick launch shows sites and page regardless of navigation settings
To resolve this issue, please make sure data source for quick launch navigation is surround by these tags:
<SharePoint:DelegateControl....>
<Template_Controls>
//Quick launch site map data source
</Template_Controls>
</SharePoint:DelegateContol>
See the sample code below:
<SharePoint:DelegateControl runat="server" ControlId="QuickLaunchDataSource">
<Template_Controls> <asp:SiteMapDataSource
SiteMapProvider="SPNavigationProvider"
ShowStartingNode="False"
id="QuickLaunchSiteMap"
StartingNodeUrl="sid:1025"
runat="server"/>
</Template_Controls>
</SharePoint:DelegateControl>
<SharePoint:DelegateControl....>
<Template_Controls>
//Quick launch site map data source
</Template_Controls>
</SharePoint:DelegateContol>
See the sample code below:
<SharePoint:DelegateControl runat="server" ControlId="QuickLaunchDataSource">
<Template_Controls> <asp:SiteMapDataSource
SiteMapProvider="SPNavigationProvider"
ShowStartingNode="False"
id="QuickLaunchSiteMap"
StartingNodeUrl="sid:1025"
runat="server"/>
</Template_Controls>
</SharePoint:DelegateControl>
Subscribe to:
Posts (Atom)
