<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6619606000431090378</id><updated>2022-07-18T14:08:21.818+02:00</updated><category term="episerver"/><category term="Nansen"/><category term="Web 2.0 expo"/><category term="microsoft"/><category term="Google"/><category term="web2expo"/><category term="#w2e"/><category term="Twitter"/><category term="Web"/><category term=".NET"/><category term="Certifiering"/><category term="Söderhavet"/><category term="ASP.NET"/><category term="Innebandy"/><category term="Team Burton"/><category term="C#"/><category term="konferens"/><category term="Idg"/><category term="Skeppsbron Mighty Penguins"/><category term="Webb09"/><category term="episerverdagen"/><category term="FOWA"/><category term="Internet"/><category term="Android"/><category term="frontend"/><category term="rekrytering"/><category term="#web2expo"/><category term="html5"/><category term="Chicago"/><category term="Episerver Community 3"/><category term="Geek Meet"/><category term="Google Analytics"/><category term="Sociala medier"/><category term="facebook"/><category term="mobilt"/><category term="EPiServer CMS 6"/><category term="Visual Studio"/><category term="addskills"/><category term="blog"/><category term="conference"/><category term="css"/><category term="iphone"/><category term="jQuery"/><category term="javascript"/><category term="EPiServer CMS 6 R2"/><category term="EPiServer Commerce"/><category term="Firefox"/><category term="Google Chrome"/><category term="N2"/><category term="Tips"/><category term="Visual Studio 2008"/><category term="episerverworld"/><category term="Chris Heilmann"/><category term="EPiServer Relate+"/><category term="Lansering"/><category term="Life at Nansen"/><category term="Social Media"/><category term="ASP.NET MVC"/><category term="Attollo"/><category term="EPiServer 7"/><category term="Erik Nilsson"/><category term="Flickr"/><category term="Instagram"/><category term="MCPD"/><category term="ThisIsNansen"/><category term="Web 2.0"/><category term="browsers"/><category term="development"/><category term="pagtypebuilder"/><category term="#TEE09"/><category term="API"/><category term="Berlin"/><category term="IIS"/><category term="IIS 7"/><category term="Nansen Chicago"/><category term="Nansen_En"/><category term="PageTypeBuilder"/><category term="SEO"/><category term="TechCrunch"/><category term="TechEd"/><category term="bug"/><category term="deloy"/><category term="windows mobile"/><category term="#epiday09"/><category term=".NET 4.0"/><category term=".NET 4.5"/><category term="AtMedia2009"/><category term="Composer"/><category term="Coop"/><category term="Designing and Developing ASP.NET Applications Using the Microsoft .NET Framework 3.5"/><category term="EPiServer 7.5"/><category term="EPiServer Mail"/><category term="Fridjtof Nansen"/><category term="Intranet"/><category term="Launch"/><category term="Länkar"/><category term="NDC 2009"/><category term="Nansen Stockholm"/><category term="Nya kunder"/><category term="Proact"/><category term="Relate+"/><category term="Resume"/><category term="Resumé"/><category term="SQL Server 2008"/><category term="San Francisco"/><category term="Spotify"/><category term="Svensk Handel"/><category term="USA"/><category term="Visual Studio 2010"/><category term="Windows 8"/><category term="Windows Azure"/><category term="Yahoo pipes"/><category term="build2014"/><category term="communities"/><category term="css3"/><category term="epimail"/><category term="fastighetsbyrån"/><category term="forrester"/><category term="foursquare"/><category term="release"/><category term="sIFR"/><category term="scrum"/><category term="spel"/><category term="systemutveckling"/><category term="sökmotorer"/><category term="uxlx"/><category term="#Build2016"/><category term="#NDC2009"/><category term="#devcon #devcon2012 #vegas"/><category term=".NET 3.5"/><category term="An event apart"/><category term="Apple"/><category term="AtMedia2008"/><category term="Bing"/><category term="Certification"/><category term="Channel9"/><category term="Chicago office space"/><category term="Commerce"/><category term="Create+"/><category term="DDB"/><category term="EPiServer CMS"/><category term="Episerver Partner Forum"/><category term="Episerverutvecklare"/><category term="FilippaK"/><category term="Företagsamheten"/><category term="Google Maps"/><category term="Grattis"/><category term="HTC Dream"/><category term="HTC Magic"/><category term="Hårdvara"/><category term="IE"/><category term="IE8"/><category term="Internetworld"/><category term="Knowledge"/><category term="Kompetensutveckling"/><category term="LeWeb"/><category term="Load Balancing"/><category term="Log4Net"/><category term="MVC"/><category term="Mark Wubben"/><category term="Marknadsföring"/><category term="Microformats"/><category term="Microsoft Search Server 2010 Express"/><category term="Obama"/><category term="Offf 2012"/><category term="Office"/><category term="PDC 2008"/><category term="Pointbreak"/><category term="Recruiting"/><category term="Robert Nyman"/><category term="SSL"/><category term="Safari4"/><category term="Security"/><category term="Silverlight 2"/><category term="SvD"/><category term="SvD lansering"/><category term="T-SQL"/><category term="Tim Walters"/><category term="W3Schools"/><category term="Web 2.0 expo 2009"/><category term="Webbutvecklare"/><category term="Yahoo"/><category term="agile development"/><category term="ajax"/><category term="awesome"/><category term="best practices"/><category term="canvas"/><category term="code quality"/><category term="configuration"/><category term="developing"/><category term="epiworldrobstr"/><category term="faster websites"/><category term="firebug"/><category term="fredag"/><category term="git"/><category term="html"/><category term="iOS"/><category term="interaktionsdesign"/><category term="krav"/><category term="mashup"/><category term="mjukvara"/><category term="mkse"/><category term="molnet"/><category term="mässa"/><category term="ny webb"/><category term="opera"/><category term="optimization"/><category term="pingis"/><category term="praktik"/><category term="responsive design"/><category term="rss"/><category term="siteseeker"/><category term="smushit"/><category term="tfs"/><category term="tävling"/><category term="#GeekMeetSthlm"/><category term="#OFFF2013 #Barcelona"/><category term="#UE"/><category term="#epips2010"/><category term="#fordw2e"/><category term="#iw100"/><category term="#napxc"/><category term="#programmerare som får skolios"/><category term="#thecopa"/><category term="#w20"/><category term=".NET Framework"/><category term="0770B0n1"/><category term="24hbc"/><category term="70-356"/><category term="70-480"/><category term="70-486"/><category term="70-564"/><category term="Absolut"/><category term="Advanced segmentation"/><category term="Affärsutveckling"/><category term="Alan Smith"/><category term="Amazon"/><category term="Angry Birds"/><category term="Arkitektur"/><category term="Arla"/><category term="Awesomeness"/><category term="BDD"/><category term="Batterier"/><category term="Björn Eriksen"/><category term="Blogger google"/><category term="Boston"/><category term="Business Intelligence"/><category term="Bästa webbyrå"/><category term="CI"/><category term="CMS"/><category term="Charts"/><category term="Cheat sheets"/><category term="China"/><category term="Chris Andersson"/><category term="Cision"/><category term="ClickHeat"/><category term="Context Menu"/><category term="Cooliris"/><category term="Cupcake"/><category term="Custom reports"/><category term="Cykling"/><category term="DN"/><category term="Dag König"/><category term="Dalarö"/><category term="Daytona"/><category term="Debugging"/><category term="Deploy"/><category term="Digg"/><category term="Diggnation"/><category term="Documentation"/><category term="DotNetRocks"/><category term="ECD"/><category term="EMVP"/><category term="EPIserver B2B Adapt"/><category term="EPiServer DXC"/><category term="EPiServer Digital Experience Cloud"/><category term="EPiServer Find"/><category term="EPiServer Labs"/><category term="EPiWorldC#"/><category term="EPidesk"/><category term="EPiserver B2B Prospect"/><category term="Eigenbrodt"/><category term="Episerver CMO"/><category term="Episerver Community"/><category term="Episerver SEO"/><category term="Eric Lawrence"/><category term="Event"/><category term="Evoko"/><category term="ExactTarget"/><category term="Expressen"/><category term="Extension X3"/><category term="FACADE"/><category term="FBI"/><category term="FSA"/><category term="Fagerdala EPS System"/><category term="Feedburner"/><category term="Fil Maj"/><category term="Fildelning"/><category term="Filhantering"/><category term="Flipboard"/><category term="Free"/><category term="G1"/><category term="Garret Rogers"/><category term="Geears"/><category term="Geolocation"/><category term="Getupdated"/><category term="Gmail"/><category term="Google Search Appliance"/><category term="Google SearchWiki"/><category term="Google Site Search"/><category term="Googleio Adobe"/><category term="Great Works"/><category term="HTC Hero"/><category term="Heatmaps"/><category term="Hitta"/><category term="Hockey"/><category term="Hosting"/><category term="Hubspot"/><category term="IBM"/><category term="IBS"/><category term="IDE"/><category term="IE11"/><category term="IE6 SvD"/><category term="IIS 7.5"/><category term="IIS 8"/><category term="IIS Module"/><category term="IIS7"/><category term="IPM"/><category term="IRL"/><category term="IRM"/><category term="ImageVault"/><category term="Indexing Service"/><category term="Initialization Module"/><category term="Interactive Scene"/><category term="Internet Explorer 6"/><category term="Internetnärvaro"/><category term="Intranet Edition"/><category term="Iphone Android mobilt"/><category term="Jaiku"/><category term="Jofa"/><category term="John Skeet"/><category term="Judit och Judith"/><category term="Julfest"/><category term="Kampanj"/><category term="Konica Minolta Bizhub C203"/><category term="Konvertering"/><category term="Kreab"/><category term="Long Tail"/><category term="MCITP"/><category term="MSB"/><category term="Management Studio"/><category term="Marginalen"/><category term="Marketo"/><category term="Mat"/><category term="McDondald&#39;s"/><category term="Microsoft Dynamics"/><category term="Microsoft Dynamics CRM"/><category term="Mikroblogg"/><category term="Mix 2011"/><category term="Motion charts"/><category term="Mtv"/><category term="NUnit"/><category term="NY Times"/><category term="Nansen Team C"/><category term="Nansen Team XC"/><category term="Nya medarbetare"/><category term="OneNote"/><category term="Oomph"/><category term="Open Handset Alliance"/><category term="Open Source"/><category term="Oxite"/><category term="Pardot"/><category term="Paris"/><category term="PirateBay"/><category term="Premium"/><category term="Process"/><category term="Progressive enhancement"/><category term="Public Edition"/><category term="Pulse"/><category term="Rangy"/><category term="Rapporthantering"/><category term="RequireJS"/><category term="Restaurang"/><category term="Rockstar"/><category term="Roslyn"/><category term="SBB"/><category term="SERP"/><category term="SOA"/><category term="SQL Server 2005"/><category term="SSMS"/><category term="Safari"/><category term="SalesForce"/><category term="Salesforce Marketing Cloud"/><category term="Salesforce Sales Cloud"/><category term="Samsung"/><category term="Scott Allen"/><category term="Seadragon"/><category term="Serialization"/><category term="Services Hosting"/><category term="ShareThis"/><category term="Sideflickr"/><category term="Silverlight"/><category term="Skatteverket"/><category term="Skeppsbron"/><category term="Skrivare"/><category term="Social Analytics"/><category term="Social Media Data Hub"/><category term="Sony"/><category term="SonyEricsson"/><category term="Sprint Retrospectives"/><category term="Stack Overflow"/><category term="Steve Sanderson"/><category term="Strategi"/><category term="Super Bowl"/><category term="Svenskt Näringsliv"/><category term="Sveriges Bästa Byrå"/><category term="Sveriges designer"/><category term="Switchar"/><category term="TV4"/><category term="Tasteline"/><category term="Tech-ed 2008"/><category term="Tess Ferrandez"/><category term="Testing"/><category term="The Copa"/><category term="Tim O&#39;Reilly"/><category term="Trams"/><category term="UI"/><category term="Umbraco"/><category term="Url"/><category term="User Experience"/><category term="VB.NET"/><category term="Visby"/><category term="Vista"/><category term="Visual Studio 2012"/><category term="Vivabit"/><category term="W3C"/><category term="Web fonts"/><category term="Webbsidor"/><category term="Widget"/><category term="Windows 7"/><category term="Windows Vista"/><category term="Windows XP"/><category term="Wired"/><category term="Word"/><category term="Wordpress"/><category term="XForm"/><category term="XNA"/><category term="Xbox"/><category term="Xbox 360"/><category term="YQL"/><category term="abf"/><category term="agile"/><category term="agile marketing"/><category term="ajax authentication c# security"/><category term="angular"/><category term="anonymous identification"/><category term="apps"/><category term="azure"/><category term="barn"/><category term="bash"/><category term="bellmanstafetten"/><category term="best practice"/><category term="black screen"/><category term="bldwin"/><category term="boulderdash"/><category term="bowling"/><category term="build"/><category term="byggserver"/><category term="c64"/><category term="cloud"/><category term="cnn"/><category term="coding"/><category term="coding standards"/><category term="continuous integration"/><category term="continuum"/><category term="cortana"/><category term="cxm"/><category term="dds"/><category term="design"/><category term="devcon devcon2012 vegas"/><category term="digital marketing"/><category term="displaytemplates"/><category term="dry"/><category term="e-commerce"/><category term="entreprenörsskap"/><category term="entrpreneur ships"/><category term="epicode"/><category term="epiday09"/><category term="episer"/><category term="episerver 7.1"/><category term="episerver awards"/><category term="episummit11"/><category term="fail"/><category term="film"/><category term="filmkväll"/><category term="fridtjof"/><category term="födelsedag"/><category term="förstudie"/><category term="globalization"/><category term="googleio"/><category term="green giant"/><category term="guldägg"/><category term="gzip"/><category term="hCalendar"/><category term="hCard"/><category term="head"/><category term="helium"/><category term="high performance"/><category term="host header"/><category term="https"/><category term="iTunes"/><category term="icon"/><category term="ie9"/><category term="infrastructure"/><category term="innovation"/><category term="installation"/><category term="intelisense"/><category term="internet explorer"/><category term="internet explorer 9"/><category term="its nordic"/><category term="jQuery 1.4"/><category term="jQuery 1.6"/><category term="jQuery 1.7"/><category term="jobb"/><category term="kommunistfika"/><category term="korpen"/><category term="kändisar"/><category term="köpenhamn"/><category term="less"/><category term="linq"/><category term="live tv"/><category term="lybeckeffekten"/><category term="löpning"/><category term="m-commerce"/><category term="marketing"/><category term="mashable"/><category term="media2009"/><category term="metod"/><category term="mobile"/><category term="modésiter"/><category term="mozilla"/><category term="musik"/><category term="nansenstyle"/><category term="naturvetarna"/><category term="net.tcp"/><category term="nostalgi"/><category term="nätverk"/><category term="omniture"/><category term="online intelligence"/><category term="oredev konferenser"/><category term="organisation"/><category term="ottoboni"/><category term="parallel downloads"/><category term="partner summit"/><category term="personalization"/><category term="pirates of nansen"/><category term="principles"/><category term="programming"/><category term="progress"/><category term="projektavslut"/><category term="publiceringsverktyg"/><category term="relate"/><category term="retina"/><category term="retrospektiv"/><category term="roadmap"/><category term="rött"/><category term="saco"/><category term="schack"/><category term="scripting"/><category term="search"/><category term="semester"/><category term="sitecatalyst"/><category term="skvaller"/><category term="social networks"/><category term="sociala intranät"/><category term="sol"/><category term="solr"/><category term="startup"/><category term="statistics"/><category term="t-commerce"/><category term="tag"/><category term="telefonförsäljare"/><category term="trygg hansa"/><category term="typescript"/><category term="upgrade"/><category term="utvärdering"/><category term="ux"/><category term="video"/><category term="webanalys"/><category term="webb-tv"/><category term="webbdagarna"/><category term="webfarm"/><category term="webkit"/><category term="website optimization"/><category term="wikipedia"/><category term="windows"/><category term="workshop"/><category term="xamarin"/><category term="xml"/><category term="Øredev"/><category term="årets byrå"/><title type='text'>The Making Waves blog</title><subtitle type='html'>I bloggen skriver vi som jobbar på Making Waves Sverige om teknik, trender, webbdesign och andra sköna grejor som berör webbutveckling och att jobba på en webbyrå.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.nansen.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default?alt=atom&amp;start-index=26&amp;max-results=25'/><author><name>Nansen</name><uri>http://www.blogger.com/profile/11097523520479257842</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>801</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-6592803563282198293</id><published>2016-04-01T08:11:00.000+02:00</published><updated>2016-04-01T08:13:04.355+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#Build2016"/><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="azure"/><category scheme="http://www.blogger.com/atom/ns#" term="continuum"/><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="typescript"/><category scheme="http://www.blogger.com/atom/ns#" term="xamarin"/><title type='text'>Build 2016, Day Two</title><content type='html'>&lt;p&gt;Back in the hotel after another eventful day. As tired as yesterday. I’m getting to old for this, I think.&lt;/p&gt; &lt;p&gt;Awesome news during the keynote today. As you’ve probably already have heard by now, Microsoft is going to be including Xamarin for free together with every version of Visual Studio. Yes, every version. That does include the Community Edition, which means that you will be able to develop iOS, Android and Windows Phone apps for free!&lt;/p&gt; &lt;p&gt;Well, you still have to have a mac with xcode installed for iOS. And you need to pay all three the developer fees. BUT! That you would’ve had to do either way.&lt;/p&gt; &lt;p&gt;And best of all - you will use C# for them all. Which is really nice. For obvious reasons.&lt;/p&gt; &lt;p&gt;You still won’t have free access to the Xamarin Test Cloud though. Which I can understand, there’s a lot of infrastructure behind that one! You will be able to buy it as a standalone service and it will be accessible through Visual Studio Teams Services. Nice having everything in the same place, and they showed some real impressive deploy and test functionality for it.&lt;/p&gt; &lt;p&gt;We actually tried out Xamarin for our last internal conference, NAPC15. Personally I really digged it. Awesome being able to share code in between different platforms, and using Xamarin Forms a lot of the UI could be shared as well, cutting down on development time for everyone. Really nice being able to preview the iOS from your windows machine as well with their remote viewer for the iOS simulator.&lt;/p&gt; &lt;p&gt;But, I digress. Back to Build!&lt;/p&gt; &lt;p&gt;Was a lot of talk about Azure today. And about how awesome it is. They now have 30 unique Azure regions and locations around the world, making sure everything is served as locally as possible. Quite impressive!&lt;/p&gt; &lt;p&gt;Another really impressive number is that over 85% of the Fortune 500 companies use Azure in some capacity!&lt;/p&gt; &lt;p&gt;Saw one really cool feature of Azure that I’ve totally missed until now… RemoteApp. You remotely connect straight to an app hosted in the cloud. This means you can access it from whatever device, pretty much. The example I saw was running Visual Studio on a Windows Lumia 950 phone, through Continuum. Super cool!&lt;/p&gt; &lt;p&gt;Angular have had quite a presence during this Build as well. With Angular 2 soon coming out, it’s been a lot of talk about it. Seems rather sweet, they have definitely gotten up the speed even more, and have nice solutions when it comes to precompiling templates on .Net, Java, Node.js and more. They wrote all of Angular 2 using Typescript, which definitely tells us how good Typescript is becoming as well.&lt;/p&gt; &lt;p&gt;I definitely look forward to my third and last day of Build 2016 tomorrow. I can’t wait to see what more goodies we will learn! Until then - &lt;em&gt;Good night America… wherever you are&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;…Oh yeah. Midnight Caller, 1988. Good times, good times.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/6592803563282198293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2016/04/build-2016-day-two.html#comment-form' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/6592803563282198293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/6592803563282198293'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2016/04/build-2016-day-two.html' title='Build 2016, Day Two'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total><georss:featurename>San Francisco, CA, USA</georss:featurename><georss:point>37.7749295 -122.41941550000001</georss:point><georss:box>37.373501499999996 -123.06486250000002 38.1763575 -121.77396850000001</georss:box></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-5646242189899428357</id><published>2016-03-31T06:47:00.001+02:00</published><updated>2016-03-31T06:49:43.926+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#Build2016"/><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="build"/><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="cortana"/><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Build 2016, Day One</title><content type='html'>&lt;p&gt;First day of Build 2016 is over, at least for my part. It’s been fun, a bit chaotic, and man… My feet hurt like crazy!&lt;/p&gt; &lt;p&gt;After registering I went straight up to get in line for the keynote. Good call, there were already at least 200 other that had the same great idea - 1.5 hours before it was to start! Pretty much everyone attends the keynote, which is the broader look at what Microsoft has in store for the near and far future.&lt;/p&gt; &lt;p&gt;After some fluff about how they are to empower every person and organization on the planet, and figures about how many Windows 10 installations that have been made (270+ million. whoah!) they dropped the first bit of good news - the Windows 10 Anniversary Update is coming this summer. Seem to have a lot of goodies in that one, for sure! And, it will be totally free. Awesome!&lt;/p&gt; &lt;p&gt;They went on with some news about Microsoft Edge. They will integrate the Windows Hello authentication so you can get to it by some simple javascript api’s. Great for logins to different sites etc - albeit, if people want to log in with their fingerprint there’s already good solutions for it with third party software - that works across browsers. My 2 cents: Good feature, sure, but just another Edge-exclusive api.&lt;/p&gt; &lt;p&gt;Big news for anyone looking into development for the Xbox One! From this summer (and out as a preview TONIGHT) any retail Xbox can become a developer edition by just flicking a checkbox in the settings. This removes the ability to start any games and apps you have installed, but instead you can connect to your Xbox from a Visual Studio 2015 installation and install any Universal Window Platform application to test. When finished with the app, just release it to the store as usual. If marked as Xbox compatible, it will automatically turn up in the Xbox store as well. Pretty darn sweet! You can of course turn it back into a regular non-dev console at any time.&lt;/p&gt; &lt;p&gt;I’m really starting to dig the whole UWP thing. Will have to mess around with that a bit more. You get a lot for free as well, they automatically hook up the controller instead of mouse events etc on the Xbox, and touch on phones/tablets/touchscreens. Of course you can also very easily override it all to tailor it for each device.&lt;/p&gt; &lt;p&gt;They have talked a lot about bots and experts. Experts are essentially your app telling Cortana how she can use it, which keywords to trigger on etc. Seems easy enough to hook up to her. No pun intended. I really like this. Instead of going the route Apple is taking with Siri, as well as Google with Google Now, they let developers around the world extend Cortana as they see fit, and essentially make her smarter by helping out with the brain power. That also means she will become more tailored to you since it’s based on what applications you have installed giving her a boost through experts.&lt;/p&gt; &lt;p&gt;Integrations with Cortana seem to be huge within Microsoft as well. They showed some really cool (and kinda scary) demos of Cortana reading through your emails, looking for things you might have forgotten and automatically add as reminders and calendar events. Did you tell your mom you’ll call her tomorrow instead? Busted; this time Cortana will remind you of your white lie.&lt;/p&gt; &lt;p&gt;Bots are… Well, bots. Satya Nadella (Microsoft&#39;s CEO) was talking about a world powered by bots, where conversation is the platform, and voice is the UI. Good examples would be an automated bot taking your order at a drive-through restaurant, and other bots residing inside your favorite messaging app (which of course during Build everyone agrees is Skype no matter what we use otherwise). These bots could trigger on certain keywords, for instance if you talk about being hungry, instantly ask you if you want to order your favorite pizza. Like even easier access to pizza is a good thing for the world.&lt;/p&gt; &lt;p&gt;I can definitely see a lot of potential in this, and it really hit me when they showed a video of a blind man having helped design technology that, with a pair of smart glasses, let him take pictures, and have it described back to him through speech synthesis. Technology helping a blind person to see the world. Simply amazing.&lt;/p&gt; &lt;p&gt;And in other news; &lt;ul&gt;&lt;li&gt;Visual Studio Update 2 was released today.&lt;/li&gt;&lt;li&gt;Hololens is ready, and started to ship to preorder customers today.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt; &lt;p&gt;Coincidence? I… Think… Not!&lt;/p&gt; &lt;p&gt;Hopefully I have the strength to stand in that humongous line tomorrow and let you guys know if it’s worth the hype or not. If, I manage to keep my sanity after standing in that line. That line. That line scares me.&lt;/p&gt; &lt;p&gt;And alas, I saved the best for last!&lt;/p&gt; &lt;p&gt;Bash is coming to Windows! Amazing news! We’re talking real Bash, with all your favorite gnu tools, finally native on windows.&lt;/p&gt; &lt;iframe src=&quot;https://channel9.msdn.com/Events/Build/2016/P488/player&quot; width=&quot;600&quot; height=&quot;340&quot; allowFullScreen frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt; &lt;p&gt;Yes, I am a happy camper. A tired one though, so good night for now!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/5646242189899428357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2016/03/build-2016-day-one.html#comment-form' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/5646242189899428357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/5646242189899428357'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2016/03/build-2016-day-one.html' title='Build 2016, Day One'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>37</thr:total><georss:featurename>San Francisco, CA, USA</georss:featurename><georss:point>37.7749295 -122.41941550000001</georss:point><georss:box>37.373501499999996 -123.06486250000002 38.1763575 -121.77396850000001</georss:box></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-8892990611510726454</id><published>2016-02-19T15:56:00.000+01:00</published><updated>2016-02-19T16:10:19.864+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Documentation"/><category scheme="http://www.blogger.com/atom/ns#" term="Erik Nilsson"/><category scheme="http://www.blogger.com/atom/ns#" term="NUnit"/><category scheme="http://www.blogger.com/atom/ns#" term="Roslyn"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><title type='text'>Documentation with code examples - the maintainable(?) way</title><content type='html'>&lt;p&gt;We keep an internal base code platform at Nansen, which several of our sites are based. We like to think of this as our bread and butter. Meaning, those parts of every project you copy+paste to the next. Sadly, we have been quite bad at documenting it, or we have been documenting it, but the problem is often that the code examples tend to get out-of-date as code naturally evolve with time. &lt;/p&gt;&lt;p&gt;To alleviate this I wanted to create a way to keep the documentation and examples to support it up-to-date, but also contain readable text. One could argue that an SDK is a way, but SDK&#39;s usually contain way too much fluff in the way of tables upon tables of method, property and event definitions. And they are also plagued by the out-of-date example code problem above, as examples are written in the &amp;lt;example&amp;gt;-section of the summary documentation. It is easy to get lazy and forget about an example if a method or class is updated.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Anyways, my colleague Andreas &#39;Honungsprinsen&#39; Oldeskog used a clever way to document our front-end framework by pulling markdown from github, and generating documentation pages from those files. I wanted to find a similar way, but with c# source code instead. This gave me three problems to solve:&lt;br/&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Having code examples that actually compile, and are relevant to the code I want to document.&lt;/li&gt;&lt;li&gt;The ability to easily attach human readable documentation and informational text to said code.&lt;/li&gt;&lt;li&gt;Some way of combining 1 and 2 in order to present it to the developers (hopefully) reading the documentation.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now, for problem 1, part of the solution was so simple Andreas had to point it out to me: Use tests! I could just write unit tests, they run the actual code, and you can use assertions to verify the examples actually do what you show to the reader of the documentation. &lt;/p&gt;&lt;p&gt;The second part of the solution to problem 1 was finding a way to actually run the tests and present them to the reader. This was solved by using NUnit, and its test runner functionality somewhat hidden away in Nunit.core.dll, an assembly that is unfortunately not distributed along with nunit.framework.dll in the NUnit nuget package. I found it tucked away in a package named NUnit.Runners, and I had to manually reference the assemblies nunit.code.dll and nunit.core.interfaces.dll from my web project designated to run and present the results of my example tests. &lt;/p&gt;&lt;p&gt;When all that is achieved, it is pretty simple to actually run tests: &lt;/p&gt;&lt;pre class=&quot;brush:csharp&quot;&gt;public class TestResultsEventListener : EventListener&lt;br /&gt;{&lt;br /&gt;    public TestResultsEventListener()&lt;br /&gt;    {&lt;br /&gt;        ListResults = new List&amp;lt;testresult&amp;gt;();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public List&amp;lt;testresult&amp;gt; ListResults { get; }&lt;br /&gt;&lt;br /&gt;    public void TestFinished(TestResult result)&lt;br /&gt;    {&lt;br /&gt;        ListResults.Add(result);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // noop all other methods&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List&amp;lt;testresult&amp;gt; RunSomeTests(IEnumerable&amp;lt;string&amp;gt; testNames)&lt;br /&gt;{&lt;br /&gt;    var testPackage = new TestPackage(&quot;ExampleCode&quot;); // this can be named anything&lt;br /&gt;    testPackage.Assemblies.Add(Assembly.Load(&quot;my.assembly.with.tests&quot;).Location);&lt;br /&gt;&lt;br /&gt;    var eventListener = new TestResultsEventListener();&lt;br /&gt;    var runner = new SimpleTestRunner();&lt;br /&gt;    if (runner.Load(_testPackage)) {&lt;br /&gt;        var filter = TestFilter.Empty;&lt;br /&gt;        if (testNames != null &amp;amp;&amp;amp; testNames.Any()) {&lt;br /&gt;            filter = new SimpleNameFilter(testNames.ToArray());&lt;br /&gt;        }&lt;br /&gt;        runner.Run(eventListener, filter, true, LoggingThreshold.All);&lt;br /&gt;    }&lt;br /&gt;    return eventListener.ListResults;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The result is a neat list of all our tests and their results, this solved problem 1, neat!&lt;br /&gt;A bonus of this approach is also, since we use Episerver in our project platform, and the documentation/demo site is a basic implementation of said platform, all the service loading for epsierver is already done and the site is running so I can use real data for any code interacting with the site without having to mock my heart out (seriously, unit testing episerver code is 98% service mocking). &lt;/p&gt;&lt;p&gt;For problem 2, I decided to just use markdown syntax in the summary documentation of each test. If a more generic description or informative text was needed, I used the summary documentation of the test class. I also made sure to comment as much as possible of the test method code. &lt;/p&gt;&lt;p&gt;Now, problem 3 was trickier, I needed to somehow parse both the code and summary documentation for my test cases, and present the result. Cue Roslyn! Using the new Roslyn code parser Microsoft came up with, I could easily read a source file, and extract whatever I wanted. &lt;/p&gt;&lt;p&gt;Combining all three solutions above gave me a helper that: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Found all tests for a specific class,&lt;/li&gt;&lt;li&gt;Ran the tests, and recorded the results,&lt;/li&gt;&lt;li&gt;Parsed the source code for said tests and formatted the result&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The code for my helper: &lt;/p&gt;&lt;pre class=&quot;brush:csharp&quot;&gt;public class ExampleCodeHelper&lt;br /&gt;{&lt;br /&gt;    private readonly DirectoryInfo _baseDirectory;&lt;br /&gt;&lt;br /&gt;    private readonly TestPackage _testPackage;&lt;br /&gt;&lt;br /&gt;    public ExampleCodeHelper(string baseDirectory, IEnumerable&amp;lt;string&amp;gt; assemblyNames)&lt;br /&gt;    {&lt;br /&gt;        _baseDirectory = new DirectoryInfo(baseDirectory);&lt;br /&gt;        _testPackage = new TestPackage(&quot;ExampleCode&quot;);&lt;br /&gt;        foreach (var assemblyName in assemblyNames) {&lt;br /&gt;            _testPackage.Assemblies.Add(Assembly.Load(assemblyName).Location);&lt;br /&gt;        }&lt;br /&gt;        CoreExtensions.Host.InitializeService();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static ExampleCodeHelper Default&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            var root = HttpContext.Current.Server.MapPath(&quot;~&quot;) + ConfigurationManager.AppSettings[&quot;examplecode.sourcefile.rootpath&quot;];&lt;br /&gt;            var assemblies = ConfigurationManager.AppSettings[&quot;examplecode.test.assemblies&quot;].Split(&#39;;&#39;);&lt;br /&gt;            return new ExampleCodeHelper(root, assemblies);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private IEnumerable&amp;lt;string&amp;gt; CodeFiles =&amp;gt; Directory.GetFiles(_baseDirectory.FullName, &quot;*.cs&quot;, SearchOption.AllDirectories);&lt;br /&gt;&lt;br /&gt;    private IEnumerable&amp;lt;TestResult&amp;gt; RunTests(IEnumerable&amp;lt;string&amp;gt; testNames)&lt;br /&gt;    {&lt;br /&gt;        var eventListener = new TestResultsEventListener();&lt;br /&gt;        var runner = new SimpleTestRunner();&lt;br /&gt;        if (runner.Load(_testPackage)) {&lt;br /&gt;            runner.Run(eventListener, new SimpleNameFilter(testNames.ToArray()), true, LoggingThreshold.All);&lt;br /&gt;        }&lt;br /&gt;        return eventListener.ListResults;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ClassDeclarationSyntax GetTestClass(string classFullName)&lt;br /&gt;    {&lt;br /&gt;        var definitions = GetAllTestClassDefinitions();&lt;br /&gt;        var classSymbol = definitions.Keys.FirstOrDefault(k =&amp;gt; k.ToString() == classFullName);&lt;br /&gt;        return classSymbol != null ? definitions[classSymbol] : null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Retrieves a &amp;lt;see cref=&quot;ExampleCodeContent&quot;/&amp;gt; containing a number of &amp;lt;see cref=&quot;TestResultItem&quot;/&amp;gt; objects with test results&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&quot;classFullName&quot;&amp;gt;Full name (including namespace) for the test class&amp;lt;/param&amp;gt;&lt;br /&gt;    public ExampleCodeContent GetTestResults(string classFullName)&lt;br /&gt;    {&lt;br /&gt;        var definitions = GetAllTestClassDefinitions();&lt;br /&gt;        var classSymbol = definitions.Keys.FirstOrDefault(k =&amp;gt; k.ToString() == classFullName);&lt;br /&gt;&lt;br /&gt;        if (classSymbol == null) {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        var classDeclaration = definitions[classSymbol];&lt;br /&gt;&lt;br /&gt;        var content = new ExampleCodeContent {&lt;br /&gt;            Text = GetSyntaxNodeDocumentation(classSymbol),&lt;br /&gt;            ContainerClass = classDeclaration&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        var testCases = classDeclaration.DescendantNodes()&lt;br /&gt;                                        .OfType&amp;lt;MethodDeclarationSyntax&amp;gt;()&lt;br /&gt;                                        .Where(m =&amp;gt; HasNamedAttribute(m.AttributeLists, nameof(TestAttribute)))&lt;br /&gt;                                        .ToList();&lt;br /&gt;&lt;br /&gt;        var tests = RunTests(testCases.Select(t =&amp;gt; $&quot;{classSymbol.ToString()}.{t.Identifier.ValueText}&quot;))&lt;br /&gt;            .ToDictionary(key =&amp;gt; testCases.Single(m =&amp;gt; m.Identifier.ValueText == key.Test.MethodName), value =&amp;gt; value);&lt;br /&gt;&lt;br /&gt;        content.TestResults = tests.Keys.Select(method =&amp;gt; new TestResultItem {&lt;br /&gt;            Method = method,&lt;br /&gt;            TestResult = tests[method],&lt;br /&gt;            Text = GetSyntaxNodeDocumentation(GetDeclaredSymbol(method))&lt;br /&gt;        }).ToList();&lt;br /&gt;&lt;br /&gt;        return content;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Returns all test class definitions found in the defined source folder.&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;remarks&amp;gt;&lt;br /&gt;    /// Only classes decorated with the &amp;lt;see cref=&quot;TestFixtureAttribute&quot;/&amp;gt; attribute is returned.&lt;br /&gt;    /// &amp;lt;/remarks&amp;gt;&lt;br /&gt;    public IDictionary&amp;lt;ISymbol, ClassDeclarationSyntax&amp;gt; GetAllTestClassDefinitions()&lt;br /&gt;    {&lt;br /&gt;        var classes = new List&amp;lt;ClassDeclarationSyntax&amp;gt;();&lt;br /&gt;        foreach (var file in CodeFiles) {&lt;br /&gt;            try {&lt;br /&gt;                var testClasses = CSharpSyntaxTree.ParseText(File.ReadAllText(file))&lt;br /&gt;                                                  .GetRoot()&lt;br /&gt;                                                  .DescendantNodes()&lt;br /&gt;                                                  .OfType&amp;lt;ClassDeclarationSyntax&amp;gt;()&lt;br /&gt;                                                  .Where(c =&amp;gt; HasNamedAttribute(c.AttributeLists, nameof(TestFixtureAttribute)));&lt;br /&gt;&lt;br /&gt;                classes.AddRange(testClasses);&lt;br /&gt;            }&lt;br /&gt;            catch (Exception) {&lt;br /&gt;                // just ignore failing source files&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return classes.ToDictionary(GetDeclaredSymbol, value =&amp;gt; value);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #region helper methods&lt;br /&gt;&lt;br /&gt;    private static bool HasNamedAttribute(SyntaxList&amp;lt;AttributeListSyntax&amp;gt; attributes, string attributeName)&lt;br /&gt;    {&lt;br /&gt;        var simpleAttributeName = attributeName.EndsWith(&quot;Attribute&quot;)&lt;br /&gt;            ? attributeName.Substring(0, attributeName.LastIndexOf(&quot;Attribute&quot;, StringComparison.Ordinal))&lt;br /&gt;            : attributeName;&lt;br /&gt;        return attributes.SelectMany(a =&amp;gt; a.Attributes).Any(a =&amp;gt; a.Name.ToString().EndsWith(simpleAttributeName));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Retrives the &amp;lt;&amp;lt;paramref name=&quot;documentationSection&quot;/&amp;gt;&amp;gt; documentation element &quot;innertext&quot; from the provided &amp;lt;see cref=&quot;ISymbol&quot;/&amp;gt;&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    private static string GetSyntaxNodeDocumentation(ISymbol symbol, string documentationSection = &quot;summary&quot;)&lt;br /&gt;    {&lt;br /&gt;        var methodDocumentation = symbol.GetDocumentationCommentXml();&lt;br /&gt;        if (!string.IsNullOrEmpty(methodDocumentation)) {&lt;br /&gt;            var doc = XDocument.Parse(methodDocumentation);&lt;br /&gt;            var nodes = doc.Descendants(documentationSection).FirstOrDefault()?.Nodes() ?? Enumerable.Empty&amp;lt;XNode&amp;gt;();&lt;br /&gt;            return ParseSeeCrefs(string.Concat(nodes));&lt;br /&gt;        }&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Changes any &amp;lt;see cref=&quot;TEXT&quot; /&amp;gt; into &amp;lt;em&amp;gt;TEXT&amp;lt;/em&amp;gt;, making it usable in html&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    private static string ParseSeeCrefs(string inputText)&lt;br /&gt;    {&lt;br /&gt;        if (string.IsNullOrEmpty(inputText)) {&lt;br /&gt;            return inputText;&lt;br /&gt;        }&lt;br /&gt;        var seeRegex = new Regex(&quot;&amp;lt; *see( +)cref=\&quot;[^\&quot;]:([^\&quot;]+)\&quot; */&amp;gt;&quot;);&lt;br /&gt;        return seeRegex.Replace(inputText, m =&amp;gt; &quot;&amp;lt;em&amp;gt;&quot; + m.Groups[2].Value + &quot;&amp;lt;/em&amp;gt;&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Returns the declared &amp;lt;see cref=&quot;ISymbol&quot;/&amp;gt; for a specified &amp;lt;see cref=&quot;SyntaxNode&quot;/&amp;gt;&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    private static ISymbol GetDeclaredSymbol(SyntaxNode syntaxNode)&lt;br /&gt;    {&lt;br /&gt;        return CSharpCompilation.Create(&quot;MyCompilation&quot;, new[] {syntaxNode.SyntaxTree}).GetSemanticModel(syntaxNode.SyntaxTree).GetDeclaredSymbol(syntaxNode);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #endregion&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;With it, I can call ExampleCodeHelper.Default.GetTestResults(&quot;MyTestAssembly.MyTestResultClass&quot;) to compile a simple data model (source not shown), with documentation, and test source code. The result looking something like below: &lt;/p&gt;&lt;p&gt;Source code:&lt;/p&gt;&lt;pre class=&quot;brush:csharp&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// #Content utilities#&lt;br /&gt;/// &amp;lt;see cref=&quot;ContentUtility&quot;/&amp;gt; contain a number of useful methods and extensions for Episerver content.&lt;br /&gt;/// Basically, it can be seen as extension methods for &amp;lt;see cref=&quot;IContentLoader&quot;/&amp;gt;. Though there are a number&lt;br /&gt;/// of addiotional useful functions added.&lt;br /&gt;/// &lt;br /&gt;/// Important to know is that the extensions, as opposed to the &amp;lt;see cref=&quot;IContentLoader&quot;/&amp;gt;, will return null&lt;br /&gt;/// instead of throwing a &amp;lt;see cref=&quot;EPiServerException&quot;/&amp;gt; if not found or otherwise failing.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;[TestFixture(Category = &quot;Episerver&quot;, Description = &quot;Content utillties&quot;)]&lt;br /&gt;public class ContentUtilityTests&lt;br /&gt;{&lt;br /&gt;    [Test]&lt;br /&gt;    public void Load_Content()&lt;br /&gt;    {&lt;br /&gt;        var contentLink = SiteDefinition.Current.StartPage;&lt;br /&gt;&lt;br /&gt;        //load content&lt;br /&gt;        var content = contentLink.Get&amp;lt;IContent&amp;gt;();&lt;br /&gt;        Assert.AreEqual(contentLink, content.ContentLink);&lt;br /&gt;&lt;br /&gt;        //load content typed&lt;br /&gt;        var startPage = contentLink.Get&amp;lt;PageData&amp;gt;();&lt;br /&gt;        Assert.IsNotNull(startPage);&lt;br /&gt;&lt;br /&gt;        // a wrong type or otherwise will return null&lt;br /&gt;        var invalid = contentLink.Get&amp;lt;BlockData&amp;gt;();&lt;br /&gt;        Assert.IsNull(invalid);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void Load_content_using_a_specific_language()&lt;br /&gt;    {&lt;br /&gt;        var contentLink = SiteDefinition.Current.StartPage;&lt;br /&gt;        var content = contentLink.Get&amp;lt;PageData&amp;gt;(LanguageLoaderOption.FallbackWithMaster());&lt;br /&gt;        Assert.IsNotNull(content);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Rendered result:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-uYgFVJrJbwg/Vsco17sP4HI/AAAAAAAAA2k/HBsb0-A5DsI/s1600/examplecoderesult.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; width: 100%;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://3.bp.blogspot.com/-uYgFVJrJbwg/Vsco17sP4HI/AAAAAAAAA2k/HBsb0-A5DsI/s640/examplecoderesult.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/8892990611510726454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2016/02/documentation-with-code-examples.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/8892990611510726454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/8892990611510726454'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2016/02/documentation-with-code-examples.html' title='Documentation with code examples - the maintainable(?) way'/><author><name>Erik</name><uri>http://www.blogger.com/profile/07540886242859059701</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-uYgFVJrJbwg/Vsco17sP4HI/AAAAAAAAA2k/HBsb0-A5DsI/s72-c/examplecoderesult.png" height="72" width="72"/><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-7154352786223435976</id><published>2016-01-14T18:24:00.000+01:00</published><updated>2016-01-14T18:28:58.140+01:00</updated><title type='text'>NDC London 2016 - På plats</title><content type='html'>Nansen är på plats i London för att delta i konferensen&amp;nbsp;&lt;a href=&quot;http://ndc-london.com/&quot; target=&quot;_blank&quot;&gt;NDC London&lt;/a&gt;. Efter nästan två dagar har vi hunnit med ett antal föreläsningar. Vi har fått höra om nyheter i ASP.NET 5, MVC 6 och Entity Framework 7. Och också hur man kan attackera sin egen sajt för att identifiera framtida problem och innan de blir problem. Det har även varit mycket prat om Azure och automatiseringar. &lt;a href=&quot;https://twitter.com/jonskeet&quot; target=&quot;_blank&quot;&gt;Jon Skeet&lt;/a&gt; och &lt;a href=&quot;https://twitter.com/odetocode&quot; target=&quot;_blank&quot;&gt;Scott Allen&lt;/a&gt; har även haft en liten battle på scen där de fick tävla om att svara på frågor från &lt;a href=&quot;http://stackoverflow.com/&quot; target=&quot;_blank&quot;&gt;stackoverflow&lt;/a&gt;. Tycker nog att Jon gick vinnande ur den kampen,&lt;br /&gt;Förhoppningsvis så kommer även alla talks snart publiceras på &lt;a href=&quot;https://vimeo.com/ndcconferences&quot; target=&quot;_blank&quot;&gt;vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-MQYZGT1UjGs/VpfCXqgl_BI/AAAAAAABIEc/o0R3x-o4x6k/s1600/2016-01-14%2B14.45.22.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;http://1.bp.blogspot.com/-MQYZGT1UjGs/VpfCXqgl_BI/AAAAAAABIEc/o0R3x-o4x6k/s640/2016-01-14%2B14.45.22.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;i&gt;Christer Ottosson får smaka på &lt;a href=&quot;https://twitter.com/jonskeet&quot; target=&quot;_blank&quot;&gt;Jon Skeets&lt;/a&gt; magi.&lt;/i&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-ggXnR3Ljv6k/VpfCP_XllsI/AAAAAAABIEQ/TRfqTMrwcM8/s1600/2016-01-12%2B20.40.56.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;http://2.bp.blogspot.com/-ggXnR3Ljv6k/VpfCP_XllsI/AAAAAAABIEQ/TRfqTMrwcM8/s640/2016-01-12%2B20.40.56.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;Christer Ottosson, Jenny Atmer och Kalle Hoppe&lt;/i&gt;&lt;br /&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/7154352786223435976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2016/01/ndc-london-2016-pa-plats.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7154352786223435976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7154352786223435976'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2016/01/ndc-london-2016-pa-plats.html' title='NDC London 2016 - På plats'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08893072264415763606</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-MQYZGT1UjGs/VpfCXqgl_BI/AAAAAAABIEc/o0R3x-o4x6k/s72-c/2016-01-14%2B14.45.22.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-2546443462606865370</id><published>2016-01-12T15:19:00.001+01:00</published><updated>2016-01-12T15:19:15.223+01:00</updated><title type='text'>Nansens protein junkies bevakar sina intressen</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-fAdYs9AxtqQ/VpUKm03SBpI/AAAAAAAAL4A/nOm4aOJqit4/s1600/IMG_5405.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://3.bp.blogspot.com/-fAdYs9AxtqQ/VpUKm03SBpI/AAAAAAAAL4A/nOm4aOJqit4/s320/IMG_5405.JPG&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;Friskvårdsbidragen nyttjas frekvent på Nansen. Kokosbollarna och kakorna är inte fullt lika poplära som under andra tider på året. Ägg är hårdvaran just nu.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/2546443462606865370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2016/01/nansens-protein-junkies-bevakar-sina.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/2546443462606865370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/2546443462606865370'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2016/01/nansens-protein-junkies-bevakar-sina.html' title='Nansens protein junkies bevakar sina intressen'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-fAdYs9AxtqQ/VpUKm03SBpI/AAAAAAAAL4A/nOm4aOJqit4/s72-c/IMG_5405.JPG" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-9121810560181814416</id><published>2015-11-11T13:25:00.001+01:00</published><updated>2015-12-03T12:18:07.898+01:00</updated><title type='text'>Nansen Stockholm- kontorsliv</title><content type='html'>(Swedish) Kära besökare. Vi på Nansen gillar att dela med oss av både mjuka och hårda värden och även låta er ta del av högt och lågt vad gäller vad vi sysslar med. Fluffiga ord som inte alltid är lätta att konkretisera. Idag så ska jag dock ge er ett exempel på viktiga detaljer som vi brottas med men vars innehållsvärde kanske inte ligger högst upp på skalan.&lt;br /&gt;&lt;br /&gt;Vi har haft en jobbig vattenläcka på stockholmskontoret vilket medför en del olägenhet just nu. Ett rör har stått och läckt en längre tid vid en av toaletterna och det har varit hantverkare här som hållit på och rivit ner väggar och golv. S ånu står det fläktar och torkar ut en del av lokalen. Fläktarna brummar en del och därför vill vi gärna ha stängt mellan den delen av lokalen och där vi sitter och jobbar i kontorslandskapet så folk slipper ådra sig tinnitus som arbetsmiljörelaterad skada.&lt;br /&gt;Dörrhelvetet som ska dras igen krånglar dock lite och den är lite trixig att stänga igen. Genierna här på Nansen är dock inte bara jevvligt skarpa på att koka webb, vi är även rätt vassa på att skapa pedagogiska lappar och instruktionsvideos. Så, naturligtvis löste vi dörrstängningsproblematiken genom att sätta upp en otroligt pedagogisk lapp samt en instruktionsvideo för hur man går tillväga för att på ett korrekt sätt stänga dörren trots att den är lite kajko.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/65KUGoBJkDE&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-k7d-ohDREhU/VkMzaMKt-gI/AAAAAAAAAns/NKM-2-uCj1g/s1600/2015-11-11%2B13.22.54.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-k7d-ohDREhU/VkMzaMKt-gI/AAAAAAAAAns/NKM-2-uCj1g/s320/2015-11-11%2B13.22.54.jpg&quot; width=&quot;560&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/9121810560181814416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/11/nansen-stockholm-kontorsliv.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/9121810560181814416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/9121810560181814416'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/11/nansen-stockholm-kontorsliv.html' title='Nansen Stockholm- kontorsliv'/><author><name>rewdboy</name><uri>http://www.blogger.com/profile/16710163854461568277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos-g.ak.facebook.com/photos-ak-sf2p/v113/80/89/593697311/n593697311_281398_1404.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/65KUGoBJkDE/default.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-7515745011847623431</id><published>2015-10-09T15:23:00.002+02:00</published><updated>2015-12-03T12:19:02.724+01:00</updated><title type='text'>&quot;Koka webb&quot; in progress</title><content type='html'>What you see here is actually a rockstar and a sailor discussing some very intricate system architecture structure stuff at Nansen HQ, Stockholm. This is what we call &quot;koka webb&quot;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-r295yCXFKN4/Vhe-sMHlrDI/AAAAAAAAAnU/sWCLZwkkZtc/s1600/datamodeling.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-r295yCXFKN4/Vhe-sMHlrDI/AAAAAAAAAnU/sWCLZwkkZtc/s640/datamodeling.png&quot; width=&quot;580&quot; /&gt;.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/7515745011847623431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/10/koka-webb-in-progress.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7515745011847623431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7515745011847623431'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/10/koka-webb-in-progress.html' title='&quot;Koka webb&quot; in progress'/><author><name>rewdboy</name><uri>http://www.blogger.com/profile/16710163854461568277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos-g.ak.facebook.com/photos-ak-sf2p/v113/80/89/593697311/n593697311_281398_1404.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-r295yCXFKN4/Vhe-sMHlrDI/AAAAAAAAAnU/sWCLZwkkZtc/s72-c/datamodeling.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-5689862067323633979</id><published>2015-10-02T10:43:00.000+02:00</published><updated>2015-10-02T10:44:06.720+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer CMS 6"/><category scheme="http://www.blogger.com/atom/ns#" term="PageTypeBuilder"/><title type='text'>Timeout exception during PageTypeBuilder update - DefaultValueType need a companion</title><content type='html'>TL DR; On a page property in PageTypeBuilder (PTB) - If you have DefaultValueType = DefaultValueType.Value, you must have DefaultValue set to something. Otherwise your site might cause timeout on startup while PTB does it’s thing. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;br /&gt;The last months we&#39;ve had problems with a clients test environment (EPiServer 6) regarding nasty timeouts while PageTypeBuilder does it&#39;s update on site startup. I spent some time cleaning the page types from missing/conflicting sort index on properties and removed tons of old page types that weren&#39;t in use anymore.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The issue&lt;/h2&gt;&lt;br /&gt;After the above mentinoed optimization, it felt like the startup ran smoother, but it was all an illusion. Every startup when PTB ran it&#39;s update, we got this exception:&lt;br /&gt;&lt;i&gt;Timeout expired. &amp;nbsp;The timeout period elapsed prior to completion of the operation or the server is not responding.&lt;/i&gt;&lt;br /&gt;At first I assumed it was network related since the hosting provider have had problems during this period with their firewall and other network issues.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The solution&lt;/h2&gt;&lt;br /&gt;After I configured EPiServerLog.config to log level ALL, I began to see the truth.&lt;br /&gt;Just before every timeout error there was the same page property, over and over again. &lt;br /&gt;&lt;br /&gt;2015-10-01 13:54:46,383 DEBUG [39] PageTypeBuilder.Synchronization.PageDefinitionSynchronization.PageDefinitionUpdater.UpdateExistingPageDefinition - Updating PageDefintion, old values: Name: AddressSlimInfoText|Type:|EditCaption:Prenumerationen registreras på din..|HelpText:|Required:False|Searchable:False|DefaultValue:|DefaultValueType:None|LanguageSpecific:False|DisplayEditUI:True|FieldOrder:1120|Tab.ID:166|,new values: Name: AddressSlimInfoText|Type: |EditCaption:Prenumerationen registreras på din..|HelpText:|Required:False|Searchable:False|DefaultValue:|DefaultValueType:Value|LanguageSpecific:False|DisplayEditUI:True|FieldOrder:1120|Tab.ID:166|.&lt;br /&gt;I navigated to the code for page type that had this property and saw this:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;[PageTypeProperty(EditCaption = &quot;Prenumerationen registreras på din..&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp;Type = typeof(PropertyString),&lt;br /&gt;&amp;nbsp; &amp;nbsp;Tab = typeof(PurchaseFlowAddressSlimTab),&lt;br /&gt;&amp;nbsp; &amp;nbsp;DefaultValueType = EPiServer.DataAbstraction.DefaultValueType.Value,&lt;br /&gt;&amp;nbsp; &amp;nbsp;SortOrder = 1120)]&lt;br /&gt;public virtual string AddressSlimInfoText { get; set; }&lt;/blockquote&gt;&lt;br /&gt;Took a while before I saw what was different from the other properties. This:&lt;br /&gt;DefaultValueType = EPiServer.DataAbstraction.DefaultValueType.&lt;b&gt;Value&lt;/b&gt;&lt;br /&gt;But no DefaultValue was set.&lt;br /&gt;&lt;br /&gt;I corrected this and then updated the test environment. Still got the same error, but now the log told me about the next property that had the same issue, and the next and the next etc.&lt;br /&gt;&lt;br /&gt;So I had to go through all the page type properties in the code that used DefaultValueType and check to see if it had the matching DefaultValue or not.&lt;br /&gt;&lt;br /&gt;When this was done, took a while, the site has about 100 page types and I found about 10-15 properties that had to be corrected, I updated the test site again and tried to trigged the timeout.&lt;br /&gt;&lt;br /&gt;But alas, there was none.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Wisdom&lt;/h2&gt;&lt;br /&gt;It seems weird that this causes a timeout, there should be an ArgumentException or something further inside the EPiServer.DataAccess-assembly that actually does the page definition update. So when you set DefaultValueType to Value, you have to set DefaultValue to something&lt;br /&gt;&lt;br /&gt;For us I think it was a combination of unstable network environment and time consuming PTB update that triggered this timeout. As a developer, at least you can give PTB the best possible conditions so it runs as smooth as possible.&lt;br /&gt;&lt;br /&gt;Anywho… &amp;nbsp;if you have weird timeouts on an Epi 6 site. Check the obvious PTB mistakes such as duplicate/missing sort index etc, but also check the DefaultValueType/DefaultValue pairings.</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/5689862067323633979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/10/timeout-exception-during.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/5689862067323633979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/5689862067323633979'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/10/timeout-exception-during.html' title='Timeout exception during PageTypeBuilder update - DefaultValueType need a companion'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-3893862083948445472</id><published>2015-09-17T13:31:00.000+02:00</published><updated>2015-09-17T13:31:44.121+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="RequireJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Getting Visual Studio intellisense to play nice with RequireJS</title><content type='html'>I was trying to get the intellisense to work in my javascript files in my ASP.NET MVC project, for which i&#39;m using RequireJS and here&#39;s how it all worked out.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Working with _references.js&lt;/span&gt;&lt;/h3&gt;Visual studio is using a file called _references.js to grant you the wisdom of intellisense in JavaScript files. First off, we need to make sure we have our _references.js file where Visual Studio can find it. By default Visual Studio will search for this file in the location &quot;~/Scripts/_references.js&quot; if your&#39;e working with a web project. However if your scripts-folder resides in a different area of your project you can easily change where Visual Studio looks for this file.&lt;br /&gt;&lt;br /&gt;Options → Text Editor → JavaScript → IntelliSense → References&lt;br /&gt;&lt;br /&gt;In the dropdown called &quot;Reference Group&quot; choose &quot;Implicit (Web)&quot;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;If you&#39;re interested you can read more on the history of _references.js here &lt;a href=&quot;http://madskristensen.net/post/the-story-behind-_referencesjs&quot;&gt;http://madskristensen.net/post/the-story-behind-_referencesjs&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-iW_7wv4nioE/VfqbxIUXxKI/AAAAAAAAAAg/TdNJa6gvkQE/s1600/_referencesjs%2Bsetting.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;422&quot; src=&quot;http://3.bp.blogspot.com/-iW_7wv4nioE/VfqbxIUXxKI/AAAAAAAAAAg/TdNJa6gvkQE/s640/_referencesjs%2Bsetting.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Configuring _references.js for RequireJS&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;I was reading up on the subject on at&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/dn904583(v=vs.120).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/dn904583(v=vs.120).aspx&lt;/a&gt;) but i was having issues with how the path was resolved to my RequireJS modules. So my scripts wasn&#39;t loaded correctly.&amp;nbsp;&lt;/div&gt;&lt;div&gt;While reading the debug messages in the output window for JavaScript Language Service, saw from where Visual Studio tried to load my files, C:\Program Files (x86)\Microsoft Visual Studio 14.0\JavaScript\References\require.config.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The solution was to configure the basePath for RequireJS in the _references.js file, and after RequireJS will handle the dependencies you have in your modules and Visual Studio will grant you IntelliSense.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h4&gt;Code&lt;/h4&gt;&lt;/div&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;/// &amp;lt;autosync enabled=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;/// &amp;lt;reference path=&quot;Vendor/require.js&quot; data-main=&quot;main.js&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;require.config({&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;baseUrl: &#39;~/Assets/Scripts/&#39;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;});&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style=&quot;font-size: x-large;&quot;&gt;Decorate your scripts with comments&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;In Visual Studio 2015, Microsoft has added support for JSDoc. Which is a documenting/comment syntax, and if you use it you get really sweet intellisense in correlation with _references.js. So instead of just getting what functions and properties an object might have you also get information of parameters and types if you choose to write it. Visual Studio also has support for xml based comments to complement your intllisense, but personally i prefer JSDoc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;You can read the documentation of JSDoc at &lt;a href=&quot;http://usejsdoc.org/&quot;&gt;http://usejsdoc.org/&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E.g. creating a module like this will grant you the intellisense of the picture below.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h4&gt;Code&lt;/h4&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;* AWESOM-O&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;* @module modules/awesomo&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;define(&#39;modules/awesomo&#39;, [&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&#39;underscore&#39;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;], function(_){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&#39;use strict&#39;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;return {&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;/** Will return a random number between 0 and 100. */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;randomNumber: function(){&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;return _.random(0, 100);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;},&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt; * AWESOM-O will try to give you medical help&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt; * @param {string} bodyPart - The bodypart in need of medical assistance&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;giveMedicalHelp: function(bodyPart){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;return &#39;Um, actually A.W.E.S.O.M-O is not programmed for that function.&#39;;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Result&lt;/h4&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-MXmxFaXWhRI/Vfqh3iZZcrI/AAAAAAAAAA4/7xeeSq2cb7E/s1600/_butters2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-MXmxFaXWhRI/Vfqh3iZZcrI/AAAAAAAAAA4/7xeeSq2cb7E/s1600/_butters2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy coding.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/3893862083948445472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/09/getting-visual-studio-intellisense-to.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/3893862083948445472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/3893862083948445472'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/09/getting-visual-studio-intellisense-to.html' title='Getting Visual Studio intellisense to play nice with RequireJS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-iW_7wv4nioE/VfqbxIUXxKI/AAAAAAAAAAg/TdNJa6gvkQE/s72-c/_referencesjs%2Bsetting.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-3979310135310508978</id><published>2015-06-25T15:48:00.000+02:00</published><updated>2015-06-25T15:48:45.312+02:00</updated><title type='text'>Offline, can not save EPiServer 7.x</title><content type='html'>We recently started getting an odd error message whenever we edited a page. EPiServers auto save functionality was throwing an error in the console&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-ZJ8WAXw1-O4/VYwGgZP56zI/AAAAAAAAV9k/6uIc8roguOs/s1600/offline_cannot_save.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;123&quot; src=&quot;http://4.bp.blogspot.com/-ZJ8WAXw1-O4/VYwGgZP56zI/AAAAAAAAV9k/6uIc8roguOs/s640/offline_cannot_save.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;“&lt;b&gt;&lt;i&gt;POST &lt;a href=&quot;http://coopnet14.local/episerver/cms/Stores/contentdata/&quot;&gt;http://mysite.local/episerver/cms/Stores/contentdata/&lt;/a&gt;500 (Internal Server Error)&lt;/i&gt;&lt;/b&gt;”.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;We searched the internets for some clues about what could be wrong. Many posts hinted about page properties beeing missmatched with the settings in the database &lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://world.episerver.com/forum/developer-forum/EPiServer-7-CMS/Thread-Container/2012/12/offline-cant-save---error/&quot;&gt;http://world.episerver.com/forum/developer-forum/EPiServer-7-CMS/Thread-Container/2012/12/offline-cant-save---error/&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://world.episerver.com/Modules/Forum/Pages/Thread.aspx?id=118783&quot;&gt;http://world.episerver.com/Modules/Forum/Pages/Thread.aspx?id=118783&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://world.episerver.com/Modules/Forum/Pages/Thread.aspx?id=112200&quot;&gt;http://world.episerver.com/Modules/Forum/Pages/Thread.aspx?id=112200&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://stackoverflow.com/questions/4864746/episerver-configuration-settings-instance-application-is-initialized-with-sett&quot;&gt;http://stackoverflow.com/questions/4864746/episerver-configuration-settings-instance-application-is-initialized-with-sett&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: #1f497d; mso-fareast-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Further digging into the logs we found this&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Here’s the stack trace:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;[InvalidOperationException: This request has probably been tampered with. Close the browser and try again.]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; EPiServer.Framework.Web.AspNetAntiForgery.ThrowForgeryException() +374&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; EPiServer.Shell.Services.Rest.RestHttpHandler.ProcessRequest(HttpContextBase httpContext) +109&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +913&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp; System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously) +165&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;and&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ERROR - 1.2.5 Unhandled exception in ASP.NET&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;System.InvalidOperationException: This request has probably been tampered with. Close the browser and try again.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at EPiServer.Framework.Web.AspNetAntiForgery.ThrowForgeryException()&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at EPiServer.Shell.Services.Rest.RestHttpHandler.ProcessRequest(HttpContextBase httpContext)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;i&gt;ERROR - Cross-site request forgery detected [Client IP: XX.XX.XX.XX, Referer: http://mysite.local/episerver/CMS/#context=epi.cms.contentdata:///317, Url: http://&lt;/i&gt;&lt;i&gt;mysite&lt;/i&gt;&lt;i&gt;.local/episerver/cms/Stores/contentversion/, User: UserName]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;although, the error that led us to the solution was this little fella&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&quot;the required anti-forgery cookie __requestverificationtoken is not present&quot;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;It turns out that we had marked the cookies as secure (as we all should) with the configuration setting&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: grey; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: #569cd6; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;system.web&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: grey; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: #569cd6; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;httpCookies&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: grey; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: #92caf4; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;requireSSL&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: grey; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;=&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: #c8c8c8; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;true&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: grey; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;&quot; /&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: #569cd6; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;system.web&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: black; color: grey; font-family: Consolas; mso-ansi-language: EN-US; mso-highlight: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: grey; font-family: Consolas; mso-ansi-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;But we were accessing the site with http. So the real underlying error was that last one, “the required anti-forgery cookie __requestverificationtoken is not present”. The site was requesting secure anti-forgery cookies but was getting standard unsecure cookies, thus the tampering exception&lt;br /&gt;&lt;br /&gt;The solution, query the site with https or change the setting to requireSSL=”false”</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/3979310135310508978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/06/offline-can-not-save-episerver-7x.html#comment-form' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/3979310135310508978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/3979310135310508978'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/06/offline-can-not-save-episerver-7x.html' title='Offline, can not save EPiServer 7.x'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ZJ8WAXw1-O4/VYwGgZP56zI/AAAAAAAAV9k/6uIc8roguOs/s72-c/offline_cannot_save.png" height="72" width="72"/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-8277852630272970974</id><published>2015-06-01T09:40:00.002+02:00</published><updated>2015-06-01T09:47:52.684+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer Digital Experience Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer DXC"/><category scheme="http://www.blogger.com/atom/ns#" term="ExactTarget"/><category scheme="http://www.blogger.com/atom/ns#" term="Hubspot"/><category scheme="http://www.blogger.com/atom/ns#" term="Marketo"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Dynamics"/><category scheme="http://www.blogger.com/atom/ns#" term="Pardot"/><category scheme="http://www.blogger.com/atom/ns#" term="Salesforce Marketing Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="Salesforce Sales Cloud"/><title type='text'>EPiServer Digital Experience Cloud nyheterna</title><content type='html'>&lt;a href=&quot;http://www.episerver.se/cloud-platform/new-features/&quot;&gt;EPiServer Digital Experience Cloud&lt;/a&gt; DXC avtäcktes i slutet i förra veckan. Den nya paketeringen av EPiServer CMS, kundupplevelsehantering, digital marknadsföring och e-handel är riktad mot den nya tidens sälj- och marknadsinriktade organisationer som senaste året lärt sig utnyttja molnet för fördelar som enkel upprättning, flexibel skalbarhet och agil hantering av nya behov hos sina kunder.&lt;br /&gt;&lt;br /&gt;Plattformen som tjänst erbjuds numera i pakteringar riktade sig mot de fyra målgrupperna:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Professional&lt;/li&gt;&lt;li&gt;Group&lt;/li&gt;&lt;li&gt;Corporate och&amp;nbsp;&lt;/li&gt;&lt;li&gt;Enterprise&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Integrationsmotorn Digital Experience Hub (DXH) ingår numera i produkten och kopplar an till system som Marketo, Salesforce Marketing Cloud (ExactTarget), Microsoft Dynamics CRM, Google Universal Analytics, Hubspot och Salesforce Sales Cloud (Pardot).&lt;br /&gt;&lt;br /&gt;Dessutom finns omfattande förbättringar inom Content Staging samt Content collaboration för effektivare samarbete kontor världen över.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.nansen.com/sv/kontakta-oss/&quot;&gt;Hör gärna av er om&lt;/a&gt; ni är intresserade av att veta mer om den nya plattformen.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-9ZuIoORtbn0/VWwL-KzrtGI/AAAAAAAALv4/RscjzOK0b6E/s1600/marketing-empowerment.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;287&quot; src=&quot;http://1.bp.blogspot.com/-9ZuIoORtbn0/VWwL-KzrtGI/AAAAAAAALv4/RscjzOK0b6E/s320/marketing-empowerment.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/8277852630272970974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/06/episerver-digital-experience-cloud.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/8277852630272970974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/8277852630272970974'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/06/episerver-digital-experience-cloud.html' title='EPiServer Digital Experience Cloud nyheterna'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-9ZuIoORtbn0/VWwL-KzrtGI/AAAAAAAALv4/RscjzOK0b6E/s72-c/marketing-empowerment.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-7329145864292968517</id><published>2015-05-20T17:19:00.001+02:00</published><updated>2015-05-21T10:26:00.142+02:00</updated><title type='text'>Getting started with CXM - The User Journey Purchase Loop</title><content type='html'>&lt;b&gt;No one is like the other&amp;nbsp;&lt;/b&gt;&lt;br /&gt;In Sweden four large new pharmacies was founded exactly the same day. The first of July 2009 was the first day when deregulated non-government owned pharmacies was allowed in the country.&lt;br /&gt;&lt;br /&gt;None of the new pharmacies had any time consuming legacy that day. No existing marketing plans, no previous IT-systems setup, specific digital marketing consultancies contracted nor any other general policies guides up and running.&lt;br /&gt;&lt;br /&gt;Not even those four companies, founded at the exact same moment, should try to copy each other’s customer experience strategy.&lt;br /&gt;&lt;br /&gt;Even if two competitors are in the same business, have the same clients, goals and means – successful customer experience management has turned out to be something absolutely unique.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;The management of a customer experience is much more than a market and a product. It boils down to one company’s:&lt;br /&gt;&lt;br /&gt;• General marketing ambitions&lt;br /&gt;• Basic knowledge of analysis&lt;br /&gt;• Will to quickly adapt and..&lt;br /&gt;&amp;nbsp;• Type of contracted and employed staff as well as hierarchies&lt;br /&gt;&lt;br /&gt;However there are some aids to help you get started. Nansen will go through some of them here!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;User Journey Purchase Loop&lt;/b&gt;&lt;br /&gt;The definition of the customer journey has long been looked upon as a good start for Customer Experience strategy definition. One of the second best templates to originate from is the User Journey Purchase Loop.&lt;br /&gt;&lt;br /&gt;A great and modern look into how the purchase process and the decision making steps within a buy rolls out. The sum of all interactions with a customer. Answers when the customers will feel and ask questions like &quot;Be transparent&quot;, &quot;Reward me&quot;, &quot;Make it easy&quot;, Earn my trust&quot; and so on.&lt;br /&gt;&lt;br /&gt;A broad definition, open for each CXM-interested company to adapt and make their own. And once completed possible to plan for, target analytics and KPI:s towards as well as marketing automation. Therefor really useful. Take a look! &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-qeoHrSPM6DM/VVyl1e3J7dI/AAAAAAAALtk/jopakf5K-Kk/s1600/User%2Bjourney%2BPurchase%2BLoop.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;http://4.bp.blogspot.com/-qeoHrSPM6DM/VVyl1e3J7dI/AAAAAAAALtk/jopakf5K-Kk/s640/User%2Bjourney%2BPurchase%2BLoop.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/7329145864292968517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/05/getting-started-withg-cxm-user-journey.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7329145864292968517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7329145864292968517'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/05/getting-started-withg-cxm-user-journey.html' title='Getting started with CXM - The User Journey Purchase Loop'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-qeoHrSPM6DM/VVyl1e3J7dI/AAAAAAAALtk/jopakf5K-Kk/s72-c/User%2Bjourney%2BPurchase%2BLoop.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-4059265186487389938</id><published>2015-05-12T00:13:00.000+02:00</published><updated>2015-05-12T17:01:49.174+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="episerver"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer 7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="globalization"/><title type='text'>Localize Property Name Based on Content Language</title><content type='html'>We recently had a client request that a page property have a different display name for each language branch. &amp;nbsp;The function of the property was as an identifier and would always be used the same in the back end but the editors in each country had a different name for the property.&lt;br /&gt;&lt;br /&gt;This isn&#39;t a particularly inspired solution, but I&#39;m hoping to save someone else the time it took to stumble upon this.&lt;br /&gt;&lt;br /&gt;It is possible to localize EPi property names using the built in Display attribute and keeping the translations in resources files (see this&lt;a href=&quot;http://stackoverflow.com/questions/10893650/apply-localization-through-resource-files-to-displayattribute&quot;&gt; stackoverflow post here&lt;/a&gt;), but this is only based on the UI language in Edit/Admin mode and not on content language.&lt;br /&gt;&lt;br /&gt;I created an &lt;code&gt;EditorDescriptor&lt;/code&gt; that will take the string entered in the Name field and try to translate it using the registered LocalizationService (whatever that may be). &amp;nbsp;An important thing to note is the &lt;code&gt;EditorDescriptorBehavior&lt;/code&gt;. &amp;nbsp;We have to have it as &lt;code&gt;EditorDescriptorBehavior.PlaceLast&lt;/code&gt; to ensure that any other logic to get the Display Name (built in translation, etc) does not interfere with what we want displayed.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Code&lt;/h4&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[EditorDescriptorRegistration(TargetType = typeof(String), UIHint = SiteUIHints.LocalizedDisplay, EditorDescriptorBehavior = EditorDescriptorBehavior.PlaceLast)]&lt;br /&gt;public class LocalizableDisplayEditorDescriptor : EditorDescriptor&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable&amp;lt;Attribute&amp;gt; attributes)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; base.ModifyMetadata(metadata, attributes);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Attribute attr = attributes.FirstOrDefault(a =&amp;gt; a.GetType() == typeof(DisplayAttribute));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (attr != null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string translated = &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ServiceLocator.Current.GetInstance&amp;lt;LocalizationService().GetStringByCulture(metadata.DisplayName,&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FallbackBehaviors.None, ContentLanguage.PreferredCulture);&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!string.IsNullOrWhiteSpace(translated))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; metadata.DisplayName = translated;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;h4&gt;Usage&lt;/h4&gt;&lt;div&gt;&lt;code&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; [UIHint(SiteUIHints.LocalizedDisplay)]&lt;br /&gt; [Display(Name = &quot;/properties/InternalId/displayname&quot;, Order = 200)]&lt;br /&gt; public virtual string InternalId { get; set; }&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/4059265186487389938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/05/localize-property-name-based-on-content.html#comment-form' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/4059265186487389938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/4059265186487389938'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/05/localize-property-name-based-on-content.html' title='Localize Property Name Based on Content Language'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-7844211484835212676</id><published>2015-04-27T17:46:00.000+02:00</published><updated>2015-04-28T10:31:10.233+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Chrome"/><category scheme="http://www.blogger.com/atom/ns#" term="infrastructure"/><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL"/><title type='text'>Web site infrastructure security</title><content type='html'>&lt;div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Google Chrome has started to show sites that still uses the old SHA-1 cipher as not verified. &amp;nbsp;&lt;a href=&quot;https://support.servertastic.com/deprecation-of-sha1-and-moving-to-sha2/&quot;&gt;https://support.servertastic.com/deprecation-of-sha1-and-moving-to-sha2/&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-jOhwvjp8zow/VT5XIzdv3tI/AAAAAAAAVNQ/8OzUoC3tQb0/s1600/SSL.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-jOhwvjp8zow/VT5XIzdv3tI/AAAAAAAAVNQ/8OzUoC3tQb0/s1600/SSL.png&quot; /&gt;&lt;/a&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype  id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot;  path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt; &lt;v:stroke joinstyle=&quot;miter&quot;/&gt; &lt;v:formulas&gt;  &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 1 0&quot;/&gt;  &lt;v:f eqn=&quot;sum 0 0 @1&quot;/&gt;  &lt;v:f eqn=&quot;prod @2 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 0 1&quot;/&gt;  &lt;v:f eqn=&quot;prod @6 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;sum @8 21600 0&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @10 21600 0&quot;/&gt; &lt;/v:formulas&gt; &lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;/&gt; &lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;/&gt;&lt;/v:shapetype&gt;&lt;v:shape id=&quot;Picture_x0020_1&quot; o:spid=&quot;_x0000_i1025&quot; type=&quot;#_x0000_t75&quot;  alt=&quot;&quot; style=&#39;width:150pt;height:30pt&#39;&gt; &lt;v:imagedata src=&quot;file:///C:\Users\kalhop\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg&quot;   o:href=&quot;cid:image001.jpg@01D080F1.1FA7D1F0&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sites with SSL certificates that expire before January 1, 2016 won’t be affected, but sites with certificates that expire later will need to have their certificates reissued.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background: white; line-height: 18.0pt; margin-bottom: 18.0pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 10.0pt; mso-ansi-language: EN-US;&quot;&gt;“&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #383838; font-family: &amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 10.0pt; mso-ansi-language: EN-US;&quot;&gt;Early 2015 –&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #383838; font-family: &amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 10.0pt; mso-ansi-language: EN-US;&quot;&gt;Chrome 41:&amp;nbsp;Sites with end-entity certificates that expire between 1 January 2016 and 31 December 2016 (inclusive), and which include a SHA1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;background: white; line-height: 18.0pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #383838; font-family: &amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 10.0pt; mso-ansi-language: EN-US;&quot;&gt;Sites with end-entity certificates that expire on or after 1 January 2017, and which include a SHA1-based signature as part of the certificate chain, will be treated as “affirmatively insecure”. Subresources from such domain will be treated as “active mixed content”.&amp;nbsp;The current visual display for “affirmatively insecure” is a lock with a red X, and a red strike-through text treatment in the URL scheme.”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;background: white; line-height: 18.0pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #383838; font-family: &amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 10.0pt; mso-ansi-language: EN-US;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;Last month we had an issue with a customer site regarding this issue and some others more concerning issues. It all started as the customer had some unwanted publicity when the site was rated F by the ssllabs validation tool. It turns out that the infrastructure guys had missed was to turn on TLS 2.0 support and to disable the SSL V1-V3 and RC4 cipher on the web front servers and for the load balancers that terminates the SSL traffic. Along with a weak SSL certificate that uses SHA-1. This was bad news, but also things that where very easily fixed and the customer is at a considerable better, A- rating.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;The remedies for this is to&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Disable SSL V1, V2 and V3 &lt;a href=&quot;https://www.sslshopper.com/article-how-to-disable-ssl-2.0-in-iis-7.html&quot;&gt;https://www.sslshopper.com/article-how-to-disable-ssl-2.0-in-iis-7.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Disable RC4 Cipher (same link)&lt;/li&gt;&lt;li&gt;Upgrade your SSL certificate to use the SHA-2 cipher.&lt;/li&gt;&lt;li&gt;If possible use DNS-SEC&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There are more things you can do proactively to protect your sites. Some things must be dealt by the IT org. but some things can be done on the servers.&lt;br /&gt;&lt;br /&gt;Check out this links:&lt;br /&gt;&lt;h4&gt;PEN test your site&lt;/h4&gt;&lt;h4&gt;&lt;a href=&quot;https://asafaweb.com/&quot;&gt;https://asafaweb.com/&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;Other PEN testing tools&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Category:Penetration_Testing_Tools&quot;&gt;https://www.owasp.org/index.php/Category:Penetration_Testing_Tools&lt;/a&gt;&lt;/div&gt;&lt;h4&gt;PEN test the infrastructure&lt;/h4&gt;&lt;a href=&quot;https://www.ssllabs.com/ssltest/analyze.html&quot;&gt;https://www.ssllabs.com/ssltest/analyze.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pluralsight.com/courses/owasp-top10-aspdotnet-application-security-risks&quot;&gt;http://www.pluralsight.com/courses/owasp-top10-aspdotnet-application-security-risks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;OWASP&lt;/h3&gt;Is a great resource for web security. Here you can find almost everything you&#39;l ever need regarding web security.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cheat sheet&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet&quot;&gt;https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;And &lt;a href=&quot;http://www.troyhunt.com/&quot; target=&quot;_blank&quot;&gt;Troy Hunt&lt;/a&gt; has a great Plurar sigth course, top 10 ASP.NET list to check&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pluralsight.com/courses/owasp-top10-aspdotnet-application-security-risks&quot;&gt;http://www.pluralsight.com/courses/owasp-top10-aspdotnet-application-security-risks&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;This is how you disable exessivve response headers&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.troyhunt.com/2012/02/shhh-dont-let-your-response-headers.html&quot;&gt;http://www.troyhunt.com/2012/02/shhh-dont-let-your-response-headers.html&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;background: white;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;system.web&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;background: white;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;httpRuntime &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: red; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;enableVersionHeader&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;=&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #393939; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;false&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #393939; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&quot; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;background: white;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;system.web&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt; mso-ansi-language: EN-US;&quot;&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;The MVC version is also easy, although it does require us to touch code. Over in the Global.asax, we want to jump into the Application_Start event and add the following:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;background: white;&quot;&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt;&quot;&gt;MvcHandler&lt;/span&gt;&lt;span style=&quot;color: #393939; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt;&quot;&gt;.DisableMvcResponseHeader = &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #393939; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.0pt;&quot;&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;I hope these tips can help you get a more secure site.&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/7844211484835212676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/04/web-site-infrastructure-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7844211484835212676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/7844211484835212676'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/04/web-site-infrastructure-security.html' title='Web site infrastructure security'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-jOhwvjp8zow/VT5XIzdv3tI/AAAAAAAAVNQ/8OzUoC3tQb0/s72-c/SSL.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-1248732656805695258</id><published>2015-03-31T04:16:00.002+02:00</published><updated>2015-03-31T22:19:57.970+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="episerver"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer 7"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer 7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="Initialization Module"/><title type='text'>EPi Initialization Modules: A Practical Guide</title><content type='html'>&lt;div&gt;If you&#39;ve been working with EPi 7 or 7.5 (or even 8 for you early adopters), you&#39;ve most likely created an initialization module. &amp;nbsp;For a thorough introduction, &lt;a href=&quot;http://world.episerver.com/documentation/Items/Developers-Guide/EPiServer-CMS/75/Initialization/Initialization/&quot;&gt;this link &lt;/a&gt;is a good resource. While they are really extensible, I&#39;ve run into a few hiccups during development and would like to share some (hopefully) time saving tips.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Debugging&lt;/h4&gt;&lt;div&gt;Debugging has proven to be quite a headache for me whenever I create an initialization module since I don&#39;t do it very often and always forget how I was able to do it the last time. Since you need to be attached to the debugger while the site is initializing, many common forms of debugging don&#39;t work very well (if you are using traditional IIS and not IIS Express). I&#39;ve seen a couple blog posts on this topic, but none have worked for me (because it&#39;s for an older version of EPi or because it recycles the whole app pool). &amp;nbsp; &lt;br /&gt;&lt;br /&gt;Here is the easiest way I&#39;ve found to quickly and easily debug my initialization modules:&lt;br /&gt;&lt;br /&gt;1. In your Initialization module, add this line where you would like the debugger to break&lt;br /&gt;&lt;br /&gt;&lt;code&gt;System.Diagnostics.Debugger.Break();&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;2. Using Visual Studio&#39;s Debug &amp;gt; Attach to Process menu, attach to all of the w3wp processes. &amp;nbsp;This makes sure that you are still attached to the process running the initialization even when you restart the site in the next step.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ECqANtsZ2BQ/VRn_U90nPQI/AAAAAAAAABw/GXnGMsMoiAg/s1600/Capture.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-ECqANtsZ2BQ/VRn_U90nPQI/AAAAAAAAABw/GXnGMsMoiAg/s1600/Capture.PNG&quot; height=&quot;313&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3. In IIS, restart the website you&#39;d like to initialize&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-AlXUp2Gst1Y/VRn_q6TE7UI/AAAAAAAAAB4/beRrIUBUhGs/s1600/Capture-1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-AlXUp2Gst1Y/VRn_q6TE7UI/AAAAAAAAAB4/beRrIUBUhGs/s1600/Capture-1.PNG&quot; height=&quot;320&quot; width=&quot;125&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You should see your break point hit and be able to debug your initialization module now. &amp;nbsp;If you know a better way to accomplish this, please let me know in the comments! This has been the simplest solution I&#39;ve found.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;InitComplete&lt;/h4&gt;&lt;/div&gt;In EPi&#39;s documentation, they mention that the InitComplete event&#39;s &quot;typical use case (also featured in EPiServer Community) is to attach event handlers to an instance property that may be overridden by third-party code.&quot;&lt;br /&gt;&lt;br /&gt;Another use case for InitComplete is if you need to access the Start page of your site or any other site specific properties. &amp;nbsp;These are only available after the site has been initialized. &lt;br /&gt;&lt;br /&gt;One &quot;gotcha&quot; to keep in mind, is that you must have the wild card site binding in order for the initialization module to properly find your Start Page. &amp;nbsp;Otherwise, &lt;code&gt;ContentReference.StartPage&lt;/code&gt; returns an empty content reference.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-pCI3XQnFWgU/VRoDcUA3nrI/AAAAAAAAACE/DvxqfVuvAO4/s1600/Capture-2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-pCI3XQnFWgU/VRoDcUA3nrI/AAAAAAAAACE/DvxqfVuvAO4/s1600/Capture-2.PNG&quot; height=&quot;72&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Do you know of any other tips when developing initialization modules? Let me know in the comments!</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/1248732656805695258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/03/epi-initialization-modules-practical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1248732656805695258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1248732656805695258'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/03/epi-initialization-modules-practical.html' title='EPi Initialization Modules: A Practical Guide'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ECqANtsZ2BQ/VRn_U90nPQI/AAAAAAAAABw/GXnGMsMoiAg/s72-c/Capture.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-1729084373417400603</id><published>2015-03-30T11:29:00.001+02:00</published><updated>2015-03-31T16:56:47.632+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="agile marketing"/><category scheme="http://www.blogger.com/atom/ns#" term="best practice"/><category scheme="http://www.blogger.com/atom/ns#" term="digital marketing"/><category scheme="http://www.blogger.com/atom/ns#" term="episerver"/><category scheme="http://www.blogger.com/atom/ns#" term="innovation"/><category scheme="http://www.blogger.com/atom/ns#" term="marketing"/><category scheme="http://www.blogger.com/atom/ns#" term="progress"/><title type='text'>How agile is reviving the marketing industry</title><content type='html'>&lt;span class=&quot;s1&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;&lt;b&gt;&quot;Best practice&quot; has been a mantra that many in the marketing industry have depended on over the last few years.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Helvetica Neue&#39;, Arial, Helvetica, sans-serif;&quot;&gt;On first glance it makes sense: sticking to what has - in the past - been proven to yield the most effective results seems like a guaranteed strategy for future success.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;But “past” is the key word. Progress requires that we make new discoveries - and if we always do what we have done in the past, the future will look very similar.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;For outstanding success going forward, we need to find new ways of doing things; we need to forge solutions, not follow them.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;b style=&quot;font-family: &#39;Helvetica Neue&#39;, Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b style=&quot;font-family: &#39;Helvetica Neue&#39;, Arial, Helvetica, sans-serif;&quot;&gt;This is not going to be achieved by following best practice.&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.episerver.com/agile-marketing?utm_source=Partner&amp;utm_medium=Referral&amp;utm_campaign=Agile%20vs%20Best%20Practice&amp;utm_content=NansenChicago&quot;&gt;EPiServer explains here why agile marketing is the wake-up call that all marketers have been waiting for&lt;/a&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;356&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://www.slideshare.net/slideshow/embed_code/42346660&quot; style=&quot;border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;427&quot;&gt; &lt;/iframe&gt; &lt;/div&gt;&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;&quot;&gt;&lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/secret/bbosSWYWsa6MZk&quot; target=&quot;_blank&quot; title=&quot;Why Best Practice is Killing Marketing Rant | EPiServer&quot;&gt;Why Best Practice is Killing Marketing Rant | EPiServer&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/Episerver&quot; target=&quot;_blank&quot;&gt;EPiServer&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/1729084373417400603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/03/how-agile-is-reviving-marketing-industry.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1729084373417400603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1729084373417400603'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/03/how-agile-is-reviving-marketing-industry.html' title='How agile is reviving the marketing industry'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-2290851330003314612</id><published>2015-03-16T09:56:00.001+01:00</published><updated>2015-03-16T11:18:20.766+01:00</updated><title type='text'>Wintercamp II – Day 1, arriving</title><content type='html'>&lt;div class=&quot;p1&quot;&gt;The second Wintercamp took place at Koppars on the 11-14 march 2015.&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;Feedback from last years’ Wintercamp was that we should decide and prepare some themes and projects prior to going up to Koppars.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;So, when we, the 20 people from the Chicago, Stockholm, and London offices drove up to Koppars, there were six themes pre-baked and everyone felt roughly prepared for what was going to take place.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-RQOVAhk555Q/VQaFiKS_yRI/AAAAAAAAAVA/yJKCfrfjjA4/s1600/IMG_5600.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-RQOVAhk555Q/VQaFiKS_yRI/AAAAAAAAAVA/yJKCfrfjjA4/s1600/IMG_5600.JPG&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;The idea behind Wintercamp is to unite people from all the offices and create, code, build, write, hang out, cook, and spend some time together outside of client projects.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;There are no rules except&amp;nbsp;:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;1. We do Wintercamp stuff from 09.00-17.00 - even though it was really hard to get people away from the keyboards before 20.00 sometimes :-)&lt;/li&gt;&lt;li&gt;2. We do a short demo of the progress each day at 17.00.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;We arrived at Koppars just outside Järvsö. The place is at the shore of river Ljusnan and consists of one main building and a few smaller. Once settled in we started off with lunch, a brief intro to all the themes.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-H9uHPNj4oOw/VQaGf-jUAgI/AAAAAAAAAVI/NtFj8bW3Z0s/s1600/IMG_5609.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-H9uHPNj4oOw/VQaGf-jUAgI/AAAAAAAAAVI/NtFj8bW3Z0s/s1600/IMG_5609.JPG&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Koppars is located just next to the Ljusnan river and it&#39;s a beautiful place in the wintertime.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-hd5HJk-vWRE/VQaGlCu0lKI/AAAAAAAAAVQ/07GShktPUHQ/s1600/IMG_5611.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-hd5HJk-vWRE/VQaGlCu0lKI/AAAAAAAAAVQ/07GShktPUHQ/s1600/IMG_5611.JPG&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Lunchtime day one.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-O9xGIWsDM7Q/VQaGtWCiuQI/AAAAAAAAAVY/6ptwvulU2xo/s1600/IMG_5614.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-O9xGIWsDM7Q/VQaGtWCiuQI/AAAAAAAAAVY/6ptwvulU2xo/s1600/IMG_5614.JPG&quot; height=&quot;640&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Theme briefing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;This is the pre-defined themes we wanted to dive deeper into at the wintercamp:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;s2&quot;&gt;New &lt;a href=&quot;http://nansen.com/&quot;&gt;&lt;span class=&quot;s3&quot;&gt;Nansen.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-mq9Uai2jfWo/VQaHhleQO3I/AAAAAAAAAVg/XMoaEYjI1Y0/s1600/IMG_5630.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-mq9Uai2jfWo/VQaHhleQO3I/AAAAAAAAAVg/XMoaEYjI1Y0/s1600/IMG_5630.JPG&quot; height=&quot;300&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Initial wireframe for the news Nansen.com&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This is the big one! It’s the most demanding theme since it will be the replacement of the current Nansen site that has existed for three years.&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;The goal was to leave Koppars with very, very well worked version 0.96 of the site. Everything had to be created from scratch.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;s1&quot;&gt;GUI for Blueprint prototype tool&lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;p2&quot;&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-CtRgBof47BA/VQaHu4sYP8I/AAAAAAAAAVo/NPspqA4q7r4/s1600/IMG_5623.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-CtRgBof47BA/VQaHu4sYP8I/AAAAAAAAAVo/NPspqA4q7r4/s1600/IMG_5623.JPG&quot; height=&quot;400&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Proof of concept for the prototyping GUI is built in Umbraco.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Last year we refined and continued to build upon our prototype framework Blueprint. It is now in such a mature state that we have decided to try to build a graphical interface for it so that we UX:ers and designers can create prototypes without having to touch HTML and CSS.&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;s1&quot;&gt;NAPC 2015 conference app&lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-4q_FB8CRFOs/VQaKeVRQi5I/AAAAAAAAAWE/kgOywKJzof8/s1600/11053074_865366643504685_2535854630677244455_o.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-4q_FB8CRFOs/VQaKeVRQi5I/AAAAAAAAAWE/kgOywKJzof8/s1600/11053074_865366643504685_2535854630677244455_o.jpg&quot; height=&quot;300&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Photo-feed in the NAPC conferance app.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This is a theme initiated by the Chicago office. The idea is to dive into Xamarin, a framework where you build native apps for iOS, Android, Mac, and Windows, and build an app for our yearly internal Nansen NAPC conference. This year the conferance will be held in Chicago and will include staff from all our offices; Stockholm, London, New York and Chicago. The app will house travel information, speaker/session schedules, photo-stream so that the attendees can get the most out of the conferance.&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;s1&quot;&gt;Create templates for our new PRINCE2 project management process&lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;p2&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-k0RFqpj84oE/VQaJmxB0a3I/AAAAAAAAAV8/HiqH8npQ4rU/s1600/IMG_5617.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-k0RFqpj84oE/VQaJmxB0a3I/AAAAAAAAAV8/HiqH8npQ4rU/s1600/IMG_5617.JPG&quot; height=&quot;400&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The project management team has been working with our new project process Nansen NEXT. We are integrating the PRINCE2 project methodology with the agile development process. The work involves creating project management templates, and defining which work is done when.&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;s1&quot;&gt;&quot;Concept&quot; section for our client preview area&lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;p2&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-zkHirsa2uis/VQaIa4aYySI/AAAAAAAAAVw/mEOgmg6xew4/s1600/IMG_5626.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-zkHirsa2uis/VQaIa4aYySI/AAAAAAAAAVw/mEOgmg6xew4/s1600/IMG_5626.JPG&quot; height=&quot;300&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We have a &lt;a href=&quot;http://preview.nansen.com/&quot;&gt;&lt;span class=&quot;s4&quot;&gt;Preview.nansen.com&lt;/span&gt;&lt;/a&gt; domain where our clients can login and access the visual design and prototypes that we build for them. But one thing that has been missing is a section where we can summarize concept and strategy for the clients projects. Goal is to get this in place.&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;span class=&quot;s1&quot;&gt;Automatic style guides&lt;/span&gt;&lt;/h4&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-EUgA3ctRXg4/VQaLRbt-lSI/AAAAAAAAAWM/2IhrhxyT1Ow/s1600/IMG_5700.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-EUgA3ctRXg4/VQaLRbt-lSI/AAAAAAAAAWM/2IhrhxyT1Ow/s1600/IMG_5700.JPG&quot; height=&quot;300&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;We all love style guides! In a few projects we have drafted a style guide tool that automatically generates them for us from our LESS, SASS, or CSS files. At this Wintercamp it was time to refactor it, structure it a bit more seriously and integrate it more deeply with our Preview-area and the Blueprint framework. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/2290851330003314612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/03/wintercamp-ii-day-1-arriving.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/2290851330003314612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/2290851330003314612'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/03/wintercamp-ii-day-1-arriving.html' title='Wintercamp II – Day 1, arriving'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-RQOVAhk555Q/VQaFiKS_yRI/AAAAAAAAAVA/yJKCfrfjjA4/s72-c/IMG_5600.JPG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-8295760015552276024</id><published>2015-03-13T16:45:00.001+01:00</published><updated>2015-03-13T16:45:07.301+01:00</updated><title type='text'>Digital consumers don&#39;t experience what we expect</title><content type='html'>A new eConsultancy Digital marketing report about what consumers find really important online vs. what we as an agency finds important contained some groundbreaking facts.&lt;br /&gt;&lt;br /&gt;Our view of the consumers’ digital experience doesn&#39;t always correlate with their own.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/--ppI42y8GAw/VQME3h4uNqI/AAAAAAAALrM/hAMZ0cVXU44/s1600/econsultancy.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/--ppI42y8GAw/VQME3h4uNqI/AAAAAAAALrM/hAMZ0cVXU44/s1600/econsultancy.JPG&quot; height=&quot;253&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Especially the -70% factor regarding how consumers request &quot;information about your account&quot; support and the -65% difference regarding the importance of &quot;account details&quot; is remarkable. Integrity aside, a digital solution never seems to become too relevant for users. Worth keeping in mind.&lt;br /&gt;&lt;br /&gt;Also, the 106% difference between &quot;social touch points&quot;, the 72% on a tablet and the 128% smartphone are interesting numbers.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The report featured 1500 respondents and was published in February2015.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/8295760015552276024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/03/digital-consumers-dont-experience-what.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/8295760015552276024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/8295760015552276024'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/03/digital-consumers-dont-experience-what.html' title='Digital consumers don&#39;t experience what we expect'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/--ppI42y8GAw/VQME3h4uNqI/AAAAAAAALrM/hAMZ0cVXU44/s72-c/econsultancy.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-1560524791308458070</id><published>2015-03-13T14:35:00.001+01:00</published><updated>2015-03-13T14:35:26.686+01:00</updated><title type='text'>Vi är överallt, iallafall i Järvsö, Vemdalen och Austin Texas</title><content type='html'>Det händer otroligt mycket hos oss just nu. Inte bara när det gäller kunder och projekt.&lt;br /&gt;Här på Nansen så försöker vi, förutom att koka riktigt bra webb, även att ha kul tillsammans och även vidareutveckla oss. Så vad händer just nu då undrar ni?&lt;br /&gt;&lt;br /&gt;Vi skyfflat iväg 22 personer, från våra kontor i London, Chicago och Stockholm, till vår årliga wintercamp uppe på gården &lt;a href=&quot;http://www.koppars.se/Koppars/Hem.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Koppars&lt;/a&gt; i Järvsö. Där är tanken att vi ska skapa en massa nyttiga och coola verktyg, proccesser och material som vi använder i vår dagliga verksamhet.&lt;br /&gt;Grejer som tex vårt prototypverktyg Blueprint och vår plattform Encore filas det på. Saker som våra kunder får nytta av i våra projekt sen. Men även interna grejer tas fram.&lt;br /&gt;Följ hasthtaggen #napc på &lt;a href=&quot;https://twitter.com/hashtag/NAPC?src=hash&quot; target=&quot;_blank&quot;&gt;twitter&lt;/a&gt; och &lt;a href=&quot;https://www.facebook.com/hashtag/napc&quot; target=&quot;_blank&quot;&gt;facebook&lt;/a&gt; för massa fina bilder och intressanta posts från wintercampen!&lt;br /&gt;&lt;br /&gt;Vi har även ett gäng sköningar som är uppe och åker skidor och bräda i Vemdalen denna helg. 10 vintersportare intryckta i en trevlig stuga. De kanske inte producerar en massa coola verktyg, men de bygger väl nån slags broar tillsammans...who knows?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.facebook.com/markus.bereflod&quot; target=&quot;_blank&quot;&gt;Markus Bereflod&lt;/a&gt; och &lt;a href=&quot;https://www.facebook.com/jgrause&quot; target=&quot;_blank&quot;&gt;Joe Grause&lt;/a&gt; från vårt chicagokontor är just nu iväg på &lt;a href=&quot;http://sxsw.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;SXSW&amp;nbsp;Interactive&lt;/a&gt; i Austing, Texas. &lt;br /&gt;&lt;br /&gt;Vi andra som inte åker nerför pisten i Vemdalen, är på wintercamp i Järvsö eller konferensar i Austin Texas håller ställningarna här hemma. Jag köpte iaf glass till oss som var kvar här på kontoret och faktiskt såg till att det kokades lite webb åt alla våra kunder.&lt;br /&gt;&lt;br /&gt;/Rudde</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/1560524791308458070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/03/vi-ar-overallt-iallafall-i-jarvso.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1560524791308458070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1560524791308458070'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/03/vi-ar-overallt-iallafall-i-jarvso.html' title='Vi är överallt, iallafall i Järvsö, Vemdalen och Austin Texas'/><author><name>rewdboy</name><uri>http://www.blogger.com/profile/16710163854461568277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos-g.ak.facebook.com/photos-ak-sf2p/v113/80/89/593697311/n593697311_281398_1404.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-262981607872436251</id><published>2015-02-13T12:08:00.001+01:00</published><updated>2015-02-13T12:19:12.329+01:00</updated><title type='text'> Så börjar allt arbete med CXM, kundupplevelsen. Praktiska exempel från Nansen</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-BLQDnW6fvNs/VN3Z7ofmizI/AAAAAAAALpI/wLPEPQUYGas/s1600/tumblr_n7y79zTlMp1qz6f9yo1_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-BLQDnW6fvNs/VN3Z7ofmizI/AAAAAAAALpI/wLPEPQUYGas/s1600/tumblr_n7y79zTlMp1qz6f9yo1_1280.jpg&quot; height=&quot;320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;På Nansen fick vi den första förfrågningen om att föreläsa och om kundupplevelser, &lt;a href=&quot;http://en.wikipedia.org/wiki/Customer_experience&quot;&gt;Customer Experiences&lt;/a&gt; eller CXM redan för 3 år sedan. Sedan dess har vi dissekerat ämnet på &lt;a href=&quot;https://vimeo.com/116635295&quot;&gt;Webbdagarna&lt;/a&gt;, Hyper Island och Berghs samt skrivit &lt;a href=&quot;http://www.resume.se/nyheter/debatt/2014/06/19/sluta-re-designa-sluta-handla-upp/&quot;&gt;krönikor i Resumé&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Än idag tolkas den välanvända akronymen på helt nya sätt. Synen på vad som ingår i hanteringen av en digital och fysisk kundupplevelse förändras. Så må vara, det är ett brett begrepp och praktiska tillämpningar är fortfarande ovanliga både i Sverige och internationellt.&lt;br /&gt;&lt;br /&gt;Men efter att jobbat med CXM för Telia.se, Electrolux och många fler av våra kunder har vi några handfasta tips att bjuda på.&lt;br /&gt;&lt;br /&gt;Samt en absolut grundregel:&lt;i&gt; Vet ni inte - så vet ni inte.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Det finns ingen CXM-checklista. Det finns inget färdigt CXM-paket. Inte ens något definitiva fakta framtagna för er bransch.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;På pappret kan ni vara väldigt lika er närmsta konkurrent. Sett till omsättning, målgruppsfokus och geografisk spridning. Men ändå så är ni ändå inte det.&lt;br /&gt;&lt;br /&gt;Ni har helt olika hierarkiska organisationer, olika system, olika säkerhetspolicies och olika syn på hur projekt ska drivas. Det gör att ni inte kommer veta hur ni ska få de olika digitala delarna med innehåll, kommers, analys, befintliga och nya data samt alla kopplingar dessa emellan att fungera. Inte innan ni faktiskt testat.&lt;br /&gt;&lt;br /&gt;Det finns bara ett sätt att påbörja ett CXM-arbete. &lt;b&gt;Genom att starta någonstans.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tänk er en tårtbit. Ett tvärsnitt rakt in på er webbplats. Där hittar ni på sidnivå två eller tre en relativt viktig sida med en typ av konvertering. Kanske ett köpavslut eller ett formulär ska ska fyllas i. Utgå från den. Bygg in profilering med CRM-kopplingar, marketing automation triggers, tät analys, A/B-test och få in alla e-handelskopplingar till just den sidan. Bara den.&lt;br /&gt;&lt;br /&gt;Sedan väntar ni. Sedan analyserar ni. Sedan förbättrar ni. Sedan börjar ni om. Sedan för ni ut erhållna kunskaper på fler sidor, kanske en nivå upp i trädet. Mät igen. Förbättra igen osv.&lt;br /&gt;&lt;br /&gt;Några månader fram kallar ni till ett ledningsmöte och redovisar alla resultat. Därefter kommer ni finna er i en situation där ni både får medel, all teknisk tillgång och framförallt beslutsrätten att välja ett system framför ett annat inom organisationens tekniska stack.&lt;br /&gt;&lt;br /&gt;Men börja med mandatet att förändra just den där sidan på nivå två eller tre. &lt;a href=&quot;http://nansen.com/en/contact-us/&quot;&gt;Det är så upplevelsearbetet börjar.&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/262981607872436251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/02/sa-borjar-allt-arbete-med-cxm.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/262981607872436251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/262981607872436251'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/02/sa-borjar-allt-arbete-med-cxm.html' title=' Så börjar allt arbete med CXM, kundupplevelsen. Praktiska exempel från Nansen'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-BLQDnW6fvNs/VN3Z7ofmizI/AAAAAAAALpI/wLPEPQUYGas/s72-c/tumblr_n7y79zTlMp1qz6f9yo1_1280.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-1930235817602899533</id><published>2015-02-11T14:46:00.001+01:00</published><updated>2015-02-11T14:46:22.145+01:00</updated><title type='text'>Fyra nya GAIQ!</title><content type='html'>&lt;a href=&quot;http://analytics-school.com/wp-content/uploads/2013/06/gaiq-certified.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://analytics-school.com/wp-content/uploads/2013/06/gaiq-certified.jpg&quot; height=&quot;157&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #141823; font-family: Helvetica, Arial, &#39;lucida grande&#39;, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;Grattis till Tove, Jens, Robert och Steve som igår tog certet Google Analytics Individual Qualification, &lt;a href=&quot;https://support.google.com/analytics/answer/3424287?hl=en&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;GAIQ&lt;/a&gt;. Nansen har nu totalt 13 stycken certifierade GAIQs.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #141823; font-family: Helvetica, Arial, &#39;lucida grande&#39;, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #141823; font-family: Helvetica, Arial, &#39;lucida grande&#39;, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;a href=&quot;https://www.facebook.com/NansenStockholm/photos/a.196664623729198.50480.130806300315031/877995198929467/?type=1&amp;amp;permPage=1&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Läs mer här på vår facebooksida&lt;/a&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/1930235817602899533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2015/02/fyra-nya-gaiq.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1930235817602899533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/1930235817602899533'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2015/02/fyra-nya-gaiq.html' title='Fyra nya GAIQ!'/><author><name>rewdboy</name><uri>http://www.blogger.com/profile/16710163854461568277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos-g.ak.facebook.com/photos-ak-sf2p/v113/80/89/593697311/n593697311_281398_1404.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-6279733119455680702</id><published>2014-12-09T11:45:00.001+01:00</published><updated>2014-12-11T15:02:02.026+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="episerver"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer CMS"/><title type='text'>New ownership at EPiServer - how will it affect your organisation?</title><content type='html'>&lt;a href=&quot;http://www.nansen.com/en/how-we-do-it/partner-network/episerver/&quot;&gt;EPiServer&lt;/a&gt; today officially announces new ownership. The US private equity firm Accel-KKR will be taking over the formerly Swedish owned company.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-udInbvT3n6g/VIbUeXl1v9I/AAAAAAAALnM/haRfn8OMR1Q/s1600/Epipicture.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-udInbvT3n6g/VIbUeXl1v9I/AAAAAAAALnM/haRfn8OMR1Q/s1600/Epipicture.jpg&quot; height=&quot;208&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With the change of ownership, EPiServer will inherit a new portfolio of similar technology companies. Most notably, EPiServer’s former competitor Ektron CMS has also been taken over by Accel-KKR. So what does this new ownership mean for EPiServer clients?&lt;br /&gt;&lt;br /&gt;Initially, very little will change. First of all, clients&#39; concerns about the deal will be addressed and reconciled through several user studies.&lt;br /&gt;&lt;br /&gt;It will also take some time before the new American or European sales offering gets to a serious stage, and it’s unlikely that the new owners will try to push the new products onto existing customers. There are earlier product options for the critical evaluation platform, and the owners will acknowledge this.&lt;br /&gt;&lt;br /&gt;But on paper the deal makes great business sense for everyone. Ektron is affordable with a strong American base (around 3,000 active customers), while EPiServer is high on innovation and has a strong market in Europe. There are no direct technical collisions, so there is nothing to suggest that there will be problems or clashes ahead. Both systems are based on the Microsoft .NET environment and are similar in terms of cloud connectors and architecture.&lt;br /&gt;&lt;br /&gt;As a client however, you might notice this change of ownership in other ways.&lt;br /&gt;&lt;br /&gt;Investment by EPiServer over the last few years in e-commerce (Media Chase), search technology (SiteSeeker, Trufflr), and collaborations in marketing automation (Silverpop), and DAM (Celum, QBank); has helped create an innovative profile. Compared with the new corporate partner, EPiServer offers a solid digital marketing package with full control of the customer experience. With a new owner, EPiServer products are expected to rank higher than Ektron’s, and EPiServer 7.5 / 8 is expected to be the one on top.&lt;br /&gt;&lt;br /&gt;Ektron also offers services in Persona Management, Marketing Optimization, and Digital Experience; but EPiServer&#39;s portfolio of digital marketing, analysis, testing, and personalization with the associated e-commerce is considered more sophisticated, well-integrated, and technologically advanced.&lt;br /&gt;&lt;br /&gt;EPiServer clients can now take advantage of the clear benefits, with doubled R &amp;amp; D, and marketing and sales support partially controlled by the fast-moving US market. This will also be reflected in Europe, where it will be easy to quickly modify according to new trends and findings.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, sit back, relax, and look forward to an even better, more innovative product content management, marketing support, and e-commerce in 2015. If you have any further concerns about the &quot;new EPiServer”, &lt;a href=&quot;http://www.nansen.com/en/contact-us/&quot;&gt;get in touch with Nansen&lt;/a&gt; and we’ll be happy to answer any questions.</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/6279733119455680702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2014/12/new-ownership-at-episerver-how-will-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/6279733119455680702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/6279733119455680702'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2014/12/new-ownership-at-episerver-how-will-it.html' title='New ownership at EPiServer - how will it affect your organisation?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-udInbvT3n6g/VIbUeXl1v9I/AAAAAAAALnM/haRfn8OMR1Q/s72-c/Epipicture.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-2842154712777058580</id><published>2014-12-09T09:54:00.000+01:00</published><updated>2014-12-09T15:12:15.221+01:00</updated><title type='text'>EPiServer får helt nya ägare, vad betyder det för er som kund?</title><content type='html'>&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;&lt;a href=&quot;http://www.nansen.com/sv/hur-vi-arbetar/teknikpartners/episerver/&quot;&gt;EPiServer&lt;/a&gt; får idag officiellt nya ägare. Amerikanska private equity-bolaget&amp;nbsp;&lt;a href=&quot;http://www.accel-kkr.com/&quot;&gt;Accel-KKR&lt;/a&gt; tar över det tidigare svenskägda bolaget.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-dmG3kpgubDQ/VIa31dXuy_I/AAAAAAAALmw/7NAAiSyqC9Y/s1600/accel-kkr.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-dmG3kpgubDQ/VIa31dXuy_I/AAAAAAAALmw/7NAAiSyqC9Y/s1600/accel-kkr.JPG&quot; height=&quot;203&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;EPiServer hamnar i och med ägarbytet i en ny typ av bolagsportfölj där mer snarlika teknikbolag återfinns. Inte minst den forna konkurrenten Ektron CMS som även de just togs över av Accel-KKR.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Initialt väntas inte affären påverka mycket. Först ska alla partners och kunders kunskap om, och känsla för, affären få tid att smälta in. Och sedan eventuellt stämmas av genom olika användarundersökningar.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Det kommer ta ett tag innan nya amerikanska eller europeiska säljambitioner når hela vägen fram till ett möte och vid det tillfället är det dessutom osäkert om de nya ägarna kommer våga prata om den ena eller andra produkten till alla befintliga kunder. Det finns ett tidigare produktval efter kritisk plattformsutvärdering som de nya ägarna måste respektera.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Men på pappret fungerar verkligen affären, Ett prisvärt Ektron med stark amerikansk bas om 3000 aktiva kunder slås samman med ett innovativt EPiServer starka i Europa. Inte heller finns några direkta tekniska kollisioner som kan orsaka huvudbry för de nya ägarna. Båda systemen bygger på samma Microsoft .NET miljö och är lika varandra sett till molnkopplingar och syn på arkitektur.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;På längre sikt kan ni nuvarande kunder däremot komma att märka av sammanslagningen på andra sätt.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;EPiServers medvetna förvärv inom e-handel (MediaChase), sökteknologi (Siteseeker, Trufflr) och samarbeten inom marketing automation (SilverPop) samt DAM (Celum, Qbank) de senaste åren har hjälpt till att skapa en innovativ profil. Jämfört med nya koncerngrannen erbjuder EPiServer idag ett solitt digital marketing paket med full kontroll av kundupplevelsen. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Hos en ny ägare väntas EPiServers produkter rankas högre än Ektrons. EPiServer 7.5/8 väntas framöver bli vad ägarna tekniskt satsar på.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Ektron erbjuder även de tjänster inom Persona management, Marketing optimization och Digital Experience men EPiServers portfolio inom digital marketing, analys, test, och personalisering med tillhörande e-handel anses mer avancerad, välintegrerad och tekniskt långt kommen.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Kunder till EPiServer får därmed framöver en produktleverantör med fördubblad R&amp;amp;D, marketing och säljstöd delvis kontrollerat från den snabbrörliga, viktiga amerikanska marknaden. Det kommer förhoppningsvis även spegla sig i Europa där vi snabbare kommer få ta del av trendanpassningar och nya rön.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;SV&quot;&gt;Så, ta det lugnt och se fram mot en ännu bättre, mer innovativ produkt för innehållshantering, marknadsstöd och e-handel 2015. Och prata gärna med oss på &lt;a href=&quot;http://www.nansen.com/sv/kontakta-oss/&quot;&gt;Nansen&lt;/a&gt; om ni har ytterligare funderingar om det ”nya EPiServer”.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/2842154712777058580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2014/12/episerver-far-helt-nya-agare-vad.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/2842154712777058580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/2842154712777058580'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2014/12/episerver-far-helt-nya-agare-vad.html' title='EPiServer får helt nya ägare, vad betyder det för er som kund?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-dmG3kpgubDQ/VIa31dXuy_I/AAAAAAAALmw/7NAAiSyqC9Y/s72-c/accel-kkr.JPG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-3288945100878989136</id><published>2014-11-08T16:23:00.002+01:00</published><updated>2014-11-08T16:29:12.003+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="displaytemplates"/><category scheme="http://www.blogger.com/atom/ns#" term="episerver"/><category scheme="http://www.blogger.com/atom/ns#" term="Erik Nilsson"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><title type='text'>Multiple DisplayFor templates in asp.net MVC</title><content type='html'>When working with MVC and display templates I have time and again experienced a shortcoming of the DisplayFor method of rendering objects, or maybe I shouldn&#39;t call it a shortcoming, lets call it a design decision for simplicity: The inability to easily define and use multiple display templates for one model type.&lt;br /&gt;&lt;br /&gt;I work with a CMS, lets call it EPiServer, where a common scenario is that I have a number of different page models, all inheriting a common ancestor. The most basic properties of a page would be a name and its url, a more advanced page could be an article where there is also a image and a preamble. These pages are mixed in the tree structure of my site, and are used in a number of different ways, like in the support navigation at the top of the page, a page listing, or perhaps a sidebar teaser list.&lt;br /&gt;&lt;br /&gt;Above I have already defined three different display templates I want to use when showing information about my pages to the visitor while not visiting the acutal page in where the page controller index method will be used. But MVC does only support one, with a possible local overload in the controller folder: /Views/Shared/DisplayTemplates/MyPageTypeClassName.cshtml.&lt;br /&gt;&lt;h2&gt;First of all&lt;/h2&gt;&lt;br /&gt;Lets recap some ground rules for the display template system used in MVC. Assume you have a data model: &lt;br /&gt;&lt;pre&gt;public class MyItem {&lt;br /&gt;  public string Name { get; set; }&lt;br /&gt;  public string Image { get; set; }&lt;br /&gt;  public string Preamble { get; set; }&lt;br /&gt;  public string Url { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;And in a view model of some sort: &lt;br /&gt;&lt;pre&gt;public class MyViewModel {&lt;br /&gt;  public MyItem Teaser { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Now to render this in a view, you would call: &lt;br /&gt;&lt;pre&gt;@model MyViewModel&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Teaser)&lt;/pre&gt;&lt;br /&gt;This would just simply render out each individual property from the MyItem object. To enhance it, you would do something like so: &lt;br /&gt;&lt;pre&gt;@Html.DisplayFor(m =&amp;gt; m.Teaser, &quot;MyTeaserView&quot;)&lt;/pre&gt;&lt;br /&gt;And the view /Views/Shared/DisplayTemplates/MyTeaserView.cshtml would be used. &lt;br /&gt;There is also another possibility to just add a display template with the same name as the class to the /views/shared/displaytemplates/ folder and that will be used if I call:&lt;br /&gt;&lt;pre&gt;@Html.DisplayFor(m =&amp;gt; m.Teaser)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Another option is to use a UIHint: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class MyViewModel {&lt;br /&gt;  [UIHint(&quot;MyDisplayTemplate&quot;)]&lt;br /&gt;  public MyItem Teaser { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;and when calling DisplayFor using @Html.DisplayFor(m =&amp;gt; m.Teaser), the display template /views/shared/displaytemplates/MyDisplayTemplate.cshtml would be used. &lt;br /&gt;Another powerful convention using DisplayFor is when you use it on objects with the same ancestry or interfaces, consider the following items: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public abstract class ItemBase {&lt;br /&gt;  public string Name { get; set; }&lt;br /&gt;  public string Url { get; set; }&lt;br /&gt;}&lt;br /&gt;public class MyItem : ItemBase {&lt;br /&gt;  public string Image { get; set; }&lt;br /&gt;  public string Preamble { get; set; }&lt;br /&gt;}&lt;br /&gt;public class MySimpleItem : ItemBase {&lt;br /&gt;}&lt;br /&gt;public class MyItemListViewModel {&lt;br /&gt;  IEnumerable&amp;lt;itembase&amp;gt; Items { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Using conventions, I can add some display templates to tweak the display of my items: MyItem.cshtml: &lt;br /&gt;&lt;pre&gt;@model MyItem&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Name)&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Image)&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Preamble)&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Url)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;MySimpleItem.cshtml: &lt;br /&gt;&lt;pre&gt;@model MySimpleItem&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Name)&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Url)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I can even add a template for the base class, so if I later add another implementation of ItemBase, it will display like the base item. &lt;br /&gt;ItemBase.cshtml: &lt;br /&gt;&lt;pre&gt;@model ItemBase&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Name)&lt;br /&gt;@Html.DisplayFor(m =&amp;gt; m.Url)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The problem&lt;/h2&gt;&lt;br /&gt;Remember when I talked about my pages in the beginning of this post, where I commonly had different page types that need to be rendered differently in the same list?&lt;br /&gt;&lt;br /&gt;Now, combine the display templates of MVC and my pages, and I could create a page list using a foreach loop and Html.DisplayFor(m =&amp;gt; page). For each page I create a display template and the page will be rendered in its own unique way in my page listing depending on what properties I have available, like so: &lt;br /&gt;&lt;pre&gt;@foreach (var page in Model.PagesToList) {&lt;br /&gt; @Html.DisplayFor(m =&amp;gt; page)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Next I want to list other pages as teasers in the sidebar, using different html for each type ofcourse: &lt;br /&gt;&lt;pre&gt;@foreach (var page in Model.SideBarTeasers) {&lt;br /&gt; @Html.DisplayFor(m =&amp;gt; page)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;But I can&#39;t!&lt;/b&gt;&amp;nbsp;Because the display template for each page is already occupied by my page listing, what do I do? &lt;br /&gt;There are a number of solutions:&lt;br /&gt;&lt;ul style=&quot;margin-top: 0;&quot;&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;I can create a whole new controller for just the side bar listing, as controllers can have their own display templates.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;I can create a new view model for each page type, combine them with a new base type, and use those in my listing instead, even though there will be no new data so I am effectively duplicating my models just to gain access to a new display template.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;I can use a specific display template, using @Html.DisplayFor(m =&amp;gt; item, &quot;MySideBarPageModel&quot;) , but this would limit me to just one view for all different page types, which would fail my requirement of having different html per model.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;I could use something like item.GetType().Name as template argument, but that could easily break if I later add another page type to the list as there is no fallback to base.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There are probably more clever ways to achieve this, but all ways I tried have revolving around duplicated code (view model bonanza!), or just been a case of killing ants with cannons to stay within the conventions of MVC and DisplayFor. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The solution&lt;/h2&gt;&lt;br /&gt;Cue the DisplayForWithPrefix html helper:&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;public static class DisplayExtensions {&lt;br /&gt;  public const string DEFAULT_PREFIX_VIEW_FORMAT = &quot;{0}.{1}&quot;;&lt;br /&gt;  public const string DIRECTORY_PREFIX_VIEW_FORMAT = &quot;{0}/{1}&quot;;&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// &amp;lt;see cref=&quot;System.Web.Mvc.Html.DisplayExtensions.DisplayFor{TModel,TValue}(System.Web.Mvc.HtmlHelper{TModel},System.Linq.Expressions.Expression{System.Func{TModel,TValue}})&quot;/&amp;gt;&lt;br /&gt;  /// overload using a template prefix. Used to display for the value type using a custom prefix so one object type can have different templates. Will fall back to base types.&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  /// &amp;lt;remarks&amp;gt;&lt;br /&gt;  /// Works similar to regular &amp;lt;see cref=&quot;System.Web.Mvc.Html.DisplayExtensions.DisplayFor{TModel,TValue}(System.Web.Mvc.HtmlHelper{TModel},System.Linq.Expressions.Expression{System.Func{TModel,TValue}})&quot;/&amp;gt; &lt;br /&gt;  /// where the template type is searched recursively using &amp;lt;see cref=&quot;Type.BaseType&quot;/&amp;gt;. If no template can be found, it will fallback to the default System.Web.Mvc.Html.DisplayExtensions.DisplayFor method &lt;br /&gt;  /// using no template at all.&lt;br /&gt;  /// &amp;lt;/remarks&amp;gt;&lt;br /&gt;  /// &amp;lt;typeparam name=&quot;TModel&quot;&amp;gt;The model type&amp;lt;/typeparam&amp;gt;&lt;br /&gt;  /// &amp;lt;typeparam name=&quot;TValue&quot;&amp;gt;The value type&amp;lt;/typeparam&amp;gt;&lt;br /&gt;  /// &amp;lt;param name=&quot;html&quot;&amp;gt;The html helper&amp;lt;/param&amp;gt;&lt;br /&gt;  /// &amp;lt;param name=&quot;expression&quot;&amp;gt;The value expression&amp;lt;/param&amp;gt;&lt;br /&gt;  /// &amp;lt;param name=&quot;templatePrefix&quot;&amp;gt;The template prefix, ex using &quot;MyStringList&quot; for &amp;lt;typeparamref name=&quot;TValue&quot;/&amp;gt; string would, using default &amp;lt;paramref name=&quot;viewFormat&quot; /&amp;gt;, look for the display template named MyStringList.string.cshtml&amp;lt;/param&amp;gt;&lt;br /&gt;  /// &amp;lt;param name=&quot;viewFormat&quot;&amp;gt;How to format the view template name, format arguments: {0} - &amp;lt;paramref name=&quot;templatePrefix&quot;/&amp;gt;, {1} - model type name. / can also be used to make the prefix be a directory&amp;lt;/param&amp;gt;&lt;br /&gt;  /// &amp;lt;param name=&quot;fallbackTemplate&quot;&amp;gt;If set, will be used if no display template can be found, otherwise DisplayFor without template will be called as fallback&amp;lt;/param&amp;gt;&lt;br /&gt;  /// &amp;lt;param name=&quot;preferInterfaceBeforeBaseClass&quot;&amp;gt;If true, the display template search prefers interfaces before base classes, otherwise all base classes will be checked before any interface. Also, only interfaces defined directly on the current type being searched is considered each &amp;lt;see cref=&quot;Type.BaseType&quot;/&amp;gt; iteration&amp;lt;/param&amp;gt;&lt;br /&gt;  /// &amp;lt;returns&amp;gt;The rendered html&amp;lt;/returns&amp;gt;&lt;br /&gt;  public static MvcHtmlString DisplayForWithPrefix&amp;lt;TModel, TValue&amp;gt;(this HtmlHelper&amp;lt;TModel&amp;gt; html, Expression&amp;lt;Func&amp;lt;TModel, TValue&amp;gt;&amp;gt; expression, string templatePrefix,&lt;br /&gt;    string viewFormat = DEFAULT_PREFIX_VIEW_FORMAT, string fallbackTemplate = null, bool preferInterfaceBeforeBaseClass = false)&lt;br /&gt;  {&lt;br /&gt;    var metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData);&lt;br /&gt;    var modelType = metaData.Model.GetType(); // this is the most derived type of the model&lt;br /&gt;&lt;br /&gt;    Func&amp;lt;string, MvcHtmlString&amp;gt; renderer = templateName =&amp;gt; System.Web.Mvc.Html.DisplayExtensions.DisplayFor(html, expression, templateName);&lt;br /&gt;&lt;br /&gt;    // first, check all concrete implementations&lt;br /&gt;    while(modelType != null) {&lt;br /&gt;      var viewName = string.Format(viewFormat, templatePrefix, modelType.Name);&lt;br /&gt;&lt;br /&gt;      if(DisplayTemplateExist(html.ViewContext, viewName)) {&lt;br /&gt;        return renderer(viewName);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      if(preferInterfaceBeforeBaseClass) {&lt;br /&gt;        // check interfaces defined on the model type directly&lt;br /&gt;        var exceptions = modelType.BaseType != null ? modelType.BaseType.GetInterfaces() : Enumerable.Empty&amp;lt;Type&amp;gt;();&lt;br /&gt;        foreach(var @interface in metaData.Model.GetType().GetInterfaces().Except(exceptions)) {&lt;br /&gt;          viewName = string.Format(viewFormat, templatePrefix, @interface.Name);&lt;br /&gt;          if(DisplayTemplateExist(html.ViewContext, viewName)) {&lt;br /&gt;            return renderer(viewName);&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      modelType = modelType.BaseType;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // check all interfaces, if not already checked per implementation&lt;br /&gt;    if(!preferInterfaceBeforeBaseClass) {&lt;br /&gt;      foreach(var @interface in metaData.Model.GetType().GetInterfaces()) {&lt;br /&gt;        var viewName = string.Format(viewFormat, templatePrefix, @interface.Name);&lt;br /&gt;        if(DisplayTemplateExist(html.ViewContext, viewName)) {&lt;br /&gt;          return renderer(viewName);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // fallback&lt;br /&gt;    return renderer(fallbackTemplate);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static bool DisplayTemplateExist(ViewContext context, params string[] templateNames)&lt;br /&gt;  {&lt;br /&gt;    foreach(var templateName in templateNames) {&lt;br /&gt;      // the FindPartialView will not automatically search the displaytemplates folder, but the DisplayFor method will&lt;br /&gt;      var viewResult = ViewEngines.Engines.FindPartialView(context, &quot;DisplayTemplates/&quot; + templateName);&lt;br /&gt;      return viewResult.View != null;&lt;br /&gt;    }&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The html helper is quite simple, it works like DisplayFor, infact it uses DisplayFor to do the actual rendering, but it will behave slightly different when looking for display templates. The helper will use the prefix when looking for display templates, enabling me to use different templates to render the same objects using my requirement to automatically choose template based on what page type model is being rendered. &lt;br /&gt;&lt;br /&gt;Taking my previous example, I can now use my helper: &lt;br /&gt;&lt;pre&gt;@foreach (var page in Model.PagesToList) {&lt;br /&gt; @Html.DisplayForWithPrefix(m =&amp;gt; page, &quot;PageList&quot;)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;@foreach (var page in Model.SideBarTeasers) {&lt;br /&gt; @Html.DisplayForWithPrefix(m =&amp;gt; page, &quot;SideBar&quot;)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;And the display templates the view engine looks for will be, for eaxmple:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;margin-top: 0;&quot;&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;PageList.MyPageType.cshtml&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;PageList.BasePageType.cshtml&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;SideBar.MyPageType.cshtml&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;SideBar.SomeOtherPageType.cshtml&lt;/li&gt;&lt;li style=&quot;font-size: inherit;&quot;&gt;SideBar.IMyPageTypeInterface.cshtml&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Bonus!&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;I can also, if I change the viewFormat parameter to &quot;{0}/{1}&quot;, use each prefix as a subfolder in the DisplayTemplates folder, very neat and tidy if I have a lot of templates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Questions and answers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;-&quot;Why not just a DisplayFor overload?&quot;&lt;/i&gt;&lt;br /&gt;As you can see, the helper uses an expression and a string as arguments, which would cause an ambiguity with the &quot;real&quot; DisplayFor, and I do not want any of the optional arguments to be required. Besides, this way any new person opening your project will immediately see there is some special handing being done when rendering some properties.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;-&quot;What about the silly&amp;nbsp;preferInterfaceBeforeBaseClass flag?&quot;&lt;/i&gt;&lt;br /&gt;I added this as a switch to change the order the system searches for templates, enabling it make the helper search for interfaces directly defined on the current type in the chain first, instead of only searching for interfaces if it fail to find any views based on base implementations. If you know the correct order, please share.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;-&quot;What about speed?&quot;&lt;/i&gt;&lt;br /&gt;Well, I don&#39;t know, there is one instance of reflection when interfaces are being searched for, but those lookups should be cached by asp.net, so I don&#39;t think there is any problem, but I did not performance test this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finally&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;What do you think? Is there a better, built-in way of achieving this? If so I admit my google-fu isn&#39;t up to speed as I have tried to find something like this online but failed. Or is the whole helper a horrible crime against MVC conventions? Do not hesitate to let me know what you think. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can download the full helper class here: &lt;a href=&quot;http://pastebin.com/Y1ES6gg7&quot;&gt;http://pastebin.com/Y1ES6gg7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Sorry about the tag with my name, Blogger does not support feed filtering based on author)</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/3288945100878989136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2014/11/multiple-displayfor-templates-in-aspnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/3288945100878989136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/3288945100878989136'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2014/11/multiple-displayfor-templates-in-aspnet.html' title='Multiple DisplayFor templates in asp.net MVC'/><author><name>Erik</name><uri>http://www.blogger.com/profile/07540886242859059701</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6619606000431090378.post-4075215693633202798</id><published>2014-10-27T18:26:00.000+01:00</published><updated>2014-11-08T16:02:56.477+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term=".NET 4.5"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="episerver"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer 7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="EPiServer CMS"/><category scheme="http://www.blogger.com/atom/ns#" term="Erik Nilsson"/><title type='text'>Page tree icons in EPiServer CMS 7.5</title><content type='html'>One appreciated feature we had in our old EPiServer 6 framework here at Nansen was the ability to set different icons for different page types in the page tree. This makes it easier for editors to distinguish between different page types to generally make&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-dJl-YzDv5YA/VE3vcsd86eI/AAAAAAAAAZA/4NErCPZznjk/s1600/cms6tree.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-dJl-YzDv5YA/VE3vcsd86eI/AAAAAAAAAZA/4NErCPZznjk/s1600/cms6tree.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;CMS6 pagetree with custom icons&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;their life easier. And we all know the happier the editor, the better the content, and better content make for more visitors, right?&lt;br /&gt;&lt;br /&gt;Anyways, the EPi 6 system we built was a bit of a hack, we added a ControlAdapter to the PageTree control to inject css classes on the different nodes depending on what page type it was.&lt;br /&gt;&lt;br /&gt;Now in EPiServer 7.5 there are systems in place to make this a lot cleaner, using the tools provided by the CMS UI we can avoid using hacks, which make for a cleaner approach that will hopefully not break as easily should the underlying structure change in future updates.&lt;br /&gt;&lt;br /&gt;The most basic way is to add a editor descriptor for your class, like so:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:csharp&quot;&gt; [UIDescriptorRegistration]&lt;br /&gt; public class ContainerPageUIDescriptor : UIDescriptor&lt;containerpage&gt;&lt;br /&gt; {&lt;br /&gt;  public ContainerPageUIDescriptor()&lt;br /&gt;   : base(ContentTypeCssClassNames.Container)&lt;br /&gt;  {&lt;br /&gt;   DefaultView = CmsViewNames.AllPropertiesView;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/containerpage&gt;&lt;/pre&gt;Now this approach will get tedious once you start adding page types as you will need one UI descriptor for each page type. There are several ways to make this more streamlined. This post will show you one approach using attributes on your page type classes.&lt;br /&gt;&lt;br /&gt;We are going to use the EPiServer.Shell.UIDescriptor objects registered for all content types, these are added to the EPiServer.Shell.UIDescriptorRegistry during site startup. The UIDescriptor contain one important property that makes all of this work, IconClass. This class is added to the icon shown for each item in the page tree.&lt;br /&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Requirements&lt;/h2&gt;&lt;div&gt;I used EPiServer CMS v7.14.1 and EPiServer CMS UI version 7.15.0 when building this.&lt;/div&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;The parts&lt;/h2&gt;&lt;div&gt;We will need to glue together three different parts to achieve this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;An attribute for page (content) type classes, where a icon class can be chosen&lt;/li&gt;&lt;li&gt;An initialization module to add the icon class to the page types&lt;/li&gt;&lt;li&gt;Some icons&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;1. The attribute&lt;/h2&gt;&lt;div&gt;The attribute is pretty straight forward, all we need is the ability to select a css class for our content types:&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush:csharp&quot;&gt; [AttributeUsage(AttributeTargets.Class)]&lt;br /&gt; public class ContentIconAttribute : Attribute&lt;br /&gt; {&lt;br /&gt;  public ContentIconAttribute(string iconClass)&lt;br /&gt;  {&lt;br /&gt;   IconClass = iconClass;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &amp;lt;summary&amp;gt;&lt;br /&gt;  /// Css class to apply to the icon&lt;br /&gt;  /// &amp;lt;/summary&amp;gt;&lt;br /&gt;  public string IconClass { get; set; }&lt;br /&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;2. The initialization module&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;The initialization module is invoked after the EPiServer.Shell.UIDescriptorRegistry is populated, and for each content type that have our custom attribute, append the css class to the IConClass attribute. This is, as per usual for attributes, done using reflection, but as it only happen once during site startup, the preformance impact is of no issue.&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush:csharp&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Used in conjunction with &amp;lt;see cref=&quot;ContentIconAttribute&quot;/&amp;gt; to add custom content icons for the page tree.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;remarks&amp;gt;&amp;lt;see cref=&quot;ContentIcon&quot;/&amp;gt; and &amp;lt;see cref=&quot;ContentIconAttribute&quot;/&amp;gt; for more information&amp;lt;/remarks&amp;gt;&lt;br /&gt;[InitializableModule]&lt;br /&gt;[ModuleDependency(typeof(EPiServer.Cms.Shell.InitializableModule))]&lt;br /&gt;public class ContentTypeUIDescriptorInitializer : IInitializableModule&lt;br /&gt;{&lt;br /&gt; public void Initialize(InitializationEngine context)&lt;br /&gt; {&lt;br /&gt;  var registry = context.Locate.Advanced.GetInstance&amp;lt;UIDescriptorRegistry&amp;gt;();&lt;br /&gt;  var classes = GetDescriptorClasses();&lt;br /&gt;  foreach(var descriptor in registry.UIDescriptors) {&lt;br /&gt;   if(classes.ContainsKey(descriptor.ForType)) {&lt;br /&gt;    descriptor.IconClass += classes[descriptor.ForType];&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void Uninitialize(InitializationEngine context) {}&lt;br /&gt;&lt;br /&gt; public void Preload(string[] parameters) {}&lt;br /&gt;&lt;br /&gt; private Dictionary&amp;lt;Type, string&amp;gt; GetDescriptorClasses()&lt;br /&gt; {&lt;br /&gt;  var types = AppDomain.CurrentDomain.GetAssemblies()&lt;br /&gt;        .SelectMany(ass =&amp;gt; ass.GetTypes().Where(type =&amp;gt; type.IsDefined(typeof(ContentIconAttribute), false)));&lt;br /&gt;&lt;br /&gt;  var descriptors = from type in types&lt;br /&gt;   select new {&lt;br /&gt;    type,&lt;br /&gt;    iconClass = ((ContentIconAttribute)Attribute.GetCustomAttribute(type, typeof(ContentIconAttribute))).IconClass&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;  return descriptors.ToDictionary(key =&amp;gt; key.type, value =&amp;gt; value.iconClass);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;The initializer is pretty straightforward, it finds all classes with out ContentIcon attribute and use that to modify the registered UIDescriptors by appending our IconClass. One important detail is that it has a dependency on&amp;nbsp;EPiServer.Cms.Shell.InitializableModule, which ensure it is initialized after the UIDescriptorRegistry is populated with all the UIDescriptors.&lt;/div&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;3. The icons&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;As all we can do is add a css class to each item in the page tree, we need icons that can be displayed using only a css class. This can be achieved in a number of ways, like adding the css for each icon, like so:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre class=&quot;brush:css&quot;&gt;.myPageTypeIcon {&lt;br /&gt;  background: url(&#39;../Images/Icons/pageIcons16x16.png&#39;) 0px -16px no-repeat;&lt;br /&gt;  height: 16px;&lt;br /&gt;  width: 16px;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;This approach is almost as tedious as making one UI descriptor class for each page type, this is no good. A faster way is to use a icon library, where all icons are already configured. Here, we picked Icomoon (&lt;a href=&quot;https://icomoon.io/&quot;&gt;https://icomoon.io/&lt;/a&gt;), they have a free library of about 400 icons in a convenient woff font format.&lt;br /&gt;&lt;br /&gt;I did make a few small changes to the css supplied, I added a prefix as the class names were very generic, and it didn&#39;t display entirely correct, the icons were compacted to 13px instead of 16px. Anyways, here is the base css for the icomoon font icons:&lt;br /&gt;&lt;pre class=&quot;brush:css&quot;&gt;[class^=&quot;icomoon-icon-&quot;], [class*=&quot; icomoon-icon-&quot;] {&lt;br /&gt; font: normal normal normal 16px/1 icomoon;&lt;br /&gt; speak: none;&lt;br /&gt; text-transform: none;&lt;br /&gt; line-height: 1;&lt;br /&gt; /* Better Font Rendering =========== */&lt;br /&gt; -webkit-font-smoothing: antialiased;&lt;br /&gt; -moz-osx-font-smoothing: grayscale;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.icomoon-icon-home:before {&lt;br /&gt; content: &quot;\e600&quot;;&lt;br /&gt;}&lt;br /&gt;…&lt;br /&gt;.icomoon-icon-IcoMoon:before {&lt;br /&gt; content: &quot;\e7c2&quot;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;As you can see, I prefixed each icon with icomoon, and also modified the font directive in the base class slightly.&lt;br /&gt;&lt;br /&gt;Once you have your icons, place everything somewhere under /ClientResources, In this example I placed them under clientresources/styles/icomoon, and modify your module.config file in the web root:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;clientResources&amp;gt;&lt;br /&gt;  &amp;lt;add name=&quot;epi-cms.widgets.base&quot; path=&quot;Styles/icomoon/icomoon.css&quot; resourceType=&quot;Style&quot;/&amp;gt;&lt;br /&gt;&amp;lt;clientResources&amp;gt;&lt;/pre&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;3b. Convenience factor - icon names&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;As there are a lot of icons, you can add constants for all the icons by using some clever search and replace, like so:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre class=&quot;brush:csharp&quot;&gt; public class ContentIcon&lt;br /&gt;{&lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// IcoMoon free icons, see more here https://icomoon.io/#preview-free&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; public static class IcoMoon&lt;br /&gt; {&lt;br /&gt;  public const string accessibility = &quot;icomoon-icon-accessibility&quot;;&lt;br /&gt;  public const string address_book = &quot;icomoon-icon-address-book&quot;;&lt;br /&gt;  public const string aid = &quot;icomoon-icon-aid&quot;;&lt;br /&gt;  public const string airplane = &quot;icomoon-icon-airplane&quot;;&lt;br /&gt;  public const string alarm = &quot;icomoon-icon-alarm&quot;;&lt;br /&gt;  public const string alarm2 = &quot;icomoon-icon-alarm2&quot;;&lt;br /&gt;  …&lt;br /&gt;  public const string youtube = &quot;icomoon-icon-youtube&quot;;&lt;br /&gt;  public const string youtube2 = &quot;icomoon-icon-youtube2&quot;;&lt;br /&gt;  public const string zoomin = &quot;icomoon-icon-zoomin&quot;;&lt;br /&gt;  public const string zoomout = &quot;icomoon-icon-zoomout&quot;;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Using it all&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;After gluing it all together, you can now in a simple way add page tree icons to your content using just one attribute per content item. The constant class help you avoid misspelling anything, and you can also use the icomoon website as quick reference for how each icon look:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre class=&quot;brush:csharp&quot;&gt;[ContentType(&lt;br /&gt; GUID = &quot;00000000-0000-0000-0000-000000000000&quot;,&lt;br /&gt; DisplayName = &quot;Section page&quot;,&lt;br /&gt; GroupName = SystemTabNames.Settings)]&lt;br /&gt;[ContentIcon(ContentIcon.IcoMoon.copy)]&lt;br /&gt;public class MyVeryOwnPage : PageData&lt;br /&gt;{&lt;br /&gt;}&lt;/pre&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Finally&lt;/h2&gt;&lt;div&gt;Here is the result in all its glory:&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-Vh0G2BN1Tu4/VE5-gLc2gyI/AAAAAAAAAak/bSjfdOvQU3c/s1600/pagetree.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-Vh0G2BN1Tu4/VE5-gLc2gyI/AAAAAAAAAak/bSjfdOvQU3c/s1600/pagetree.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;The fruits of our labor&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;You can get the c# code source parts from here: &lt;a href=&quot;http://pastebin.com/znYXReXc&quot;&gt;http://pastebin.com/znYXReXc&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.nansen.com/feeds/4075215693633202798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.nansen.com/2014/10/page-tree-icons-in-episerver-cms-75.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/4075215693633202798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6619606000431090378/posts/default/4075215693633202798'/><link rel='alternate' type='text/html' href='http://blog.nansen.com/2014/10/page-tree-icons-in-episerver-cms-75.html' title='Page tree icons in EPiServer CMS 7.5'/><author><name>Erik</name><uri>http://www.blogger.com/profile/07540886242859059701</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-dJl-YzDv5YA/VE3vcsd86eI/AAAAAAAAAZA/4NErCPZznjk/s72-c/cms6tree.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>