<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Waldek Mastykarz</title>
	
	<link>http://blog.mastykarz.nl</link>
	<description>Innovation Matters | SharePoint Server MVP | ISSN 2210-9390</description>
	<lastBuildDate>Wed, 09 May 2012 08:59:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/WaldekMastykarz" /><feedburner:info uri="waldekmastykarz" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Inconvenient Sandboxed Web Templates and Navigation</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/tA8U_uN61PY/</link>
		<comments>http://blog.mastykarz.nl/inconvenient-sandboxed-web-templates-navigation/#comments</comments>
		<pubDate>Wed, 09 May 2012 08:59:28 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Customization]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>
		<category><![CDATA[Sandbox]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[WCM]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/inconvenient-sandboxed-web-templates-navigation/</guid>
		<description><![CDATA[Web Templates are the new recommended approach for templating sites. Combined with Sandboxed Solutions they empower power users and offer them great flexibility and productivity. There is however one inconvenience with regard to how SharePoint Navigation Providers deal with Sandboxed Web Templates. Web Templates are the way to go Back in SharePoint 2007 we had [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="404 error displayed in SharePoint 2010" src="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/banner.jpg" width="471" height="110" />     <br />Web Templates are the new recommended approach for templating sites. Combined with Sandboxed Solutions they empower power users and offer them great flexibility and productivity. There is however one inconvenience with regard to how SharePoint Navigation Providers deal with Sandboxed Web Templates.</p>
<h2>Web Templates are the way to go</h2>
<p>Back in SharePoint 2007 we had two options for templating sites: we could either save sites as templates which resulted in unmaintainable STP files or create Site Definitions and deploy them using Solution Packages. In both scenario we were locked and unable to change the template. Even though Site Definitions were deployed using solutions, changing them after sites have been created off them was not allowed and creating another Site Definition was the only option. Unfortunately, since Site Templates didn’t support Publishing Sites, creating Site Definitions was the only option in SharePoint 2007 if you had to offer the publishing capabilities in your template.</p>
<p>With the release of SharePoint 2010 Microsoft introduced Web Templates – a new, highly flexible concept for templating sites. Because there is no reference between the created site and the Web Template itself modifying Web Templates is not a problem. There is no restriction to the capabilities supported by Web Templates so you can use them with any kind of sites that you want. Additionally Web Templates can be deployed on both Farm and Site Collection level using a Farm or Sandboxed Solutions and that allows you to use Web Templates with SharePoint Online. And although Web Templates have some limitations, they are the recommended way of templating sites in SharePoint 2010.</p>
<h2>Sandboxed Web Templates</h2>
<p>Web Templates can be deployed on specific Site Collections only as opposite to the whole Farm and with that they can be deployed using Sandboxed Solutions. This offers great flexibility to IT-Pros, developers and power users. Sandboxed Solutions require virtually no maintenance from IT-Pros. Site Templates created by power users are saved as Sandboxed Solutions and with some effort they can be extended by developers with new functionality. Distributing Web Templates using Sandboxed Solutions allows you to truly benefit of the customization capabilities of the SharePoint 2010 platform and create business solutions that are usable both on-premise and on-line.</p>
<p>Although there is no difference in building Web Templates for the Sandbox and Farm Solutions, there are some differences in how SharePoint provisions contents of Sandboxed Solutions. One of those difference impacts using Web Templates for templating sites.</p>
<h2>Inconvenient Sandboxed Web Templates and Navigation</h2>
<p>Imagine we had a Web Template distributed with a Sandboxed Solution. The Web Template is a template for a Publishing Site used for creating subsites on a Publishing Site Collection with anonymous access. As soon as you create a subsite off the Web Template what you will see is that the link to that particular site is automatically added to the navigation.</p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/01.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Link to the newly created subsite added to the navigation in SharePoint 2010" src="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/01_thumb.jpg" width="480" height="232" /></a></p>
<p>This works as expected given we are authenticated and have access to pages that haven’t been published yet. Unfortunately if you access the same site as an anonymous user you will still be able to see the link to the newly created subsite that hasn’t been published yet!</p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/02.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Link to the newly created subsite visible in the navigation before publishing it" src="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/02_thumb.jpg" width="480" height="236" /></a></p>
<p>It’s not that hard to imagine that as soon as you click this link you will see a 404 error: after all the Welcome Page of that subsite hasn’t been published yet and therefore is not available for anonymous users.</p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/03.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="404 error displayed after clicking the link to the newly created subsite" src="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/03_thumb.jpg" width="480" height="189" /></a></p>
<p>If you now go back to the newly created subsite and check in the Welcome Page as draft, the link to that subsite will disappear from the navigation for anonymous users – just as you would expect it to in the first place.</p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/04.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Welcome Page checked in and viewable by authenticated users" src="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/04_thumb.jpg" width="480" height="410" /></a></p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/05.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="No link to the newly created subsite visible in the navigation for anonymous users" src="http://blog.mastykarz.nl/images/Inconvenient-Sandboxed-Web-Templates-and_6847/05_thumb.jpg" width="480" height="182" /></a></p>
<p>This odd behavior has partly to do with the fact how Sandboxed Solutions provision files by default. Whenever you provision a file using a Module in a Sandboxed Solution that file will remain checked out and there is no version checked in at all. What’s surprising is how SharePoint Navigation Providers deal with that scenario. Instead of hiding the link to the website, the link is displayed in the navigation and if the content author isn’t careful enough, such “broken” links will appear to anonymous users.</p>
<h2>Sandboxed Web Templates and Navigation – better together</h2>
<p>Provisioning files as checked out without any version checked in is how Sandboxed Solution handle Modules by default. Unfortunately there is now way to change this behavior declaratively and with that there are two solutions that you can choose from.</p>
<h3>Teach, teach, teach</h3>
<p>One approach that you could choose for is to stick with the standard SharePoint 2010 behavior and educate content authors to always check in the Welcome Page after creating a subsite. This is useful not only to prevent broken links to be displayed in the navigation but also to allow other members of the content authoring team to edit the contents of the Welcome Page. The great benefit of this approach is that you stick with the standard approach and instead of altering it or introducing custom solutions you educate users about the issue and potential consequences.</p>
<h3>Check it in… automatically</h3>
<p>Another choice that you have is to add a Feature Receiver to the Feature responsible for provisioning the Welcome Page and have it automatically check in the Welcome Page as a draft. With that the Welcome Page remains invisible to anonymous/unprivileged users and no additional effort is required from the content authors. The only downside is that custom code is required and is something that cannot be created by power users themselves and would need to be maintained and tested in the future.</p>
<p>As you can imagine both approaches have their pro’s and cons. It’s important to know that neither of them is better than the other and which one you choose depends a lot on your team and requirements.</p>
<h2>Summary</h2>
<p>Web Templates are the new recommended way for templating sites in SharePoint 2010. Unfortunately when used with Sandboxed Solutions, when you create a subsite off a Web Template, a broken link is added to the navigation for all users. This inconvenience can be solved by either manually checking in the Welcome Page of the subsite or using custom code and the choice for either approach should be made based on the requirements of the particular scenario.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tA8U_uN61PY:TCrRSORVaeY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tA8U_uN61PY:TCrRSORVaeY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tA8U_uN61PY:TCrRSORVaeY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=tA8U_uN61PY:TCrRSORVaeY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tA8U_uN61PY:TCrRSORVaeY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tA8U_uN61PY:TCrRSORVaeY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=tA8U_uN61PY:TCrRSORVaeY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/tA8U_uN61PY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/inconvenient-sandboxed-web-templates-navigation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/inconvenient-sandboxed-web-templates-navigation/</feedburner:origLink></item>
		<item>
		<title>Inconvenient Templated Controls and customized pages in SharePoint 2010</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/9oVh5tV9UTc/</link>
		<comments>http://blog.mastykarz.nl/inconvenient-templated-controls-customized-pages-sharepoint-2010/#comments</comments>
		<pubDate>Sun, 06 May 2012 07:51:51 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/inconvenient-templated-controls-customized-pages-sharepoint-2010/</guid>
		<description><![CDATA[Using Templated Controls is a great way for separating UI from functionality. Unfortunately as soon as you customize the Master Page or Page Layouts that uses a Templated Control things are likely break. So what is exactly happening behind the scenes and, what’s more important, how should you deal with it? Templated Controls are the [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="Mavention Templated SiteMapPath control in a Master Page" src="http://blog.mastykarz.nl/images/Inconvenient-Templated-Controls-and-cust_9775/banner.jpg" width="471" height="110" />     <br />Using Templated Controls is a great way for separating UI from functionality. Unfortunately as soon as you customize the Master Page or Page Layouts that uses a Templated Control things are likely break. So what is exactly happening behind the scenes and, what’s more important, how should you deal with it?</p>
<h2>Templated Controls are the way to go</h2>
<p>When building public-facing websites the HTML is the center of the universe. At the end of the day it’s the HTML that has a big influence on the success of your website. By crafting proper HTML you can ensure that your website is accessible for all users and devices, you can optimize its contents for search engines and in many cases you can even improve the perceived performance of your web pages. You can achieve all of this if you construct HTML optimized for the specific needs of your website and its content.</p>
<p>Assuming that you’re following this pattern, of starting from HTML and implementing it into SharePoint, it’s only the matter of time until you find that some of the standard available controls and Web Parts won’t support your HTML. In such cases developers often choose either to build their own controls that produce just the right HTML or to change the HTML to match the output of the standard SharePoint 2010 controls. It’s not that hard to imagine that neither of those choices are great in long term and preferably you would like to have another possibility.</p>
<p>When it comes to building public-facing websites, where the HTML is the foundation of the user experience, Templated Controls are probably the best approach to choose. Because they separate the functionality from the UI you can use one and the same control to build virtually any kind of HTML imaginable. Previously on my blog I’ve showed you how you can leverage the concept of Templated Controls for building <a href="/templates-based-menu-control-sharepoint/">menus</a> and <a href="/building-breadcrumbs-sharepoint-2010/">breadcrumbs</a>.</p>
<h2>Many faces of building websites in SharePoint 2010</h2>
<p>When building public-facing websites, or any other solution for that matter, on the SharePoint 2010 platform there are two ways in how you can approach the process: you can choose for a more structured and repeatable process based on automation, Solution Packages and Features or you can leverage the customization capabilities of the SharePoint and move away from the custom development path.</p>
<p>A structured and repeatable approach offers you great control and lowers possible risks. The consequence of using it is however that you will end up spending more time to automate your deployment and test your solution in all the different environments. Customization-based approach on the other hand is great for working in dynamic teams where adjustments or changes have to be done immediately and where they are related to content management rather than business logic.</p>
<p>It’s important to understand that there is no “best practice” and that you should always make educated choice about which approach you choose based on your situation and requirements. You should however be always able to choose out of those two approaches and not be limited to a certain choice.</p>
<h2>Inconvenient Templated Controls and customized Master Pages and Page Layouts</h2>
<p>Templated Controls allow you to separate the business logic from the UI and with that create truly reusable components: while the business logic is often the same within the whole organization, different teams or brands have very likely their own way of presenting things to the end users.</p>
<p>When working with Templated Controls you can define the presentation layer using Templates. The exact number of those templates depends of course on the control that you are using, but the mechanics is the same for all them. The following code snippet shows an implementation of a breadcrumb using the Mavention Templated SiteMapPath control that I have built recently:</p>
<pre class="brush: xml;">&lt;Mavention:TemplatedSiteMapPath runat=&quot;server&quot;&gt;
    &lt;HeaderTemplate&gt;&lt;div id=&quot;breadcrumbs&quot;&gt;&lt;/HeaderTemplate&gt;
    &lt;RootNodeTemplate&gt;&lt;a href='&lt;%# Eval(&quot;Url&quot;) %&gt;'&gt;home&lt;/a&gt;&lt;/RootNodeTemplate&gt;
    &lt;NodeTemplate&gt;&lt;a href='&lt;%# Eval(&quot;Url&quot;) %&gt;'&gt;&lt;%# Eval(&quot;Title&quot;) %&gt;&lt;/a&gt;&lt;/NodeTemplate&gt;
    &lt;CurrentNodeTemplate&gt;&lt;%# Eval(&quot;Title&quot;) %&gt;&lt;/CurrentNodeTemplate&gt;
    &lt;SeparatorTemplate&gt; / &lt;/SeparatorTemplate&gt;
    &lt;FooterTemplate&gt;&lt;/div&gt;&lt;/FooterTemplate&gt;
&lt;/Mavention:TemplatedSiteMapPath&gt;</pre>
<p>Here is another control that I have used recently to render meta description:</p>
<pre class="brush: xml;">&lt;Mavention:FieldValue FieldName=&quot;MetaDescription&quot; runat=&quot;server&quot;&gt;&lt;ContentTemplate&gt;&lt;meta name=&quot;description&quot; content='&lt;%# Eval(&quot;FieldValue&quot;) %&gt;' /&gt;&lt;/ContentTemplate&gt;&lt;/Mavention:FieldValue&gt;</pre>
<p>While both controls work great, as soon as you customize the Master Page you will see the following error message:</p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Templated-Controls-and-cust_9775/01.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="The ‘Code blocks are not allowed in this file’ error message" src="http://blog.mastykarz.nl/images/Inconvenient-Templated-Controls-and-cust_9775/01_thumb.jpg" width="480" height="252" /></a></p>
<h2>Plan for customization</h2>
<p>There is a difference between how SharePoint handles customized and uncustomized Master Pages and Page Layouts. One of those differences is that by default no inline code is allowed on customized pages. As I have just showed you, although some code might work just perfectly on uncustomized pages, it can break as soon as you customize them.</p>
<p>Although you could suppress this security feature by <a href="http://msdn.microsoft.com/en-us/library/bb862025(v=office.14).aspx?ocid=aff-n-we-loc--ITPRO40936&amp;WT.mc_id=aff-n-we-loc--ITPRO40936">registering a Page Parser Path</a>, it introduces a security risk. As soon as you define a Page Parser Path everyone with write access to the files in that path will be able to include server-side code that could potentially break your entire farm! With that you should be really careful with designing your solutions with dependencies on Page Parser Paths.</p>
<p>The customization capabilities of SharePoint 2010 are very powerful and just because you might not use them at first doesn’t mean you won’t be using them later on. It is therefore important that you take the customization scenarios into account and check if the code that you are using works properly with customized pages. Without this it is only the matter of time until you find yourself facing a choice: not using customization capabilities, even though it might make just perfect sense for that particular scenario, or refactoring all the code that doesn’t work with customized pages. As you can imagine neither of those choices is a great option and if you will eventually refactor the code why not do it in the first place?</p>
<h2>Templated Controls and customized Master Pages and Page Layouts – better together</h2>
<p>Templated Controls do support customized pages. There are however a few things that you have to take care for to ensure that your code snippets won’t break pages once they are customized.</p>
<h3>Using the out-of-the-box</h3>
<p>In both examples that I have showed you before I have used content templates based on static HTML calling the <em>Eval</em> method to get the underlying data. It’s the combination of static HTML and <em>Eval</em> that causes the error that we have seen after customizing the Master Page. Because the <em>Eval</em> method is called directly from the content template it’s being considered in-line code which is not allowed on customized pages. In order to solve this issue all you need to do is to ensure that all calls to the <em>Eval</em> method happen from within a server-side control.</p>
<p>If we look at the code samples I have showed you previously, we could refactor the breadcrumb to look as follow:</p>
<pre class="brush: xml;">&lt;Mavention:TemplatedSiteMapPath runat=&quot;server&quot;&gt;
    &lt;HeaderTemplate&gt;&lt;div id=&quot;breadcrumbs&quot;&gt;&lt;/HeaderTemplate&gt;
    &lt;RootNodeTemplate&gt;&lt;asp:Hyperlink NavigateUrl='&lt;%# Eval(&quot;Url&quot;) %&gt;' Text=&quot;home&quot; ID=&quot;Link&quot; runat=&quot;server&quot; /&gt;&lt;/RootNodeTemplate&gt;
    &lt;NodeTemplate&gt;&lt;asp:Hyperlink NavigateUrl='&lt;%# Eval(&quot;Url&quot;) %&gt;' Text='&lt;%# Eval(&quot;Title&quot;) %&gt;' ID=&quot;Link&quot; runat=&quot;server&quot; /&gt;&lt;/NodeTemplate&gt;
    &lt;CurrentNodeTemplate&gt;&lt;asp:Literal Text='&lt;%# Eval(&quot;Title&quot;) %&gt;' ID=&quot;Node&quot; runat=&quot;server&quot; /&gt;&lt;/CurrentNodeTemplate&gt;
    &lt;SeparatorTemplate&gt; / &lt;/SeparatorTemplate&gt;
    &lt;FooterTemplate&gt;&lt;/div&gt;&lt;/FooterTemplate&gt;
&lt;/Mavention:TemplatedSiteMapPath&gt;</pre>
<p>By replacing static HTML with ASP.NET controls we can work around the security feature and have our breadcrumbs work both with uncustomized and customized pages:</p>
<p><a href="http://blog.mastykarz.nl/images/Inconvenient-Templated-Controls-and-cust_9775/02.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Breadcrumbs displayed on a Publishing Page in SharePoint 2010" src="http://blog.mastykarz.nl/images/Inconvenient-Templated-Controls-and-cust_9775/02_thumb.jpg" width="480" height="371" /></a></p>
<p>As for refactoring the second control – the meta description tag you could use the <em>HtmlMeta</em> control that is a part of the ASP.NET framework:</p>
<pre class="brush: xml;">&lt;Mavention:FieldValue runat=&quot;server&quot; FieldName=&quot;MetaDescription&quot;&gt;&lt;ContentTemplate&gt;&lt;asp:HtmlMeta Name=&quot;description&quot; Content='&lt;%# Eval(&quot;FieldValue&quot;) %&gt;' ID=&quot;MetaDescription&quot; runat=&quot;server&quot; /&gt;&lt;/ContentTemplate&gt;&lt;/Mavention:FieldValue&gt;</pre>
<p>The only downside of this approach is that because we have to specify the <em>ID</em> for the HtmlMeta control the ID will be added to the output HTML and we will end up with HTML similar to following:</p>
<pre class="brush: xml;">&lt;meta id=&quot;ctl00_ctl01_ctl00_MetaDescription&quot; name=&quot;description&quot; content=&quot;Meta description 123&quot; /&gt;</pre>
<p>Although it’s still valid (X)HTML the id attribute is somewhat pointless yet necessary from the ASP.NET perspective.</p>
<p>Another approach that you might consider is somewhat more complex to come up with and to manage but it gives you some more control of the output HTML:</p>
<pre class="brush: xml;">&lt;Mavention:FieldValue runat=&quot;server&quot; FieldName=&quot;MetaDescription&quot;&gt;&lt;ContentTemplate&gt;&lt;meta name=&quot;description&quot; content=&quot;&lt;asp:Literal Text='&lt;%# Eval(&amp;quot;FieldValue&amp;quot;) %&gt;' runat='server' ID='FieldValue' /&gt;&quot; /&gt;&lt;/ContentTemplate&gt;&lt;/Mavention:FieldValue&gt;</pre>
<p>As you can see we still use static HTML here but in the <em>content</em> attribute we inject the ASP.NET Literal control to have the binding executed in the context of a server control. The biggest challenge in this approach is trying to follow the code and having all the quotes, especially when they are nested, in the right place.</p>
<h3>Building custom controls</h3>
<p>Although ASP.NET provides you with many controls that should be sufficient for most scenarios, there are situations when you might want that extra bit of control of the output HTML: after all this is exactly the reason why we chose for Templated Controls in the first place. In such cases you have two options: you can build your own custom controls or using an alternative templating mechanism.</p>
<p>Building your own set of custom controls is not that complex and requires no new skills other than what you already can, assuming you are a SharePoint developer. Unfortunately it undermines the whole concept of using Templated Controls since custom control have to have at least partial knowledge about the HTML that they are supposed to render and with that it’s very likely that you won’t be able to reuse them with other solutions.</p>
<p>Another thing that you could do, and that would give you full control of the output HTML is to use a templating mechanism other than the default binding, for example:</p>
<pre class="brush: xml;">&lt;Mavention:FieldValue runat=&quot;server&quot; FieldName=&quot;MetaDescription&quot; UseStringTemplateRendering=&quot;true&quot;&gt;&lt;ContentTemplate&gt;&lt;meta name=&quot;description&quot; content=&quot;$FieldValue$&quot; /&gt;&lt;/ContentTemplate&gt;&lt;/Mavention:FieldValue&gt;</pre>
<p>Notice how the call to the <em>Eval</em> method has been replaced with a custom <em>$FieldValue$ </em>token. Also to notify our control that we want to use the alternative templating method we have set the <em>UseStringTemplateRendering</em> property to <em>true</em>. During the rendering stage of the process the control will check if it should use the standard or the string-based rendering process and if the later is the case, it will basically do a string replace on all registered parameters which in this case is <em>$FieldValue$</em>.</p>
<pre class="brush: csharp;">protected override void Render(HtmlTextWriter writer) {
    if (UseStringTemplateRendering) {
        if (FieldValue != null) {
            StringBuilder sb = new StringBuilder();
            using (StringWriter sw = new StringWriter(sb)) {
                using (HtmlTextWriter htw = new HtmlTextWriter(sw)) {
                    base.Render(htw);
                }
            }

            writer.Write(sb.ToString().Replace(&quot;$FieldValue$&quot;, FieldValue as string));
        }
    }
    else {
        base.Render(writer);
    }
}</pre>
<p>Because no ASP.NET bindings are used we can now support both uncustomized and customized pages and have full control of the output HTML which is essential if you want to build public facing websites on the SharePoint 2010 platform and to have HTML to be leading in the process.</p>
<h2>Summary</h2>
<p>Templated Controls are a great way for separating the UI from the code and creating reusable components that support every kind of HTML markup. Unfortunately because there is a difference in how SharePoint treats uncustomized and customized pages, it’s challenging to work with Templated Controls and support both types of pages. In such cases using an alternative templating approach is often the best choice that offers the most flexibility and control over the output HTML.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=9oVh5tV9UTc:VtBEuEu0oDY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=9oVh5tV9UTc:VtBEuEu0oDY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=9oVh5tV9UTc:VtBEuEu0oDY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=9oVh5tV9UTc:VtBEuEu0oDY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=9oVh5tV9UTc:VtBEuEu0oDY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=9oVh5tV9UTc:VtBEuEu0oDY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=9oVh5tV9UTc:VtBEuEu0oDY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/9oVh5tV9UTc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/inconvenient-templated-controls-customized-pages-sharepoint-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/inconvenient-templated-controls-customized-pages-sharepoint-2010/</feedburner:origLink></item>
		<item>
		<title>Easy fixing broken Publishing Pages with Mavention Publishing Page Settings</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/uOOE3EeX_Rk/</link>
		<comments>http://blog.mastykarz.nl/easy-fixing-broken-publishing-pages-mavention-publishing-page-settings/#comments</comments>
		<pubDate>Sat, 05 May 2012 11:58:54 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Sandbox]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[SharePoint Gems]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/easy-fixing-broken-publishing-pages-mavention-publishing-page-settings/</guid>
		<description><![CDATA[When working with Publishing Pages it happens once in a while that you apply a broken Page Layout to a Publishing Page and since you cannot navigate to that page to change the layout back the only option seems to either recreate the page with a different layout or fix the layout. There is however [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="SharePoint 2010 error message" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/banner.jpg" width="471" height="110" />     <br />When working with Publishing Pages it happens once in a while that you apply a broken Page Layout to a Publishing Page and since you cannot navigate to that page to change the layout back the only option seems to either recreate the page with a different layout or fix the layout. There is however another – easier way. Find out how to easily change the layout of a broken Publishing Page using the Mavention Publishing Page Settings solution.</p>
<h2>Inconvenient switching Page Layouts</h2>
<p>When the Ribbon has been introduced with SharePoint 2010 almost all of the UI has been redesigned to make it more intuitive and easier to use. As a result most of the options have been put in a different place than where they used to be in SharePoint 2007.</p>
<p>In SharePoint 2010 almost all of the tasks related to working with Publishing Pages are available from the page itself. This is very convenient for content authors and content managers since they have easy access to all functionality that they need to do their work.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/01.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Publishing Page tasks on the Ribbon in SharePoint 2010" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/01_thumb.jpg" width="480" height="258" /></a></p>
<p>The only problem is that if the page is broken, you don’t have the access to most of the options that you could use to fix that page! Because the associated Page Layout is not a field it is not accessible via the <em>Edit Properties</em> page and the only way to change is to navigate to the page and use the Ribbon. But if the page is broken, all you will see instead is an error message.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/02.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="02" border="0" alt="02" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/02_thumb.jpg" width="480" height="269" /></a></p>
<p>In such case you can either recreate the page with all the data, losing the version history and perhaps some other information or you can try to fix the Page Layout which might not always be a viable option for the given moment. So is there anything else that we could do?</p>
<h2>SharePoint gem</h2>
<p>Back in SharePoint 2007 you could change the Page Layout of a Publishing Page by navigating to the Page Settings page. Unfortunately in SharePoint 2010 this page is no longer accessible via the UI. The great news is though, that this page is still available and that we can still use it to change the associated Page Layout for a broken Publishing Page.</p>
<p>You can access the Page Settings page by appending to the URL of the site <strong>_layouts/PageSettings?Page=<em>id</em></strong> and replacing the id with the ID of the Publishing Page, for example:</p>
<pre class="brush: plain;">http://mavention/PressReleases/_layouts/pagesettings.aspx?Page=1</pre>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/03.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Page Settings page displayed for the Publishing Page with ID 1" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/03_thumb.jpg" width="480" height="198" /></a></p>
<p>While this works, it is pretty inconvenient to get the ID of the Publishing Page that is broken. There is however a better way to access the Page Settings page.</p>
<h2>Opening the Page Settings page with Mavention Publishing Page Settings</h2>
<p>Mavention Publishing Page Settings is a Sandboxed Solution that upon installation adds a new button to the Ribbon in all Pages Libraries. Using that button you can open the Page Settings page for the selected Publishing Page.</p>
<p>When you first navigate to a Pages Library the Page Settings button is disabled.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/04.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="The Page Settings button disabled in the Ribbon" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/04_thumb.jpg" width="480" height="200" /></a></p>
<p>Once you select a Publishing Page it becomes enabled.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/05.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="The Page Settings button enabled in the Ribbon" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/05_thumb.jpg" width="480" height="199" /></a></p>
<p>After you click the Page Settings button, the Page Settings page will be opened in a modal dialog window – which is exactly how you want it to be in SharePoint 2010.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/06.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="06" border="0" alt="06" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/06_thumb.jpg" width="480" height="242" /></a></p>
<p>Using the Page Settings page you can now change the Page Layout of your broken page.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/07.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="SharePoint 2010 Publishing Page" src="http://blog.mastykarz.nl/images/Easy-fixing_BA0D/07_thumb.jpg" width="480" height="345" /></a></p>
<h2>Summary</h2>
<p>When working with Publishing Pages there are situations when the Page Layout is broken and you cannot change it, because the only option to change the Page Layout of a Publishing Page is located on that page itself. Using the Mavention Publishing Page Settings solution you can easily change the Page Layout of a Publishing Page from within the Pages Library.</p>
<p>Download: <a href="http://blog.mastykarz.nl/go/d-mavention_publishingpagesettings/">Mavention Publishing Page Settings</a> (1,29KB, Sandboxed WSP)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uOOE3EeX_Rk:gu20pLPW0As:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uOOE3EeX_Rk:gu20pLPW0As:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uOOE3EeX_Rk:gu20pLPW0As:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=uOOE3EeX_Rk:gu20pLPW0As:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uOOE3EeX_Rk:gu20pLPW0As:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uOOE3EeX_Rk:gu20pLPW0As:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=uOOE3EeX_Rk:gu20pLPW0As:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/uOOE3EeX_Rk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/easy-fixing-broken-publishing-pages-mavention-publishing-page-settings/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/easy-fixing-broken-publishing-pages-mavention-publishing-page-settings/</feedburner:origLink></item>
		<item>
		<title>Easy building Enterprise Solution Stores in SharePoint 2010 with Mavention Solution Store Builder</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/I3kaSiNkKu4/</link>
		<comments>http://blog.mastykarz.nl/easy-building-enterprise-solution-stores-sharepoint-2010-mavention-solution-store-builder/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 08:58:17 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Sandbox]]></category>
		<category><![CDATA[SharePoint 2010]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/easy-building-enterprise-solution-stores-sharepoint-2010-mavention-solution-store-builder/</guid>
		<description><![CDATA[In my previous article I showed you how you can leverage SharePoint 2010 extensibility capabilities to build an Enterprise Solution Store for your organization. In this article I will share with you Mavention Solution Store Builder – a solution that I’ve built that allows you to easily create your own Enterprise Solution Store without any [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="Enterprise Store displayed in the Gallery" src="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/banner.jpg" width="471" height="110" />     <br /><a href="/building-enterprise-solution-catalogs-sharepoint-2010/">In my previous article I showed you how you can leverage SharePoint 2010 extensibility capabilities to build an Enterprise Solution Store for your organization</a>. In this article I will share with you Mavention Solution Store Builder – a solution that I’ve built that allows you to easily create your own Enterprise Solution Store without any custom development.</p>
<h2>What is Mavention Solution Store Builder</h2>
<p>Mavention Solution Store Builder is a SharePoint 2010 Solution that allows you to easily build an Enterprise Solution Store for your own organization. It uses a Document Library to store Solutions and you can have multiple Document Libraries spread across multiple Site Collections that will make up your Enterprise Solution Store.</p>
<h2>Building an Enterprise Solution Store with Mavention Solution Store Builder</h2>
<p>After deploying the Mavention Solution Store Builder Solution your Enterprise Store will be installed. You can confirm that if you see the <em>Enterprise Store</em> tab added to the Gallery.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/01.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="The Enterprise Store tab added to the Gallery" src="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/01_thumb.jpg" width="465" height="326" /></a></p>
<p>Since no configuration for the Enterprise Store has been provided yet, you will see an error message when you open it.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/02.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Error message displayed after navigating to the Enterprise Store" src="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/02_thumb.jpg" width="480" height="163" /></a></p>
<p>In order to build an Enterprise Store you have to do two things: you have to create at least one Store Catalog Library where you will upload your Solutions and you have to deploy a configuration file that will point to all the locations of all your Store Catalog Libraries.</p>
<h3>Creating a Store Catalog Library</h3>
<p>The Mavention Solution Store Builder Solution contains the Store Catalog List that can be used to create catalog libraries for storing Solutions. In order to install this List Definition you have to activate the <em>Mavention Solution Store Builder Store Library</em> Site Collection Feature.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/03.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Mavention Solution Store Builder Store Library Site Collection Feature" src="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/03_thumb.jpg" width="480" height="97" /></a></p>
<p>After activating the Site Collection Feature you can continue with creating Store Catalog libraries. You need at least one Store Catalog library and you can have as many of them as you want. There is no limitations as to where those libraries are located as long as their contents can be requested by the current user.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/04.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Store Catalog library created in a SharePoint site" src="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/04_thumb.jpg" width="480" height="153" /></a></p>
<h3>Configuring Enterprise Store</h3>
<p>After you have created Store Catalog libraries the last thing that you need to do is to let the Mavention Solution Store Builder know where your Store Catalogs are located. You can do this by using a configuration file that must be called <strong>Mavention.SharePoint.SolutionStore.dll.config</strong> and must be located in the <em>14\TEMPLATE\LAYOUTS\AddGalleryProviders</em> folder. The following code snippet shows the sample structure of the configuration file:</p>
<pre class="brush: xml;">&lt;configuration&gt;
  &lt;Provider&gt;
    &lt;Sources&gt;
      &lt;SharePointLocal SiteUrl=&quot;http://mavention&quot; ListName=&quot;SolutionCatalog&quot;/&gt;
    &lt;/Sources&gt;
  &lt;/Provider&gt;
&lt;/configuration&gt;</pre>
<p>For every Store Catalog you have to create a <em>SharePointLocal</em> element and have its <em>SiteUrl</em> and <em>ListName</em> attributes point to respectively the site where the Store Catalog library is located and the name of the Store Catalog library.</p>
<p>After you have created the configuration file you have to deploy it to the right location. You could do this manually but it’s definitely a better idea to follow the pattern I have described in my previous article and to have the configuration file deployed using a SharePoint Package.</p>
<p>If you have done everything correctly, if you would navigate to the Enterprise Store now all you should see would be an empty page. Although the Store Catalog is in place there are no Solutions in it yet, so this is what we will do next: upload some Solutions to the Store Catalog.</p>
<h3>Uploading Solutions to the Store Catalog</h3>
<p>In this release of Mavention Solution Store Builder the Store Catalog is simplified version of what’s possible to achieve using the Gallery capability. At this moment using a Store Catalog you can upload a Sandboxed Solution, provide its title, description, comma-separated list of categories, image, and URL to the image and EULA. One more thing, that probably has the most influence on how the Solution will be installed is the <em>Solution Code Type</em> property that I explained in my previous article.</p>
<blockquote>
<p><strong>Important: </strong>If you set the Solution Code Type property to Full Tust code your Solution will not appear in the Gallery since this Solution Code Type is not supported by the Gallery at this moment.</p>
</blockquote>
<p>To support the review process of uploaded Solutions, the Store Catalog List Definition has the Approval Workflow enabled and allows to view draft versions only by users who have Approval Permissions by default. Those settings will be applied by default to every Store Catalog Library that you create. With this you can control when Solutions become available to users but you can configure the settings for your organization by altering the list configuration.</p>
<p>Once you’ve uploaded and approved your Solutions they will appear in the Enterprise Store ready to be downloaded and installed by your users.</p>
<p><a href="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/05.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Two Mavention Solutions displayed in the Enterprise Store" src="http://blog.mastykarz.nl/images/Easy-building-Enterprise-Solution-Stores_141FD/05_thumb.jpg" width="480" height="305" /></a></p>
<h2>Summary</h2>
<p>Mavention Solution Store Builder is a solution that allows you to easily create a simple company-wide Solution Store for your organization without any custom development. Although it doesn’t offer full capabilities of the Gallery component of SharePoint 2010 it gives you a quick start in providing you with a mechanism to deliver your custom Solutions to your users.</p>
<p>Download: <a href="http://blog.mastykarz.nl/go/d-mavention_solutionstorebuilder/">Mavention Solution Store Builder</a> (151KB, WSP)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=I3kaSiNkKu4:Ph5vQAb29Eo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=I3kaSiNkKu4:Ph5vQAb29Eo:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=I3kaSiNkKu4:Ph5vQAb29Eo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=I3kaSiNkKu4:Ph5vQAb29Eo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=I3kaSiNkKu4:Ph5vQAb29Eo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=I3kaSiNkKu4:Ph5vQAb29Eo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=I3kaSiNkKu4:Ph5vQAb29Eo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/I3kaSiNkKu4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/easy-building-enterprise-solution-stores-sharepoint-2010-mavention-solution-store-builder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/easy-building-enterprise-solution-stores-sharepoint-2010-mavention-solution-store-builder/</feedburner:origLink></item>
		<item>
		<title>Building Enterprise Solution Catalogs in SharePoint 2010</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/-Pt9AVlx4KM/</link>
		<comments>http://blog.mastykarz.nl/building-enterprise-solution-catalogs-sharepoint-2010/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 08:20:37 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Sandbox]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[SharePoint Gems]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/building-enterprise-solution-catalogs-sharepoint-2010/</guid>
		<description><![CDATA[Enterprise Solution Catalogs are a great way of delivering solutions to your end users. Find out how to build an Enterprise Solution Catalog for your company by leveraging the extensibility capabilities of the SharePoint 2010 platform. Extending the SharePoint platform Probably the greatest strength of the SharePoint 2010 platform is its extensibility capabilities. While SharePoint [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="Mavention Store added to the Gallery" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/banner.jpg" width="471" height="110" />     <br />Enterprise Solution Catalogs are a great way of delivering solutions to your end users. Find out how to build an Enterprise Solution Catalog for your company by leveraging the extensibility capabilities of the SharePoint 2010 platform.</p>
<h2>Extending the SharePoint platform</h2>
<p>Probably the greatest strength of the SharePoint 2010 platform is its extensibility capabilities. While SharePoint 2010 contains some standard functionality, it’s the ability of configuring it, customizing it and building on top of it that allows you to get the very most out of SharePoint for your organization.</p>
<p>When building SharePoint solutions there are a number of options you can choose from. One approach is to use nothing more than standard functionality provided with SharePoint and use nothing more than configuration capabilities of those standard components. Another approach is to use the Client Object Model (Silverlight or ECMA script) to interact with SharePoint data. Finally you can use the server API to get the richest integration with the SharePoint platform. No matter your choice, once done, you would very likely package your solution to make it easy to install and reuse for your end users. An Enterprise Solution Catalog seems like a great way to deliver such solutions to end user so that they can install them on their sites.</p>
<h2>Enterprise Solution Catalog – the requirements</h2>
<p>An Enterprise Solution Catalog is a platform for showcasing and distributing SharePoint solutions within your organization. As opposite to a public marketplace, an Enterprise Solution Catalog is internal only meaning that you can ensure that your intellectual&#160; property will not leave the organization and yet have all the different departments and teams benefit of each others work.</p>
<p>From the publishers perspective an Enterprise Solution Catalog should at least support a way to upload solutions alongside with some information about them such as title, description, purpose, etc. Organization might want to have some process in place that would allow them to review the uploaded solutions and control how they appear in the Solution Catalog. Finally end users should be given the ability to easily discover available solution and install them without too much work.</p>
<h2>Catalog? It’s already there!</h2>
<p>Given those requirements we could build a custom solution that would become an Enterprise Solution Catalog. Did you know however, that SharePoint 2010 provides you with an extensible mechanism for building your own Enterprise Solution Store?</p>
<p>Although it’s not that well known or documented you might have noticed it whenever you create a new List or Site – the <em>Office.com</em> link in the Create dialog window.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/01.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Red arrow pointing to the Office.com link in the Create dialog window" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/01_thumb.jpg" width="480" height="337" /></a></p>
<p>Although clicking the Office.com doesn’t do much at the moment, it is a good example that shows how you can extend the Create dialog and add your own Enterprise Solution Store to it.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/02.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Error message displayed after clicking the Office.com link in the Create dialog window" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/02_thumb.jpg" width="480" height="222" /></a></p>
<h2>Anatomy of a solution provider</h2>
<p>The Create dialog in SharePoint 2010 is built around a provider model: every link is an implementation of a Gallery Provider that is responsible for returning Gallery Items (solutions).</p>
<h3>How it works: retrieving available providers</h3>
<h3></h3>
<p>Every time the Create dialog window opens the Gallery is loaded. The Gallery is driven by the <em>14\TEMPLATE\LAYOUTS\AddGallery.aspx </em>Application Page and the Gallery Silverlight application is located in the <em>14\TEMPLATE\LAYOUTS\AddGallery.xap</em> file. The Application Page contains the AddGalleryWebPart Web Part which is the backbone of the Gallery mechanism and facilitates communication between the UI and Gallery Providers.</p>
<p>One of the first calls made after opening the Create dialog window is retrieving available Gallery Providers which in this case is nothing more than an assembly located in the <em>14\TEMPLATE\LAYOUTS\AddGalleryProviders</em> folder. Out of the box you can find there the <em>AddGallery.OfficeOnlineProvider.dll</em> assembly which contains the implementation of the <em>Office.com</em> Gallery Provider and is a great resource to see how a Gallery Provider works.</p>
<blockquote><p><strong>Important:</strong> Gallery Providers are Farm-wide so you cannot install them for specific Web Applications/Site Collections only.</p>
</blockquote>
<p>After available Gallery Providers are enumerated, their assemblies are streamed to the Gallery application and loaded.</p>
<h3>How it work: loading a Gallery Provider</h3>
<p>After the assembly with Gallery Provider has been loaded in the Gallery application the available Gallery Providers are instantiated. Each Gallery Provider is a class that inherits from the <em>Microsoft.SharePoint.Solutions.AddGallery.Provider.ClientFilteredProvider&lt;T&gt;</em> base class. That class can be found in the <em>AddGallery.Provider</em> assembly located inside the <em>AddGallery.xap</em> file.</p>
<p>After the Gallery application has discovered Gallery Providers’ classes it instantiates them and adds them to the UI of the Gallery application.</p>
<h3>How it works: configuration</h3>
<p>Right after a Gallery Provider has been initialized, the Gallery application checks if configuration for that provider is available. A configuration in this case is a text file which must match the name of the Gallery Provider assembly plus <em>.config</em> for example: given we had a Gallery Provider assembly <em>Mavention.SharePoint.EnterpriseSolutionStore.dll</em> then a valid configuration file would have to be called <em>Mavention.SharePoint.EnterpriseSolutionStore.dll.config</em> in order to be loaded by the Gallery engine.</p>
<p>You are free in how you define the configuration file. Its contents, if available, are streamed together with the assembly and are made available in your Gallery Provider via the <em>ClientFilteredProvider&lt;T&gt;.Configuration</em> property. It’s worth noting that the configuration is available <strong>after</strong> the Gallery Provider has been registered with the Gallery application UI so you cannot for example configure its Title that is displayed in the Gallery application.</p>
<h3>How it works: providing Gallery Items</h3>
<p>The last thing that a Gallery Provider is responsible for is providing the Gallery application with the list of available Gallery Items (solutions). When building a Gallery Provider you have to provide the name of the class that will be used for defining Gallery Items for your Gallery Provider. When implementing a Gallery Item class you have to at minimum inherit from the <em>Microsoft.SharePoint.Solutions.AddGallery.Provider.GalleryItem</em> abstract class which you can then optionally enrich with your own properties.</p>
<h2>Building a minimal Enterprise Solution Catalog</h2>
<p>To get better understanding of how everything works, let’s take a look at building a minimal Gallery Provider.</p>
<h3>Preparing the solution</h3>
<blockquote><p><strong>Important:</strong> As you might have noticed, the Gallery is a Silverlight application so in order to ensure that your Gallery Provider will be able to run in context of a Silverlight application you should choose the Silverlight Class Library Project Template as a starting point to ensure that your assembly will have valid assemblies references.</p>
</blockquote>
<p>To build a Gallery Provider we will need two projects: one – a Silverlight Class Library project, to implement the Gallery Provider and one – a SharePoint Project, to deploy the Gallery Provider to SharePoint. Optionally, if you would like to use configuration with you Gallery Provider, you should add another SharePoint Project that would deploy the .config file to the <em>14\TEMPLATE\LAYOUTS\AddGalleryProviders </em>folder. Keeping the configuration separate from the Gallery Provider allows you to have different configuration files for different environments such as development, UAT and production.</p>
<p>The following screenshot presents the project structure used for building a minimal Gallery Provider that uses configuration:</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/03.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Project structure of a minimal Gallery Provider displayed in Solution Explorer" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/03_thumb.jpg" width="398" height="416" /></a></p>
<blockquote><p><strong>Tip: </strong>Because neither the Installer nor the Configuration projects contain any code you can set their <strong>Include Assembly In Package</strong> properties to <strong>False</strong> not to include unnecessary assemblies in the WSP.</p>
</blockquote>
<h3></h3>
<h3>Configuring Gallery Provider deployment</h3>
<p>Before we start building the Gallery Provider, let’s configure the deployment options so that both the Gallery Provider and its configuration will get deployed to the right location in the SharePoint Root Folder.</p>
<p>To the Installer project add an Empty Element called <strong>GalleryProvider</strong>. Remove the <em>Elements.xml</em> file and in the SPI’s Properties click the ellipsis next to the <em>Project Output References</em> property. Add a new Project Output Reference. Set <em>Project Name</em> to the <strong>Mavention.SharePoint.MinimalGalleryProvider</strong> project (Silverlight Class Library project), <em>Deployment Type</em> to <strong>TemplateFile</strong> and finally <em>Deployment Path</em> to <strong>LAYOUTS\AddGalleryProviders</strong>. The following screenshot shows the complete configuration.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/04.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Project Output Reference configured for the Silverlight Project" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/04_thumb.jpg" width="480" height="245" /></a></p>
<p>After configuring the Project Output References add the <em>GalleryProvider</em> SPI to the Package. To verify that everything has been configured correctly Package the Installer project. By browsing through the contents of the hidden <em>pkg</em> folder you can verify that the Gallery Provider assembly will end up in the right location.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/05.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Red arrow pointing to the Gallery Provider assembly in the pkg folder" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/05_thumb.jpg" width="409" height="427" /></a></p>
<h3>Configuring Gallery Provider Configuration deployment</h3>
<p>The next step is to ensure that the configuration file for our Gallery Provider will be deployed to the right location. For that add a new <em>SharePoint Mapped Folder</em> to the Configuration project and in the tree view select the <strong>TEMPLATE\LAYOUTS\AddGalleryProviders</strong> folder.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/06.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="The AddGalleryProviders folder selected in the ‘Add SharePoint Mapped Folder’ dialog" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/06_thumb.jpg" width="373" height="427" /></a></p>
<p>Next add to it the configuration file which should be called <strong>Mavention.      <br />SharePoint.MinimalGalleryProvider.dll.config</strong>.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/07.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="The configuration file highlighted in the Solution Explorer" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/07_thumb.jpg" width="422" height="298" /></a></p>
<h3>Getting prerequisites for building a Gallery Provider</h3>
<p>The last thing that we need to configure before we can start building our minimal Gallery Provider is to get a reference to the <em>AddGallery.Provider</em> base assembly. For that go the <em>14\TEMPLATE\LAYOUTS</em> folder and copy the <em>AddGallery.xap</em> file. Change the extension to <strong>.zip</strong> and extract the contents. From there copy the <em>AddGallery.Provider.dll</em> file and paste is somewhere in your solution structure. Next, in the Gallery Provider project (Silverlight Class Library project) add a new Assembly Reference and lookup the AddGallery.Provider assembly. After it has been added as a reference set the <em>Copy Local</em> property to <strong>False</strong>.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/08.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Reference to the AddGallery.Provider assembly configured on the Gallery Provider project" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/08_thumb.jpg" width="371" height="427" /></a></p>
<blockquote><p><strong>Tip: </strong>To simplify deploying the Gallery Provider you can set the Post-Build event of the Silverlight Class Library project to       <br /><strong>copy &quot;$(TargetPath)&quot; &quot;C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\AddGalleryProviders&quot; /Y</strong></p>
</blockquote>
<blockquote><p><strong>Tip:</strong> The Gallery Provider is Silverlight code so if you want to debug it you have to attach the debugger to the <strong>iexplore.exe</strong> process rather than the <strong>w3wp.exe</strong> process that runs SharePoint code.</p>
</blockquote>
<p>This concludes the preparations and allows us to start building the minimal Gallery Provider.</p>
<h2>Building the minimal Gallery Provider</h2>
<p>At minimal a Gallery Provider consists of two classes: a Gallery Item that inherits from the <em>Microsoft.SharePoint.Solutions.AddGallery.Provider.GalleryItem</em> class and the Gallery Provider itself which inherits from the <em>Microsoft.SharePoint.Solutions.AddGallery.Provider.ClientFilteredProvider&lt;T&gt; </em>class.</p>
<p>Whenever you define the Gallery Item class you can simply inherit from the base class. No extra properties have to be defined and no methods have to be defined. The following code snippet presents the minimal code for a Gallery Item.</p>
<pre class="brush: csharp;" title="MinimalGalleryProviderGalleryItem.cs">using Microsoft.SharePoint.Solutions.AddGallery.Provider;

namespace Mavention.SharePoint.MinimalGalleryProvider {
    public class MinimalGalleryProviderGalleryItem : GalleryItem {
    }
}</pre>
<p>Next we can continue with building the minimal Gallery Provider. Whenever you inherit from the <em>ClientFilteredProvider&lt;T&gt;</em> generic class you have to pass the type of the Gallery Item class that the Gallery Provider will use. In our case this is the <em>MinimalGalleryProviderGalleryItem</em> class. Additionally you have to define two methods: <em>BeginGetDistinctFilterValues</em> and <em>BeginGetItems</em>. The <em>BeginGetDistinctFilterValues</em> method can be used if you want to define additional filters for your provider. We will skip it for now and will use the default implementation. The <em>BeginGetItems</em> method is the core of every Gallery Provider and contains the logic responsible for retrieving Gallery Items (solutions).</p>
<p>The following code snippet presents the base code for our minimal Gallery Provider.</p>
<pre class="brush: csharp;" title="MinimalGalleryProvider.cs">using System.Collections.Generic;
using System.Globalization;
using Microsoft.SharePoint.Solutions.AddGallery.Provider;

namespace Mavention.SharePoint.MinimalGalleryProvider {
    public class MinimalGalleryProvider : ClientFilteredProvider&lt;MinimalGalleryProviderGalleryItem&gt; {
        IList&lt;MinimalGalleryProviderGalleryItem&gt; items;

        public MinimalGalleryProvider() {
            Title = &quot;Mavention Solution Store&quot;;
        }

        public override void BeginGetDistinctFilterValues(CultureInfo language, ItemAttribute itemAttribute, object asyncState) {
            IList&lt;FilterValue&gt; filterValues = ProcessFilterValues(items, itemAttribute);
            OnGetDistinctFilterValuesCompleted(new GetDistinctFilterValuesCompletedEventArgs {
                AsyncState = null,
                Error = null,
                ItemAttribute = itemAttribute,
                DistinctFilterValues = filterValues
            });
        }

        public override void BeginGetItems(CultureInfo language, string searchText, FilterCollection filters, SortOrderCollection sortOrders, int firstItemIndex, int lastItemIndex, object asyncState) {
        }
    }
}</pre>
<p>Next to defining the required methods in the constructor of the Gallery Provider on line 10 we have defined the title of our Gallery Provider. As discussed previously the title is being used immediately after instantiating the Gallery Provider so it’s important to define it in the Gallery Provider constructor.</p>
<p>If we deployed the Installer solution now this is what you should see after opening the Create dialog window:</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/09.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Mavention Solution Store selected in the Create dialog window" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/09_thumb.jpg" width="480" height="288" /></a></p>
<p>Although our Gallery Provider doesn’t display any items at this moment, it proves that so far we have done everything correctly.</p>
<h2>Loading Gallery Items</h2>
<p>From the Gallery perspective there is no restrictions with regard to what you want to use as the store for your solutions. You could for example use something as simple as a SharePoint List but you could as well use a cloud-based solution that is running on Azure. This is why the exact implementation logic for the <em>BeginGetItems</em> method will differ based on where you store the solutions. So instead of getting a complete backend implementation, let’s focus on what the capabilities of the Gallery are and how you can present your solutions.</p>
<p>Let’s start with defining a few items in our Gallery Provider by changing the code of the <em>BeginGetItems</em> method as shown in the following snippet:</p>
<pre class="brush: csharp;">public override void BeginGetItems(CultureInfo language, string searchText, FilterCollection filters, SortOrderCollection sortOrders, int firstItemIndex, int lastItemIndex, object asyncState) {
    items = new List&lt;MinimalGalleryProviderGalleryItem&gt; {
        new MinimalGalleryProviderGalleryItem {
            DisplayName = &quot;Mavention Solution 1&quot;,
            Description = &quot;This is Mavention Solution #1&quot;,
            ImageUrl = &quot;/_layouts/images/ltpp.png&quot;,
            Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 2&quot; }
        },
        new MinimalGalleryProviderGalleryItem {
            DisplayName = &quot;Mavention Solution 2&quot;,
            Description = &quot;This is Mavention Solution #2&quot;,
            ImageUrl = &quot;http://mavention/_layouts/images/ltworksp.png&quot;,
            Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 3&quot; }
        }
    };

    GalleryItemCollection galleryItems = ProcessItems(items, searchText, filters, sortOrders, firstItemIndex, lastItemIndex);

    OnGetItemsCompleted(new GetItemsCompletedEventArgs {
        AsyncState = asyncState,
        Error = null,
        Items = galleryItems
    });
}</pre>
<p>If you reload the Gallery you will see our two items displayed on the screen:</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/10.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Two Gallery Items displayed in the Gallery" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/10_thumb.jpg" width="480" height="190" /></a></p>
<p>For every item the display name (1), a description (2), an image (3) and the categories (4) will be displayed. All properties except the display name are optional. Additionally, based on all unique categories the categories refiner will be filled (5).</p>
<p>Although our Gallery Items are now displayed there is no link to the underlying solutions yet and if you click the <em>Create</em> button you will simply get redirected to the welcome page of your site.</p>
<h2>Linking Gallery Items to solutions</h2>
<p>The underlying <em>GalleryItem</em> class, that is the base for every Gallery Item, contains a number of properties that allow you to define what the particular Gallery Item exactly is and how it should be used. You can define the type of the Gallery Item by using the <em>GalleryItem.Type</em> property. In this scenario we will focus on using the <em>Solution</em> type only but you should definitely explore other item types.</p>
<pre class="brush: csharp; highlight: [7, 14]">items = new List&lt;MinimalGalleryProviderGalleryItem&gt; {
    new MinimalGalleryProviderGalleryItem {
        DisplayName = &quot;Mavention Solution 1&quot;,
        Description = &quot;This is Mavention Solution #1&quot;,
        ImageUrl = &quot;/_layouts/images/ltpp.png&quot;,
        Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 2&quot; },
        Type = ItemType.Solution
    },
    new MinimalGalleryProviderGalleryItem {
        DisplayName = &quot;Mavention Solution 2&quot;,
        Description = &quot;This is Mavention Solution #2&quot;,
        ImageUrl = &quot;http://mavention/_layouts/images/ltworksp.png&quot;,
        Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 3&quot; },
        Type = ItemType.Solution
    }
};</pre>
<p>When working with solutions one of the most important properties that you should define for every Gallery Item is the <em>GalleryItem.CodeType</em> property which defines what type of solution the particular Gallery Item is. Depending on the value of this property different requirements have to be fulfilled by the user for him to be able to install the solution. The <em>CodeType</em> property has three values: <strong>NoCode</strong>, <strong>PTC</strong> and <strong>FT</strong>. Although there is no documentation on the exact meaning of those values you can think of them in the following terms:</p>
<ul>
<li><strong>NoCode</strong>: the solution package contains no code and in order to see the solution the user has to have the following SharePoint permissions: <strong>ManageSubWebs</strong>, <strong>ManageWeb</strong> and <strong>AddAndCustomizePages</strong> </li>
<li><strong>PTC </strong>(Partially Trusted Code): in order to see the solution in the gallery the user must be a Site Admin (SPUser.IsSiteAdmin equals true) </li>
<li><strong>FT</strong> (Full Trust Solutions): not supported at this moment and never displayed in the Gallery </li>
</ul>
<pre class="brush: csharp; highlight: [8, 16]">items = new List&lt;MinimalGalleryProviderGalleryItem&gt; {
    new MinimalGalleryProviderGalleryItem {
        DisplayName = &quot;Mavention Solution 1&quot;,
        Description = &quot;This is Mavention Solution #1&quot;,
        ImageUrl = &quot;/_layouts/images/ltpp.png&quot;,
        Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 2&quot; },
        Type = ItemType.Solution,
        CodeType = SolutionCodeType.NoCode
    },
    new MinimalGalleryProviderGalleryItem {
        DisplayName = &quot;Mavention Solution 2&quot;,
        Description = &quot;This is Mavention Solution #2&quot;,
        ImageUrl = &quot;http://mavention/_layouts/images/ltworksp.png&quot;,
        Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 3&quot; },
        Type = ItemType.Solution,
        CodeType = SolutionCodeType.PTC
    }
};</pre>
<p>The <em>CodeType</em> property works in combination with the <em>GalleryItem.ShowOnlyIfUserHasPermissions</em> property which is set to <strong>true</strong> by default. If you would like a particular Gallery Item to be always visible you could set its <em>ShowOnlyIfUserHasPermissions</em> property to <strong>false</strong>.</p>
<p>After setting the type of solution the next step is to make the Gallery Item point to the physical WSP file. By default the Action for each Gallery Item is set to <em>ActionType.Link</em> which means that after clicking the <em>Create</em> button the Gallery will navigate to the URL specified using the <em>GalleryItem.Link</em> property. If you want your solutions to be downloaded and installed instead you have to set the <em>GalleryItem.Action</em> property to <strong>ActionType.ForDownload</strong> and provide the URL of the WSP using the <em>GalleryItem.URL</em> property. There is no restriction as to where this file is located as long as it can be accessed by the specified URL.</p>
<pre class="brush: csharp; highlight: [9, 10, 19, 20]">items = new List&lt;MinimalGalleryProviderGalleryItem&gt; {
    new MinimalGalleryProviderGalleryItem {
        DisplayName = &quot;Mavention Solution 1&quot;,
        Description = &quot;This is Mavention Solution #1&quot;,
        ImageUrl = &quot;/_layouts/images/ltpp.png&quot;,
        Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 2&quot; },
        Type = ItemType.Solution,
        CodeType = SolutionCodeType.NoCode,
        Action = ActionType.ForDownload,
        Url = &quot;/SolutionCatalog/MaventionSolution1.wsp&quot;
    },
    new MinimalGalleryProviderGalleryItem {
        DisplayName = &quot;Mavention Solution 2&quot;,
        Description = &quot;This is Mavention Solution #2&quot;,
        ImageUrl = &quot;http://mavention/_layouts/images/ltworksp.png&quot;,
        Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 3&quot; },
        Type = ItemType.Solution,
        CodeType = SolutionCodeType.PTC,
        Action = ActionType.ForDownload,
        Url = &quot;http://mavention/SolutionCatalog/MaventionSolution2.wsp&quot;
    }
};</pre>
<p>Notice that the <em>Create</em> button automatically changed to <em>Download</em> and if you click it the solution should be automatically downloaded and installed, given you have sufficient permissions on the current site.</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/11.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Status message after successfully downloading and installing the solution" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/11_thumb.jpg" width="480" height="325" /></a></p>
<h2>Configuring additional settings</h2>
<p>The Gallery has a few more options that can be configured that allow you to control how you Gallery Items are displayed.</p>
<h3>Dealing with solution requirements</h3>
<p>Often when building solutions we depend on some other resources: this can be either a specific SharePoint version, license, patch level, but it can also be a specific Feature that must be installed activated. For every Gallery Item we can define which dependencies it has on other resources.</p>
<p>You can define requirements for a Gallery Item using the <em>GalleryItem.RequiredResources</em> property. Defining requirements is quite complex. First you have to create an instance of the <em>SharePointRequirementCollection</em> class. Using its <em>Requirements</em> property you have to then define an array of <em>SharePointRequirement</em> objects – one for every dependency of your solution. When defining a requirement you can choose its type (which is an enumeration of fixed values) but it’s the <em>CompatibleResources</em> property that it’s challenging to define. For every requirement there is at least one compatible resource which fulfills that requirement. Requirements are compared using their names (the <em>SharePointRequirement.Name</em> property) and for requirements of type <em>Feature</em> and <em>ProductPatch</em> also the version number (the <em>SharePointRequirement.ResourceVersion</em> property) is taken into account.</p>
<p>Probably the easiest way of configuring required resources for your solution and ensuring that you have the right values is to get the current configuration that the Gallery uses for comparisons. The best way to do this is to use Fiddler to explore requests that are being executed after opening the Gallery. One of those requests (1) will have the request body set to <strong>Task=GetAdditionalConfig&amp;CurrentWeb=%2F</strong> (2). If you zoom in on the response HTML and look for the <strong>&lt;AddGalleryResponse&gt;</strong> string you will find the XML containing all of the configuration for the current site (3).</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/12.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Using Fiddler to retrieve Gallery configuration information" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/12_thumb.jpg" width="480" height="333" /></a></p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/13.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Piece of the configuration information used by the Gallery" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/13_thumb.jpg" width="480" height="427" /></a></p>
<h4>Configuring requirements</h4>
<p>With that information you could for example define that your solution can be installed only when the Publishing Feature is activated on the current Web:</p>
<pre class="brush: csharp;">new MinimalGalleryProviderGalleryItem {
    DisplayName = &quot;Mavention Solution 1&quot;,
    Description = &quot;This is Mavention Solution #1&quot;,
    ImageUrl = &quot;/_layouts/images/ltpp.png&quot;,
    Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 2&quot; },
    Type = ItemType.Solution,
    CodeType = SolutionCodeType.NoCode,
    Action = ActionType.ForDownload,
    Url = &quot;/SolutionCatalog/MaventionSolution1.wsp&quot;,
    RequiredResources = new SharePointRequirementCollection {
        Requirements = new SharePointRequirement[] {
            new SharePointRequirement {
                CompatibleResources = new SharePointResource[] {
                    new SharePointResource {
                        ResourceType = SharePointResourceType.Feature,
                        Name = &quot;94C94CA6-B32F-4DA9-A9E3-1F3D343D7ECB&quot;,
                        DisplayName = &quot;SharePoint Server Publishing&quot;,
                        MissingMessage = &quot;SharePoint Server Publishing Site Feature&quot;,
                        ResourceVersion = new System.Version(&quot;14.0.0.0&quot;)
                    }
                }
            }
        }
    }
}</pre>
<p>If you would then browse to the Gallery on a Web that doesn’t have the Publishing Feature activated you would see an error message:</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/14.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Error message displayed in the Gallery" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/14_thumb.jpg" width="480" height="174" /></a></p>
<p>and after clicking on that error message you would get an overview of all missing requirements:</p>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/15.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Overview of all missing requirements for the current Gallery Item" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/15_thumb.jpg" width="480" height="180" /></a></p>
<h4>Requesting a requirements check</h4>
<p>When working with requirements there is one thing you should take into account. By default the Gallery doesn’t run the requirements check and you have to do it yourself. The good news is that the Gallery provides you with a method to run the check which is stored in the <em>CheckItemRequirementsMethod</em> property of your Gallery Provider. The downside is that it accepts the collection of Gallery Items as a parameter of <em>IList&lt;GalleryItem&gt;</em> type. Because you cannot directly cast <em>IList&lt;YourGalleryItem&gt;</em> to the type required by the check method you have two options. You can either create another variable, copy all items there, run the check and then add all Missing Requirements to the <em>GalleryItem.RequiredResources.MissingRequirements</em> property or when implementing the Gallery Provider you could inherit from the <em>ClientFilteredProvider&lt;GalleryItem&gt;</em> class and specify the <em>GalleryItem</em> class as the class for Gallery Item. With that you can still use your own Gallery Item class to define your items but this allows you to make use of the standard check method. Here is the sample code that shows this scenario:</p>
<pre class="brush: csharp; highlight: 62">using System.Collections.Generic;
using System.Globalization;
using Microsoft.SharePoint.Solutions.AddGallery.Provider;

namespace Mavention.SharePoint.MinimalGalleryProvider {
    public class MinimalGalleryProvider : ClientFilteredProvider&lt;GalleryItem&gt; {
        IList&lt;GalleryItem&gt; items;

        public MinimalGalleryProvider() {
            Title = &quot;Mavention Solution Store&quot;;
        }

        public override void BeginGetDistinctFilterValues(CultureInfo language, ItemAttribute itemAttribute, object asyncState) {
            IList&lt;FilterValue&gt; filterValues = ProcessFilterValues(items, itemAttribute);
            OnGetDistinctFilterValuesCompleted(new GetDistinctFilterValuesCompletedEventArgs {
                AsyncState = null,
                Error = null,
                ItemAttribute = itemAttribute,
                DistinctFilterValues = filterValues
            });
        }

        public override void BeginGetItems(CultureInfo language, string searchText, FilterCollection filters, SortOrderCollection sortOrders, int firstItemIndex, int lastItemIndex, object asyncState) {
            items = new List&lt;GalleryItem&gt; {
                new MinimalGalleryProviderGalleryItem {
                    DisplayName = &quot;Mavention Solution 1&quot;,
                    Description = &quot;This is Mavention Solution #1&quot;,
                    ImageUrl = &quot;/_layouts/images/ltpp.png&quot;,
                    Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 2&quot; },
                    Type = ItemType.Solution,
                    CodeType = SolutionCodeType.NoCode,
                    Action = ActionType.ForDownload,
                    Url = &quot;/SolutionCatalog/MaventionSolution1.wsp&quot;,
                    RequiredResources = new SharePointRequirementCollection {
                        Requirements = new SharePointRequirement[] {
                            new SharePointRequirement {
                                CompatibleResources = new SharePointResource[] {
                                    new SharePointResource {
                                        ResourceType = SharePointResourceType.Feature,
                                        Name = &quot;94C94CA6-B32F-4DA9-A9E3-1F3D343D7ECB&quot;,
                                        DisplayName = &quot;SharePoint Server Publishing&quot;,
                                        MissingMessage = &quot;SharePoint Server Publishing Site Feature&quot;,
                                        ResourceVersion = new System.Version(&quot;14.0.0.0&quot;)
                                    }
                                }
                            }
                        }
                    }
                },
                new MinimalGalleryProviderGalleryItem {
                    DisplayName = &quot;Mavention Solution 2&quot;,
                    Description = &quot;This is Mavention Solution #2&quot;,
                    ImageUrl = &quot;http://mavention/_layouts/images/ltworksp.png&quot;,
                    Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 3&quot; },
                    Type = ItemType.Solution,
                    CodeType = SolutionCodeType.PTC,
                    Action = ActionType.ForDownload,
                    Url = &quot;http://mavention/SolutionCatalog/MaventionSolution2.wsp&quot;,
                }
            };

            CheckItemRequirementsMethod(items);
            GalleryItemCollection galleryItems = ProcessItems(items, searchText, filters, sortOrders, firstItemIndex, lastItemIndex);

            OnGetItemsCompleted(new GetItemsCompletedEventArgs {
                AsyncState = asyncState,
                Error = null,
                Items = galleryItems
            });
        }
    }
}</pre>
<h4></h4>
<h3>Defining ratings</h3>
<p>One more thing that the Gallery allows you to do to improve the discovery of solutions is to specify star rating for every item. You can do this using the <em>GalleryItem.FiveStarRating</em> property. When setting it you also have to set the <em>GalleryItem.HasFiveStartRating</em> property to <strong>true</strong> and the <em>GalleryItem.TotalRatingVotes</em> property to the number of votes, eg.</p>
<pre class="brush: csharp; highlight: [10, 11, 12]">new MinimalGalleryProviderGalleryItem {
    DisplayName = &quot;Mavention Solution 2&quot;,
    Description = &quot;This is Mavention Solution #2&quot;,
    ImageUrl = &quot;http://mavention/_layouts/images/ltworksp.png&quot;,
    Categories = new List&lt;string&gt; { &quot;Category 1&quot;, &quot;Category 3&quot; },
    Type = ItemType.Solution,
    CodeType = SolutionCodeType.PTC,
    Action = ActionType.ForDownload,
    Url = &quot;http://mavention/SolutionCatalog/MaventionSolution2.wsp&quot;,
    FiveStarRating = 4.5,
    HasFiveStarRating = true,
    TotalRatingVotes = 1
}</pre>
<p><a href="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/16.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Star rating displayed for a Gallery Item" src="http://blog.mastykarz.nl/images/Building-Enterprise-Catalogs-in-SharePoi_10075/16_thumb.jpg" width="480" height="157" /></a></p>
<p>Providing your users with a rating mechanism allows you to engage them more, get feedback on the quality of the solutions and discover high value solutions.</p>
<blockquote>
<p><strong>Important:</strong> The Gallery only displays the rating provided by the Gallery Provider. It’s up to you to allow your users to rate Gallery Items.</p>
</blockquote>
<h2>Summary</h2>
<p>Creating an Enterprise Solution Store allows you to deliver your solutions to your end users in a user-friendly fashion. SharePoint 2010 has the Gallery component that allows you to build your own solution store for your organization. The Gallery capability is a powerful mechanism that allows you not only to present and deliver your solutions but also to manage dependencies on other resources that are required by your solutions.</p>
<p>In the next article I will share with you a simple solution that allows you to build your own Enterprise Solution Store based on a SharePoint List.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=-Pt9AVlx4KM:WAaIxtn1p3w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=-Pt9AVlx4KM:WAaIxtn1p3w:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=-Pt9AVlx4KM:WAaIxtn1p3w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=-Pt9AVlx4KM:WAaIxtn1p3w:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=-Pt9AVlx4KM:WAaIxtn1p3w:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=-Pt9AVlx4KM:WAaIxtn1p3w:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=-Pt9AVlx4KM:WAaIxtn1p3w:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/-Pt9AVlx4KM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/building-enterprise-solution-catalogs-sharepoint-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/building-enterprise-solution-catalogs-sharepoint-2010/</feedburner:origLink></item>
		<item>
		<title>The International SharePoint Conference London 2012 recap</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/zX7X9zGzkHk/</link>
		<comments>http://blog.mastykarz.nl/international-sharepoint-conference-london-2012-recap/#comments</comments>
		<pubDate>Sat, 28 Apr 2012 11:21:59 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Speaking]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[Structured and repeatable deployment]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/international-sharepoint-conference-london-2012-recap/</guid>
		<description><![CDATA[Last week was the International SharePoint Conference London 2012 where I presented three sessions in the developer track. The Conference Last year I’ve attended the European SharePoint Best Practice Conference 2011. Although in a way I knew that the International SharePoint Conference London 2012 (ISC) would be at least as good, being a speaker in [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" title="" alt="The International SharePoint Conference London 2012 logo" src="http://blog.mastykarz.nl/images/d00694e7376d_F93B/banner.jpg" /> Last week was the International SharePoint Conference London 2012 where I presented three sessions in the developer track.</p>
<h2>The Conference</h2>
<p>Last year I’ve attended the European SharePoint Best Practice Conference 2011. Although in a way I knew that the International SharePoint Conference London 2012 (ISC) would be at least as good, being a speaker in the developer track exceeded all of my expectations.</p>
<p>Throughout the whole conference Steve and his team took care for everything and ensured that we – the speakers, could focus on the content and deliver the best we could to the attendees. I feel like we cannot thank Steve and his team enough for how they have organized everything and how they succeeded in making the ISC the great experience that it was for both speakers and attendees.</p>
<p>Preparing for the conference with the dev team was a unique experience by itself. Never before I had a chance to work on a project with some of the greatest people in the SharePoint community worldwide. Being a part of the discussions that we had about designing the solution and building all the different pieces of it I learned a lot: not only technically but also how different backgrounds and areas of expertise bring different reasoning to designing and building a SharePoint solution.</p>
<h2>The Content</h2>
<p>Never before the content of a SharePoint conference has been organized the way it has been presented on the ISC. During the three days we have taken you on a journey of building a fully functional SharePoint solution: starting with the requirements to end up in the cloud. Hopefully this unique way of presenting has given you a better understanding on how we – the speakers thought about certain challenges both with regard to designing and building the solution.</p>
<p>In about two months all attendees will receive the post-conference material. In the meanwhile all of our code presented in the developer track is available on CodePlex at <a title="http://spkbase.codeplex.com/" href="http://spkbase.codeplex.com/">http://spkbase.codeplex.com/</a>. The Visual Studio 2010 SharePoint Developer Tools extensions presented by <a href="http://www.wictorwilen.se/">Wictor</a> and I on the first day are available in the <a href="http://visualstudiogallery.msdn.microsoft.com/">Visual Studio Gallery</a> at <a title="http://visualstudiogallery.msdn.microsoft.com/site/search?query=ISC&amp;f%5B0%5D.Value=ISC%20&amp;f%5B0%5D.Type=SearchText&amp;ac=8" href="http://visualstudiogallery.msdn.microsoft.com/site/search?query=ISC&amp;f%5B0%5D.Value=ISC%20&amp;f%5B0%5D.Type=SearchText&amp;ac=8&amp;ocid=aff-n-we-loc--ITPRO40936&amp;WT.mc_id=aff-n-we-loc--ITPRO40936">http://visualstudiogallery.msdn.microsoft.com/site/search?query=ISC&amp;f%5B0%5D.Value=ISC%20&amp;f%5B0%5D.Type=SearchText&amp;ac=8</a> or you can search from the Visual Studio Extension Manager for ‘ISC ’ (the space at the end will narrow the search results). As we speak Wes Hackett of the <a href="http://cksdev.codeplex.com/">CKS:DEV</a> team is working on merging the new SPI Templates so that you will get them as a part of the CKS:DEV Toolkit. A new release of CKS:DEV should be available within days so stay tuned for updates.</p>
<h2>Recap</h2>
<p>The International SharePoint Conference London 2012 was a great experience and I’m humbled to have been a part of it. I’d like once again to thank all attendees and the organization: you rocked! I’m already looking forward to seeing you all back at the Evolutions conference that has been announced for April 15-17, 2013.</p>
<p><a href="http://blog.mastykarz.nl/images/The-International-SharePoint-Conference-_9738/476659_10150993164928438_705088437_13143053_1532153200_o.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="" border="0" alt="Group photo of the speakers of the International SharePoint Conference London 2012" src="http://blog.mastykarz.nl/images/The-International-SharePoint-Conference-_9738/476659_10150993164928438_705088437_13143053_1532153200_o_thumb.jpg" width="480" height="173" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=zX7X9zGzkHk:H-bkT0RKAmM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=zX7X9zGzkHk:H-bkT0RKAmM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=zX7X9zGzkHk:H-bkT0RKAmM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=zX7X9zGzkHk:H-bkT0RKAmM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=zX7X9zGzkHk:H-bkT0RKAmM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=zX7X9zGzkHk:H-bkT0RKAmM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=zX7X9zGzkHk:H-bkT0RKAmM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/zX7X9zGzkHk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/international-sharepoint-conference-london-2012-recap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/international-sharepoint-conference-london-2012-recap/</feedburner:origLink></item>
		<item>
		<title>SharePoint Saturday NL presentations available</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/vYK9OdoAK_k/</link>
		<comments>http://blog.mastykarz.nl/sharepoint-saturday-nl-presentations/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 16:55:18 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Speaking]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Web standards]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/sharepoint-saturday-nl-presentations/</guid>
		<description><![CDATA[Last Saturday I had the pleasure of presenting at the second SharePoint Saturday NL. Either if you couldn’t attend the event or would like to have the decks for future reference, here are the decks from both sessions that I presented. DIWUG.nl: How We Did it Did you know that the new DIWUG website has [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="SharePoint Saturday Holland logo" src="http://blog.mastykarz.nl/images/Speaking-at-the-SharePoint-Saturday-Holl_7DD3/banner.jpg" width="471" height="110"/><br />Last Saturday I had the pleasure of presenting at the second SharePoint Saturday NL. Either if you couldn’t attend the event or would like to have the decks for future reference, here are the decks from both sessions that I presented.</p>
<h2>DIWUG.nl: How We Did it</h2>
<p>Did you know that the new DIWUG website has been built on the Microsoft SharePoint 2010 platform, is accessible and uses HTML5? In this presentation my fellow-Maven <a href="http://blog.octavie.nl/">Octavie van Haaften</a> and I present how we built the new DIWUG website, what choices we made and why.</p>
<div style="width: 425px" id="__ss_12147384"><strong style="margin: 12px 0px 4px; display: block"><a title="DIWUG.nl: How We Did It" href="http://www.slideshare.net/mavention/diwugnl-how-we-did-it-12147384" target="_blank">DIWUG.nl: How We Did It</a></strong> <iframe height="355" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/12147384" frameborder="0" width="425" marginwidth="0" scrolling="no"></iframe>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank">PowerPoint</a> from <a href="http://www.slideshare.net/mavention" target="_blank">Mavention</a> </div>
</p></div>
<h2>Optimizing SharePoint 2010 websites for search engines</h2>
<p>When you build an Internet-facing website you want everyone to be able to find it. Unfortunately your website won’t become discoverable all by itself and you will have to do something to make it happen. In this presentation I show you how you can optimize public-facing websites built on the Microsoft SharePoint 2010 platform for search engines.</p>
<div style="width: 425px" id="__ss_12147376"><strong style="margin: 12px 0px 4px; display: block"><a title="Optimizing SharePoint 2010 websites for search engines" href="http://www.slideshare.net/mavention/optimizing-sharepoint-2010-websites-for-search-engines" target="_blank">Optimizing SharePoint 2010 websites for search engines</a></strong> <iframe height="355" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/12147376" frameborder="0" width="425" marginwidth="0" scrolling="no"></iframe>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank">PowerPoint</a> from <a href="http://www.slideshare.net/mavention" target="_blank">Mavention</a> </div>
</p></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=vYK9OdoAK_k:D-wrT4z2XL8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=vYK9OdoAK_k:D-wrT4z2XL8:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=vYK9OdoAK_k:D-wrT4z2XL8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=vYK9OdoAK_k:D-wrT4z2XL8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=vYK9OdoAK_k:D-wrT4z2XL8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=vYK9OdoAK_k:D-wrT4z2XL8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=vYK9OdoAK_k:D-wrT4z2XL8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/vYK9OdoAK_k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/sharepoint-saturday-nl-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/sharepoint-saturday-nl-presentations/</feedburner:origLink></item>
		<item>
		<title>Building breadcrumbs the way you want it in SharePoint 2010</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/1MVr5vT3JgA/</link>
		<comments>http://blog.mastykarz.nl/building-breadcrumbs-sharepoint-2010/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 20:56:42 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Web standards]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/building-breadcrumbs-sharepoint-2010/</guid>
		<description><![CDATA[A while ago I wrote an article about creating breadcrumbs using the Mavention Simple SiteMapPath control. And while I thought that the control would be sufficient to cover the most common scenarios just recently it turned out that the control has one major flaw. Find out how to build breadcrumbs in SharePoint really the way [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="Code of the Mavention Templated SiteMap Path" src="http://blog.mastykarz.nl/images/Templates-based-breadcrumbs-control-for-_68FE/banner.jpg" width="471" height="110" />     <br />A while ago I wrote <a href="/create-sharepoint-breadcrumbs-mavention-simple-sitemappath/">an article about creating breadcrumbs using the Mavention Simple SiteMapPath control</a>. And while I thought that the control would be sufficient to cover the most common scenarios just recently it turned out that the control has one major flaw. Find out how to build breadcrumbs in SharePoint really the way you want it.</p>
<h2>Create SharePoint breadcrumbs with Mavention Simple SiteMapPath</h2>
<p>One of the challenges while building Internet-facing websites is rendering breadcrumbs the way they are defined in the user experience. Out-of-the-box you can use either the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.listsitemappath_members.aspx?ocid=aff-n-we-loc--ITPRO40936&amp;WT.mc_id=aff-n-we-loc--ITPRO40936">ListSiteMapPath</a> control provided with SharePoint 2010 or the <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sitemappath_members(v=vs.80).aspx?ocid=aff-n-we-loc--ITPRO40936&amp;WT.mc_id=aff-n-we-loc--ITPRO40936">SiteMapPath</a> control which is a part of the .NET framework.</p>
<p>The ListSiteMapPath control uses nested unordered lists to describe the current position within the site. While it’s a good idea from the semantic point of view the rendered markup is far from ideal and unfortunately fixed, which makes using the control with custom user experiences challenging.</p>
<p>A good alternative to the SharePoint’s ListSiteMapPath control is the standard ASP.NET SiteMapPath control. Although standard Master Pages provided with SharePoint 2010 contain some examples of how you can use the SiteMapPath control to render breadcrumbs the real benefit can be achieved by using the templates to render breadcrumb nodes. And while, in terms of rendering, the SiteMapPath is more flexible than the ListSiteMapPath, if you take a closer look at its output, you will find some additional spans rendered which, depending on your HTML, might be problematic.</p>
<p>Given the limitations of the ListSiteMapPath and SiteMapPath controls a while ago I decided to create the Mavention Simple SiteMapPath control. The main idea behind the control was to have it render as clean as possible HTML – something you would expect from a webdesigner coding the user experience. Although Mavention Simple SiteMapPath didn’t offer as rich configuration capabilities as the SiteMapPath control, it did exactly what it was supposed to do and it did it good.</p>
<h2>The flaw of Mavention Simple SiteMapPath</h2>
<p>Taking the most common approach to rendering breadcrumbs on the web, the Mavention Simple SiteMapPath control used an unordered list as the markup base. And this is exactly why it’s flawed: although the control is simple, it does one and one thing only and it does it certain way which cannot be configured without rebuilding the code.</p>
<h2>Building breadcrumbs the way you want it</h2>
<p>To avoid the limitations of the Mavention Simple SiteMapPath control and to be able to support any kind of breadcrumbs possible, I have created the Mavention Templated SiteMapPath.</p>
<h3>Mavention Templated SiteMapPath</h3>
<p>The Mavention Templated SiteMapPath consists of the following three files:</p>
<pre class="brush: csharp;" title="TemplatedSiteMapPath.cs">using System;
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;

namespace Mavention.SharePoint.Controls {
    [ParseChildren(true), PersistChildren(false)]
    public class TemplatedSiteMapPath : Control  {
        public bool SkipRootNode { get; set; }
        public string SiteMapProvider { get; set; }

        public ITemplate HeaderTemplate { get; set; }
        public ITemplate FooterTemplate { get; set; }
        public ITemplate RootNodeTemplate { get; set; }
        public ITemplate NodeTemplate { get; set; }
        public ITemplate CurrentNodeTemplate { get; set; }
        public ITemplate SeparatorTemplate { get; set; }

        private SiteMapProvider provider;

        protected override void OnInit(EventArgs e) {
            SetSiteMapProvider();
        }

        private void SetSiteMapProvider() {
            if (String.IsNullOrEmpty(SiteMapProvider)) {
                provider = SiteMap.Provider;
            }
            else {
                provider = SiteMap.Providers[SiteMapProvider];
            }

            if (provider == null) {
                throw new ArgumentOutOfRangeException(String.Format(&quot;SiteMap Provider '{0}' not found&quot;, SiteMapProvider ?? &quot;default&quot;));
            }
        }

        protected override void CreateChildControls() {
            List&lt;SiteMapPathNodeItem&gt; breadcrumbs = new List&lt;SiteMapPathNodeItem&gt;();
            breadcrumbs.Add(new SiteMapPathNodeItem(Int32.MaxValue, SiteMapPathNodeItemType.Footer));

            SiteMapNode currentNode = provider.CurrentNode;
            SiteMapNode node = provider.CurrentNode;
            SiteMapNode rootNode = currentNode.RootNode;
            int i = 0;
            while (node != null) {
                if (node.Key != rootNode.Key) {
                    if (breadcrumbs.Count &gt; 1) {
                        breadcrumbs.Add(new SiteMapPathNodeItem(i--, SiteMapPathNodeItemType.Separator));
                    }

                    breadcrumbs.Add(new SiteMapPathNodeItem(i--, node.Key == currentNode.Key ? SiteMapPathNodeItemType.CurrentNode : SiteMapPathNodeItemType.Node) { SiteMapNode = node });
                }
                else {
                    if (!SkipRootNode) {
                        if (breadcrumbs.Count &gt; 1) {
                            breadcrumbs.Add(new SiteMapPathNodeItem(i--, SiteMapPathNodeItemType.Separator));
                        }

                        breadcrumbs.Add(new SiteMapPathNodeItem(i, SiteMapPathNodeItemType.RootNode) { SiteMapNode = node });
                    }
                }

                node = node.ParentNode;
            }

            breadcrumbs.Add(new SiteMapPathNodeItem(Int32.MinValue, SiteMapPathNodeItemType.Header));
            breadcrumbs.Reverse();

            if (breadcrumbs.Count &gt; 2) {
                breadcrumbs[1].ItemType = SiteMapPathNodeItemType.RootNode;
            }

            foreach (SiteMapPathNodeItem breadcrumb in breadcrumbs) {
                InitializeItem(breadcrumb);
            }
        }

        public virtual void InitializeItem(SiteMapPathNodeItem item) {
            ITemplate nodeTemplate = null;
            SiteMapPathNodeItemType itemType = item.ItemType;

            switch (itemType) {
                case SiteMapPathNodeItemType.Header:
                    nodeTemplate = HeaderTemplate;
                    break;
                case SiteMapPathNodeItemType.Footer:
                    nodeTemplate = FooterTemplate;
                    break;
                case SiteMapPathNodeItemType.RootNode:
                    nodeTemplate = RootNodeTemplate ?? NodeTemplate;
                    break;
                case SiteMapPathNodeItemType.Node:
                    nodeTemplate = NodeTemplate;
                    break;
                case SiteMapPathNodeItemType.CurrentNode:
                    nodeTemplate = CurrentNodeTemplate ?? NodeTemplate;
                    break;
                case SiteMapPathNodeItemType.Separator:
                    nodeTemplate = SeparatorTemplate;
                    break;
                default:
                    break;
            }

            if (nodeTemplate != null) {
                nodeTemplate.InstantiateIn(item);
                Controls.Add(item);
                item.DataBind();
            }
        }
    }
}</pre>
<pre class="brush: csharp;" title="SiteMapPathNodeItemType.cs">namespace Mavention.SharePoint.Controls {
    public enum SiteMapPathNodeItemType {
        Header,
        Footer,
        RootNode,
        Node,
        CurrentNode,
        Separator
    }
}</pre>
<pre class="brush: csharp;" title="SiteMapPathNodeItem.cs">using System.Web;
using System.Web.UI;

namespace Mavention.SharePoint.Controls {
    public class SiteMapPathNodeItem : Control, IDataItemContainer, INamingContainer {
        public SiteMapPathNodeItemType ItemType { get; set; }
        public SiteMapNode SiteMapNode { get; set; }
        public int ItemIndex { get; set; }

        public SiteMapPathNodeItem(int itemIndex, SiteMapPathNodeItemType itemType) {
            ItemIndex = itemIndex;
            ItemType = itemType;
        }

        public object DataItem {
            get { return SiteMapNode; }
        }

        public int DataItemIndex {
            get { return ItemIndex; }
        }

        public int DisplayIndex {
            get { return ItemIndex; }
        }
    }
}</pre>
<p>The first file – <em>TemplatedSiteMapPath.cs</em>, is the Mavention Templated SiteMapPath control itself. If you compare its code to the Mavention Simple SiteMapPath you can see that the code is much simpler and the biggest part of it supports rendering using Templates.</p>
<p>The second file – <em>SiteMapPathNodeItemType.cs</em> contains the definition of the enumeration that describes the type of the breadcrumb node. The node type is being used to apply the right rendering template while rendering breadcrumbs.</p>
<p>Finally there is the <em>SiteMapPathNodeItem.cs</em> file which contains the definition of a control in which a breadcrumb node is wrapped. The important part here is that this class inherits from the Control class, and not WebControl like the standard ASP.NET SiteMapNode class, so no additional spans or other markup for that matter is rendered.</p>
<h3>Using the Mavention Templated SiteMapPath</h3>
<p>The following code snippet illustrates how you can use the Mavention Templated SiteMapPath control:</p>
<pre class="brush: xml;">&lt;Mavention:TemplatedSiteMapPath runat=&quot;server&quot;&gt;
    &lt;HeaderTemplate&gt;&lt;div id=&quot;breadcrumbs&quot;&gt;&lt;/HeaderTemplate&gt;
    &lt;RootNodeTemplate&gt;&lt;asp:Hyperlink Text='home' NavigateUrl='&lt;%# Eval(&quot;Url&quot;) %&gt;' runat=&quot;server&quot;/&gt;&lt;/RootNodeTemplate&gt;
    &lt;NodeTemplate&gt;&lt;asp:Hyperlink Text='&lt;%# Eval(&quot;Title&quot;) %&gt;' NavigateUrl='&lt;%# Eval(&quot;Url&quot;) %&gt;' runat=&quot;server&quot;/&gt;&lt;/NodeTemplate&gt;
    &lt;CurrentNodeTemplate&gt;&lt;asp:Literal Text='&lt;%# Eval(&quot;Title&quot;) %&gt;' runat=&quot;server&quot;/&gt;&lt;/CurrentNodeTemplate&gt;
    &lt;SeparatorTemplate&gt; / &lt;/SeparatorTemplate&gt;
    &lt;FooterTemplate&gt;&lt;/div&gt;&lt;/FooterTemplate&gt;
&lt;/Mavention:TemplatedSiteMapPath&gt;</pre>
<p>Using this snippet will render breadcrumbs as hyperlinks, separated with a / (slash) where the current node is rendered as plain text. As you can imagine with some slight modifications you could change the breadcrumbs to be rendered as an unordered list should you need it, without touching the code!</p>
<h3>Dealing with Variations</h3>
<p>One of the common challenges when building breadcrumbs for a public-facing websites is dealing with Variations. Whenever a site is using the Variations capability to deliver multilingual content the desired way of rendering breadcrumbs is to have the first node point to the home page of the current Variation. Unfortunately the standard Navigation Providers available with SharePoint 2010 render the root site as the first node, so instead of:</p>
<pre class="brush: plain;">home &gt; subsite &gt; page</pre>
<p>you get:</p>
<pre class="brush: plain;">root &gt; home &gt; subsite &gt; page</pre>
<p>This happens no matter how your navigation settings are configured and even if you choose to break navigation inheritance for the Variation root sites.</p>
<p>The Mavention Templated SiteMapPath control allows you to easily work around this issue. By setting the <strong>SkipRootNode</strong> property to <strong>true</strong>, the root node is omitted and the second node in hierarchy is promoted as the root node so that it can be properly rendered as a root node (TemplatedSiteMapPath.cs lines 55-61 and 70-72). As a result breadcrumbs will be rendered as you would expect them to.</p>
<h3>It’s all about permissions</h3>
<p>Using the code samples above you can implement the Mavention Templated SiteMapPath in your solution. One important thing that you should keep in mind is, that the code should be included in an assembly deployed to GAC. Without it, in some scenarios depending on how your website is built, you might experience exceptions being thrown while instantiating the <em>ExtendedSearchXmlContentMapProvider</em> navigation provider which is one of the standard navigation providers delivered with SharePoint 2010.</p>
<h2>Summary</h2>
<p>Implementing custom user experiences in public-facing websites built on the SharePoint 2010 platform knows many challenges. One of those challenges is building breadcrumbs. Using the Mavention Templated SiteMapPath control you can build virtually any kind of breadcrumbs without the need to modify the control’s code.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1MVr5vT3JgA:3L7ii-4kfMM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1MVr5vT3JgA:3L7ii-4kfMM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1MVr5vT3JgA:3L7ii-4kfMM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=1MVr5vT3JgA:3L7ii-4kfMM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1MVr5vT3JgA:3L7ii-4kfMM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1MVr5vT3JgA:3L7ii-4kfMM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=1MVr5vT3JgA:3L7ii-4kfMM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/1MVr5vT3JgA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/building-breadcrumbs-sharepoint-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/building-breadcrumbs-sharepoint-2010/</feedburner:origLink></item>
		<item>
		<title>Speaking at the SharePoint Saturday Holland</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/uAAkjzm_Zgk/</link>
		<comments>http://blog.mastykarz.nl/speaking-sharepoint-saturday-holland/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 08:16:09 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[WCM]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/speaking-sharepoint-saturday-holland/</guid>
		<description><![CDATA[On March 24 there will be the next edition of SharePoint Saturday Holland. I have the honor of presenting two sessions for SharePoint developers. Diwug.nl v2 – How we did it Recently me and fellow Mavens built a new website for the Dutch Information Worker User Group. This website uses HTML5, is accessible and, what’s [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="SharePoint Saturday Holland logo" src="http://blog.mastykarz.nl/images/Speaking-at-the-SharePoint-Saturday-Holl_7DD3/banner.jpg" width="471" height="110" />     <br />On March 24 there will be <a href="http://sharepointsaturday.org/nl/default.aspx">the next edition of SharePoint Saturday Holland</a>. I have the honor of presenting two sessions for SharePoint developers.</p>
<h2>Diwug.nl v2 – How we did it</h2>
<p>Recently me and <a href="http://www.mavention.nl/over-ons/pages/default.aspx">fellow Mavens</a> built <a href="http://www.diwug.nl/Pages/default.aspx">a new website for the Dutch Information Worker User Group</a>. This website uses HTML5, is accessible and, what’s the most important, is built on the Microsoft SharePoint 2010 platform. In this session, that I will co-presenting with <a href="http://blog.octavie.nl/">Octavie van Haaften</a>, we are going to show you how we built the new website for DIWUG.</p>
<h2>Optimizing SharePoint 2010 websites for search engines</h2>
<p>Whenever you build a public-facing website you want people to find it. Although your website will eventually be indexed by search engines by itself, there are ways for you to help search engines discover the content on your website. In this session I will share with you some tips and tricks in how you can optimize your public-facing website built on the SharePoint 2010 platform for search engines.</p>
<h2>About SharePoint Saturday Holland</h2>
<p>Join SharePoint architects, developers, and other professionals that work with Microsoft SharePoint Server 2010 for ‘SharePoint Saturday’ event.&#160; SharePoint Saturday is an educational, informative &amp; lively day filled with sessions from respected SharePoint professionals &amp; MVPs, covering a wide variety of SharePoint-orientated topics.&#160; SharePoint Saturday is FREE, open to the public and is your local chance to immerse yourself in SharePoint!</p>
<p>See you on the <a href="http://sharepointsaturday.org/nl/default.aspx">SharePoint Saturday Holland</a>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uAAkjzm_Zgk:m2M7fSAb100:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uAAkjzm_Zgk:m2M7fSAb100:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uAAkjzm_Zgk:m2M7fSAb100:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=uAAkjzm_Zgk:m2M7fSAb100:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uAAkjzm_Zgk:m2M7fSAb100:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=uAAkjzm_Zgk:m2M7fSAb100:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=uAAkjzm_Zgk:m2M7fSAb100:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/uAAkjzm_Zgk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/speaking-sharepoint-saturday-holland/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/speaking-sharepoint-saturday-holland/</feedburner:origLink></item>
		<item>
		<title>Speaking at The International SharePoint Conference London 2012</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/iFCpfQNkP34/</link>
		<comments>http://blog.mastykarz.nl/speaking-international-sharepoint-conference-london-2012/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 07:23:24 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[Structured and repeatable deployment]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/speaking-international-sharepoint-conference-london-2012/</guid>
		<description><![CDATA[During the upcoming International SharePoint Conference London 2012 I will be co-presenting three sessions in the developer track. Project Startup DEV202 In the Project Startup DEV202 session, that I will be co-presenting with fellow SharePoint MVP and SharePoint MCM Wictor Wilén, Wictor and I will be discussing different approaches to structure your solution and make [...]]]></description>
			<content:encoded><![CDATA[<p><img class="intro-banner" alt="The International SharePoint Conference London 2012 logo" src="http://blog.mastykarz.nl/images/d00694e7376d_F93B/banner.jpg" width="471" height="110" />     <br />During the upcoming <a href="http://www.internationalsharepointconference.com/Pages/Default.aspx">International SharePoint Conference London 2012</a> I will be co-presenting three sessions in the developer track.</p>
<h2>Project Startup DEV202</h2>
<p>In <a href="http://www.internationalsharepointconference.com/Pages/Sessions.aspx#DEV202">the Project Startup DEV202 session</a>, that I will be co-presenting with <a href="http://www.wictorwilen.se/">fellow SharePoint MVP and SharePoint MCM Wictor Wilén</a>, Wictor and I will be discussing different approaches to structure your solution and make to help you get the most of the Visual Studio 2010 SharePoint Developer Tools .</p>
<h2>Deployment Process – Creating web templates, setup lifecycle management and deployment parts 1 (DEV206) and 2 (DEV207)</h2>
<p>Later in the developer track I will be co-presenting two sessions (<a href="http://www.internationalsharepointconference.com/Pages/Sessions.aspx#DEV206">DEV206</a> and <a href="http://www.internationalsharepointconference.com/Pages/Sessions.aspx#DEV207">DEV207</a>) with <a href="http://sharepointchick.com/">fellow SharePoint MVP and SharePoint MCM Mirjam van Olst</a>. In our sessions Mirjam and I will be discussing the process of packaging different pieces of the solution that we will be working with so that you can support all the different requirements during the whole lifecycle of the project.</p>
<h2>The Developer Track</h2>
<p>This year the developer track will be organized in a different way than previously (quoted from <a href="http://www.internationalsharepointconference.com/Pages/Track-Overviews.aspx">the ISC site</a>):</p>
<blockquote><p>This track is for all the Developers out there who are just starting a SharePoint journey of discovery and for those developers who have been developing for a while and now need to hone their skills to a more advanced level. There is so much that you can do with SharePoint where do you start, and what is the correct way to take a design all the way through to a finished solution deployed live in your production farm. The Developer track in 2012 will be a unique track with a complete 3 day focus on taking a concept all the way through its build, test and deployment process and showing how in the real world what situations a developer can come across and how those situations are troubleshot and resolved. Unlike normal session based conferences this year we plan on expanding on the basic knowledge and going as deep as is needed, so if a topic needs 2 sessions to cover it thoroughly then 2 sessions will be scheduled so you get all the information you need when you go back to the office. </p>
</blockquote>
<p>As you can see, instead of giving separate presentations we will be aiming at giving you a more complete insight into the process and hopefully share with you more knowledge that you can benefit of in your every day&#039;s work.</p>
<p>I’m looking forward to <a href="http://combined-knowledge.com/isc2012/Event_Registration.html">seeing you in London</a>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=iFCpfQNkP34:-B8sZhVWXRk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=iFCpfQNkP34:-B8sZhVWXRk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=iFCpfQNkP34:-B8sZhVWXRk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=iFCpfQNkP34:-B8sZhVWXRk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=iFCpfQNkP34:-B8sZhVWXRk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=iFCpfQNkP34:-B8sZhVWXRk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=iFCpfQNkP34:-B8sZhVWXRk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/iFCpfQNkP34" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/speaking-international-sharepoint-conference-london-2012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/speaking-international-sharepoint-conference-london-2012/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.048 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-05-14 13:31:50 -->

