<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chris Cavanagh's Blog</title>
	<atom:link href="http://chriscavanagh.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://chriscavanagh.wordpress.com</link>
	<description>Ramblings on .NET, WPF, Silverlight, Flex, AIR and other hoopy cool things</description>
	<lastBuildDate>Thu, 09 Jul 2009 19:04:01 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/cca7535890135e9c20578c1aa47e9521?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Chris Cavanagh's Blog</title>
		<link>http://chriscavanagh.wordpress.com</link>
	</image>
			<item>
		<title>Silverlight 3 + ClearType</title>
		<link>http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 19:03:37 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/</guid>
		<description><![CDATA[As we knew, Silverlight 3 includes ClearType support.&#160; Now it’s released we can finally see it in action   :
 
More importantly, it works great with SilverGlulxe!
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=402&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As we knew, Silverlight 3 includes ClearType support.&#160; Now it’s released we can finally see it in action <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' />  :</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/07/image1.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/07/image_thumb1.png?w=474&#038;h=346" width="474" height="346" /></a> </p>
<p>More importantly, it works great with <a title="SilverGlulxe - Silverlight Interactive Fiction" href="http://www.chriscavanagh.com/chris/SilverGlulxe/SilverGlulxeTestPage.aspx" target="_blank">SilverGlulxe</a>!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/402/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=402&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/07/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>WPF 2D Physics Plus</title>
		<link>http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 19:01:59 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/</guid>
		<description><![CDATA[Rohit Gupta is working on some great enhancements to the WPF 2D Physics demo I posted.&#160; Features include:

Click to remove a body from the world 
Click and “push” the body in any given direction 

Be sure to take a look!&#160; The project is here on CodePlex and you can run it as a ClickOnce app [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=398&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Rohit Gupta is working on some great <a title="WPF 2D Physics Plus" href="http://wpf2dphysicsplus.codeplex.com/" target="_blank">enhancements</a> to the <a title="WPF 2d Physics" href="http://chriscavanagh.wordpress.com/2006/10/23/wpf-2d-physics" target="_blank">WPF 2D Physics</a> demo I posted.&#160; Features include:</p>
<ul>
<li>Click to remove a body from the world </li>
<li>Click and “push” the body in any given direction </li>
</ul>
<p>Be sure to take a look!&#160; The project is <a title="WPF 2D Physics Plus" href="http://wpf2dphysicsplus.codeplex.com/" target="_blank">here on CodePlex</a> and you can run it as a <a title="WPF Physics Plus - Rohit Gupta - ClickOnce app" href="http://www.chriscavanagh.com/Chris/WPFPhysicsPlus/publish.htm" target="_blank">ClickOnce app here</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/398/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=398&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>MVC IsAuthorized and AuthorizedActionLink</title>
		<link>http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 13:23:35 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/</guid>
		<description><![CDATA[UPDATE: Fixed broken IsAuthenticated logic (thanks Travis).
Robert Dean published a great post last year about his Security Aware Html.ActionLink.&#160; It allowed you to conditionally render links based on the [AuthorizeAttribute] assigned to a controller’s action methods.
Here’s an alternative implementation based on expressions, so you get type safety, intellisense and slightly simpler code  &#160; First, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=383&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>UPDATE:</strong> Fixed broken IsAuthenticated logic (thanks Travis).</p>
<p>Robert Dean published a great post last year about his <a title="Security Aware Html.ActionLink" href="http://inq.me/post/ASPNet-MVC-Extension-method-to-create-a-Security-Aware-HtmlActionLink.aspx" target="_blank">Security Aware Html.ActionLink</a>.&#160; It allowed you to conditionally render links based on the [AuthorizeAttribute] assigned to a controller’s action methods.</p>
<p>Here’s an alternative implementation based on expressions, so you get type safety, intellisense and slightly simpler code <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' /> &#160; First, a helper to determine if an action is authorized:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> AuthorizationExtensions
{
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Dictionary&lt;Expression, AuthorizeAttribute[]&gt; expressionAuthorizers = <span style="color:#0000ff;">new</span> Dictionary&lt;Expression, AuthorizeAttribute[]&gt;();

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Determines whether the specified action is authorized.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;typeparam name=&quot;TController&quot;&gt;The type of the controller.&lt;/typeparam&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;helper&quot;&gt;The helper.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;actionMethod&quot;&gt;The action method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;</span>
    <span style="color:#008000;">///     &lt;c&gt;true&lt;/c&gt; if the specified helper is authorized; otherwise, &lt;c&gt;false&lt;/c&gt;.</span>
    <span style="color:#008000;">/// &lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">bool</span> IsAuthorized&lt;TController&gt;( <span style="color:#0000ff;">this</span> HtmlHelper helper, Expression&lt;Action&lt;TController&gt;&gt; action )
    {
        var call = action.Body <span style="color:#0000ff;">as</span> MethodCallExpression;

        <span style="color:#0000ff;">if</span> ( call == <span style="color:#0000ff;">null</span> ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        var authorizers = expressionAuthorizers.ContainsKey( action )
            ? expressionAuthorizers[ action ]
            : expressionAuthorizers[ action ] = GetAttributes&lt;AuthorizeAttribute&gt;( call );

        <span style="color:#0000ff;">return</span> ( authorizers.Length &gt; 0 )
            ? authorizers.All( a =&gt; a.IsAuthorized( helper.ViewContext.HttpContext.User ) )
            : <span style="color:#0000ff;">true</span>;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Gets the specified attributes for an action method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;call&quot;&gt;The call.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> TAttribute[] GetAttributes&lt;TAttribute&gt;( MethodCallExpression call ) <span style="color:#0000ff;">where</span> TAttribute : Attribute
    {
        <span style="color:#0000ff;">return</span> call.Object.Type.GetCustomAttributes( <span style="color:#0000ff;">typeof</span>( TAttribute ), <span style="color:#0000ff;">true</span> )
            .Union( call.Method.GetCustomAttributes( <span style="color:#0000ff;">typeof</span>( TAttribute ), <span style="color:#0000ff;">true</span> ) )
            .Cast&lt;TAttribute&gt;()
            .ToArray();
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Determines whether the specified &lt;see cref=&quot;AuthorizeAttribute&quot;/&gt; authorizes the specified user.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;authorize&quot;&gt;The &lt;see cref=&quot;AuthorizeAttribute&quot;/&gt;.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;user&quot;&gt;The user.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;</span>
    <span style="color:#008000;">///     &lt;c&gt;true&lt;/c&gt; if the specified user is authorized; otherwise, &lt;c&gt;false&lt;/c&gt;.</span>
    <span style="color:#008000;">/// &lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">bool</span> IsAuthorized( <span style="color:#0000ff;">this</span> AuthorizeAttribute authorize, IPrincipal user )
    {
        <span style="color:#0000ff;">if</span> ( !user.Identity.IsAuthenticated ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        var users = authorize.Users.SplitString();
        <span style="color:#0000ff;">if</span> ( users.Length &gt; 0 &amp;&amp; !users.Contains( user.Identity.Name, StringComparer.OrdinalIgnoreCase ) ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        var roles = authorize.Roles.SplitString();
        <span style="color:#0000ff;">if</span> ( roles.Length &gt; 0 &amp;&amp; !roles.Any( user.IsInRole ) ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span>;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Splits and trims the specified string.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;original&quot;&gt;The original.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span>[] SplitString( <span style="color:#0000ff;">this</span> <span style="color:#0000ff;">string</span> original )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">string</span>.IsNullOrEmpty( original )
            ? <span style="color:#0000ff;">new</span> <span style="color:#0000ff;">string</span>[ 0 ]
            : original.Split( <span style="color:#006080;">'.'</span> ).Select( s =&gt; s.Trim() ).Where( s =&gt; !<span style="color:#0000ff;">string</span>.IsNullOrEmpty( s ) ).ToArray();
    }
}</pre>
</div>
<p>With that, it’s possible to write markup like this:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;height:50px;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0 0 20px;">&lt;% <span style="color:#0000ff;">if</span> ( Html.IsAuthorized&lt;ModelingController&gt;( c =&gt; c.Index() ) ) {%&gt;
    &lt;div&gt;My conditional content...&lt;/div&gt;
&lt;%}%&gt;
<div>&#160;</div>
</pre>
</div>
<p>If you’re using ASP.NET <a title="ASP.NET MVC Futures" href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471" target="_blank">MVC Futures</a>, it’s straightforward to write an authorized ActionLink:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> LinkExtensions
{
    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Render an HTML action link if authorized by the target action.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;typeparam name=&quot;TController&quot;&gt;The type of the controller.&lt;/typeparam&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;helper&quot;&gt;The helper.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;action&quot;&gt;The action.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;linkText&quot;&gt;The link text.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span> AuthorizedActionLink&lt;TController&gt;( <span style="color:#0000ff;">this</span> HtmlHelper helper, Expression&lt;Action&lt;TController&gt;&gt; action, <span style="color:#0000ff;">string</span> linkText )
        <span style="color:#0000ff;">where</span> TController : Controller
    {
        <span style="color:#0000ff;">return</span> AuthorizedActionLink&lt;TController&gt;( helper, action, linkText, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Render an HTML action link if authorized by the target action.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;typeparam name=&quot;TController&quot;&gt;The type of the controller.&lt;/typeparam&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;helper&quot;&gt;The helper.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;action&quot;&gt;The action.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;linkText&quot;&gt;The link text.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;htmlAttributes&quot;&gt;The HTML attributes.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span> AuthorizedActionLink&lt;TController&gt;( <span style="color:#0000ff;">this</span> HtmlHelper helper, Expression&lt;Action&lt;TController&gt;&gt; action, <span style="color:#0000ff;">string</span> linkText, <span style="color:#0000ff;">object</span> htmlAttributes )
        <span style="color:#0000ff;">where</span> TController : Controller
    {
        var routeValuesFromExpression = ExpressionHelper.GetRouteValuesFromExpression&lt;TController&gt;( action );

        <span style="color:#0000ff;">return</span> helper.IsAuthorized( action )
            ? helper.RouteLink( linkText, routeValuesFromExpression, <span style="color:#0000ff;">new</span> RouteValueDictionary( htmlAttributes ) )
            : <span style="color:#0000ff;">null</span>;
    }
}</pre>
</div>
<p>NOTE &#8211; You could do the same thing without MVC Futures, but would need a little more code (you’d need something like <a title="Microsoft.Web.Internal.ExpressionHelper" href="http://aspnet.codeplex.com/SourceControl/changeset/view/23011#266392" target="_blank">ExpressionHelper’s GetRouteValuesFromExpression</a> method).</p>
<p>Here’s a markup example:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;height:50px;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">&lt;%= Html.AuthorizedActionLink&lt;ModelingController&gt;( c =&gt; c.Index(), <span style="color:#006080;">&quot;Modeling&quot;</span> ) %&gt;
<div>&#160;</div>
</pre>
</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=383&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>Pretty Printing Exceptions</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/#comments</comments>
		<pubDate>Sun, 31 May 2009 08:24:20 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/</guid>
		<description><![CDATA[Here are some snippets you might find useful for pretty-printing exception stack traces (using the trace string rather than the StackTrace class).
First, a regular expression to extract namespace, method name, argument and source details from a stack trace string:
\sat\s(?&#60;namespace&#62;.*?)\.(?&#60;method&#62;(\.ctor&#124;&#60;\.ctor&#62;[^(]*?&#124;[^.(]+))\(\s*(((?&#60;type&#62;[^,\s)]+)\s+(?&#60;arg&#62;[^,\s)]+)\s*,?\s*?)*?)\s*\)( in (?&#60;file&#62;.*?):line (?&#60;line&#62;[0-9]*))?

Next, a helper class that uses the regex to return a collection of method [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=373&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Here are some snippets you might find useful for pretty-printing exception stack traces (using the trace string rather than the <a title="StackTrace class" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx" target="_blank">StackTrace</a> class).</p>
<p>First, a regular expression to extract namespace, method name, argument and source details from a stack trace string:</p>
<blockquote><p>\sat\s(?&lt;namespace&gt;.*?)\.(?&lt;method&gt;(\.ctor|&lt;\.ctor&gt;[^(]*?|[^.(]+))\(\s*(((?&lt;type&gt;[^,\s)]+)\s+(?&lt;arg&gt;[^,\s)]+)\s*,?\s*?)*?)\s*\)( in (?&lt;file&gt;.*?):line (?&lt;line&gt;[0-9]*))?</p>
</blockquote>
<p>Next, a helper class that uses the regex to return a collection of method details:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> ExceptionParser
{
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Regex stackTraceExpr = <span style="color:#0000ff;">new</span> Regex(
        <span style="color:#006080;">@&quot;\sat\s(?&lt;namespace&gt;.*?)\.(?&lt;method&gt;(\.ctor|&lt;\.ctor&gt;[^(]*?|[^.(]+))\(\s*(((?&lt;type&gt;[^, )]+)\s+(?&lt;arg&gt;[^, )]+)\s*,?\s*?)*?)\s*\)( in (?&lt;file&gt;.*?):line (?&lt;line&gt;[0-9]*))?&quot;</span> );

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Parses the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;Method&gt; ParseStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        var matches = stackTraceExpr.Matches( stackTrace ).Cast&lt;Match&gt;();

        <span style="color:#0000ff;">foreach</span> ( var match <span style="color:#0000ff;">in</span> matches )
        {
            var line = match.Groups[ <span style="color:#006080;">&quot;line&quot;</span> ].Value;

            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Method
            {
                Namespace = match.Groups[ <span style="color:#006080;">&quot;namespace&quot;</span> ].Value,
                Name = match.Groups[ <span style="color:#006080;">&quot;method&quot;</span> ].Value,
                Arguments = ParseArguments( match ).ToArray(),
                Source = match.Groups[ <span style="color:#006080;">&quot;source&quot;</span> ].Value,
                Line = !<span style="color:#0000ff;">string</span>.IsNullOrEmpty( line ) ? (<span style="color:#0000ff;">int</span>?)<span style="color:#0000ff;">int</span>.Parse( line ) : <span style="color:#0000ff;">null</span>
            };
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Parses the arguments.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;match&quot;&gt;The match.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;Argument&gt; ParseArguments( Match match )
    {
        var type = match.Groups[ <span style="color:#006080;">&quot;type&quot;</span> ];
        var arg = match.Groups[ <span style="color:#006080;">&quot;arg&quot;</span> ];
        var types = type.Captures.Cast&lt;Capture&gt;().Select( c =&gt; c.Value ).Union( <span style="color:#0000ff;">new</span>[] { type.Value } ).GetEnumerator();
        var args = arg.Captures.Cast&lt;Capture&gt;().Select( c =&gt; c.Value ).Union( <span style="color:#0000ff;">new</span>[] { arg.Value } ).GetEnumerator();

        <span style="color:#0000ff;">while</span> ( types.MoveNext() &amp;&amp; args.MoveNext() )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Argument
            {
                Type = types.Current,
                Name = args.Current
            };
        }
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">struct</span> Argument
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Type;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Name;
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">struct</span> Method
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Namespace;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Name;
        <span style="color:#0000ff;">public</span> Argument[] Arguments;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Source;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span>? Line;
    }
}</pre>
</div>
<p>From there you might want to render it as a WPF FlowDocument or series of Inlines in WPF or Silverlight (you can use this directly or as an <a title="IValueConverter Interface" href="http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(loband).aspx" target="_blank">IValueConverter</a>):</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> PrettyExceptionConverter : DependencyObject, IValueConverter
{
    <span style="color:#cc6633;">#region</span> Dependency properties

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty ErrorStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;ErrorStyle&quot;</span>, MakeStyle( Colors.Red, FontStyles.Italic, FontWeights.Bold ) );
    <span style="color:#0000ff;">public</span> Style ErrorStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( ErrorStyleProperty ); } set { SetValue( ErrorStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Error( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = ErrorStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty NamespaceStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;NamespaceStyle&quot;</span>, MakeStyle( Colors.Blue ) );
    <span style="color:#0000ff;">public</span> Style NamespaceStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( NamespaceStyleProperty ); } set { SetValue( NamespaceStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Namespace( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = NamespaceStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty MethodNameStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;MethodNameStyle&quot;</span>, MakeStyle( Colors.Black, <span style="color:#0000ff;">null</span>, FontWeights.Bold ) );
    <span style="color:#0000ff;">public</span> Style MethodNameStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( MethodNameStyleProperty ); } set { SetValue( MethodNameStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline MethodName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = MethodNameStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty BracketStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;BracketStyle&quot;</span>, MakeStyle( Colors.DarkRed ) );
    <span style="color:#0000ff;">public</span> Style BracketStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( BracketStyleProperty ); } set { SetValue( BracketStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Bracket( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = BracketStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty SeparatorStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;SeparatorStyle&quot;</span>, MakeStyle( Colors.DarkBlue ) );
    <span style="color:#0000ff;">public</span> Style SeparatorStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( SeparatorStyleProperty ); } set { SetValue( SeparatorStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Separator( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = SeparatorStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty SpaceStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;SpaceStyle&quot;</span>, <span style="color:#0000ff;">null</span> );
    <span style="color:#0000ff;">public</span> Style SpaceStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( SpaceStyleProperty ); } set { SetValue( SpaceStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Space() { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( <span style="color:#006080;">&quot; &quot;</span> ) { Style = SpaceStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty TypeNameStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;TypeNameStyle&quot;</span>, MakeStyle( Colors.Teal ) );
    <span style="color:#0000ff;">public</span> Style TypeNameStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( TypeNameStyleProperty ); } set { SetValue( TypeNameStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline TypeName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = TypeNameStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty ArgumentStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;ArgumentStyle&quot;</span>, MakeStyle( Colors.DarkGreen ) );
    <span style="color:#0000ff;">public</span> Style ArgumentStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( ArgumentStyleProperty ); } set { SetValue( ArgumentStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Argument( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = ArgumentStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty SourceStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;SourceStyle&quot;</span>, MakeStyle( Colors.Gray ) );
    <span style="color:#0000ff;">public</span> Style SourceStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( SourceStyleProperty ); } set { SetValue( SourceStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Source( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = SourceStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty LocationStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;LocationStyle&quot;</span>, MakeStyle( Colors.DarkRed ) );
    <span style="color:#0000ff;">public</span> Style LocationStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( LocationStyleProperty ); } set { SetValue( LocationStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Location( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = LocationStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> DependencyProperty ChildIndentProperty = DependencyProperty.Register( <span style="color:#006080;">&quot;ChildIndent&quot;</span>, <span style="color:#0000ff;">typeof</span>( <span style="color:#0000ff;">double</span> ), <span style="color:#0000ff;">typeof</span>( PrettyExceptionConverter ), <span style="color:#0000ff;">new</span> PropertyMetadata( 25d ) );
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">double</span> ChildIndent { get { <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">double</span>)GetValue( ChildIndentProperty ); } set { SetValue( ChildIndentProperty, <span style="color:#0000ff;">value</span> ); } }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> Static helpers

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> DependencyProperty RegisterStyle( <span style="color:#0000ff;">string</span> name, Style defaultStyle )
    {
        <span style="color:#0000ff;">return</span> DependencyProperty.Register(
            name,
            <span style="color:#0000ff;">typeof</span>( Style ),
            <span style="color:#0000ff;">typeof</span>( PrettyExceptionConverter ),
            <span style="color:#0000ff;">new</span> PropertyMetadata( defaultStyle ) );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Style MakeStyle( Color color )
    {
        <span style="color:#0000ff;">return</span> MakeStyle( color, <span style="color:#0000ff;">null</span>, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Style MakeStyle( Color color, FontStyle? fontStyle )
    {
        <span style="color:#0000ff;">return</span> MakeStyle( color, fontStyle, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Style MakeStyle( Color color, FontStyle? fontStyle, FontWeight? fontWeight )
    {
        var style = <span style="color:#0000ff;">new</span> Style();
        style.Setters.Add( <span style="color:#0000ff;">new</span> Setter( Run.ForegroundProperty, <span style="color:#0000ff;">new</span> SolidColorBrush( color ) ) );
        <span style="color:#0000ff;">if</span> ( fontStyle.HasValue ) style.Setters.Add( <span style="color:#0000ff;">new</span> Setter( Run.FontStyleProperty, fontStyle.Value ) );
        <span style="color:#0000ff;">if</span> ( fontWeight.HasValue ) style.Setters.Add( <span style="color:#0000ff;">new</span> Setter( Run.FontWeightProperty, fontWeight.Value ) );
        <span style="color:#0000ff;">return</span> style;
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> FlowDocument helpers

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the specified &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> FlowDocument Render( Exception ex )
    {
        var doc = <span style="color:#0000ff;">new</span> FlowDocument
        {
            FontFamily = <span style="color:#0000ff;">new</span> FontFamily( <span style="color:#006080;">&quot;Arial&quot;</span> ),
            FontSize = 14d,
            PagePadding = <span style="color:#0000ff;">new</span> Thickness( 0 )
        };

        doc.Blocks.AddRange( RenderExceptions( ex ) );

        <span style="color:#0000ff;">return</span> doc;
    }

    <span style="color:#0000ff;">private</span> Inline LineBreak()
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> LineBreak();
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> Rendering helpers

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt; and inner Exceptions.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Block&gt; RenderExceptions( Exception ex )
    {
        var indent = 0d;
        var hanging = ChildIndent / 2;

        <span style="color:#0000ff;">for</span> ( ; ex != <span style="color:#0000ff;">null</span>; ex = ex.InnerException )
        {
            <span style="color:#0000ff;">foreach</span> ( var block <span style="color:#0000ff;">in</span> RenderException( ex, indent, hanging ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> block;
            indent += ChildIndent;
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;indent&quot;&gt;The indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;hanging&quot;&gt;The hanging indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Block&gt; RenderException( Exception ex, <span style="color:#0000ff;">double</span> indent, <span style="color:#0000ff;">double</span> hanging )
    {
        var paragraph = <span style="color:#0000ff;">new</span> Paragraph
        {
            TextAlignment = TextAlignment.Left,
            IsHyphenationEnabled = <span style="color:#0000ff;">false</span>,
            TextIndent = -hanging,
            Margin = <span style="color:#0000ff;">new</span> Thickness( indent + hanging, 0, 0, 0 )
        };

        paragraph.Inlines.AddRange( RenderException( ex ) );

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> paragraph;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Inline&gt; RenderException( Exception ex )
    {
        <span style="color:#0000ff;">if</span> ( ex != <span style="color:#0000ff;">null</span> )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Error( ex.Message );

            <span style="color:#0000ff;">if</span> ( ex.StackTrace != <span style="color:#0000ff;">null</span> )
            {
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> RenderStackTrace( ex.StackTrace ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> method;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Inline&gt; RenderStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        <span style="color:#0000ff;">if</span> ( stackTrace != <span style="color:#0000ff;">null</span> )
        {
            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> ExceptionParser.ParseStackTrace( stackTrace ) )
            {
                <span style="color:#0000ff;">if</span> ( !first ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">foreach</span> ( var inline <span style="color:#0000ff;">in</span> RenderMethod( method ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> inline;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;method&quot;&gt;The method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Inline&gt; RenderMethod( ExceptionParser.Method method )
    {
        <span style="color:#0000ff;">foreach</span> ( var ns <span style="color:#0000ff;">in</span> method.Namespace.Split( <span style="color:#006080;">'.'</span> ) )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Namespace( ns );
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Separator( <span style="color:#006080;">&quot;.&quot;</span> );
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> MethodName( method.Name );
        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;(&quot;</span> );

        <span style="color:#0000ff;">if</span> ( method.Arguments.Length &gt; 0 )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();

            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var arg <span style="color:#0000ff;">in</span> method.Arguments )
            {
                <span style="color:#0000ff;">if</span> ( !first )
                {
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;,&quot;</span> );
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                }
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> TypeName( arg.Type );
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Argument( arg.Name );
            }

            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;)&quot;</span> );
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> IValueConverter Members

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">object</span> Convert( <span style="color:#0000ff;">object</span> <span style="color:#0000ff;">value</span>, Type targetType, <span style="color:#0000ff;">object</span> parameter, System.Globalization.CultureInfo culture )
    {
        <span style="color:#0000ff;">return</span> ( <span style="color:#0000ff;">value</span> <span style="color:#0000ff;">is</span> Exception )
            ? (<span style="color:#0000ff;">object</span>)Render( (Exception)<span style="color:#0000ff;">value</span> )
            : RenderStackTrace( <span style="color:#0000ff;">value</span> <span style="color:#0000ff;">as</span> <span style="color:#0000ff;">string</span> );
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">object</span> ConvertBack( <span style="color:#0000ff;">object</span> <span style="color:#0000ff;">value</span>, Type targetType, <span style="color:#0000ff;">object</span> parameter, System.Globalization.CultureInfo culture )
    {
        <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> NotImplementedException();
    }

    <span style="color:#cc6633;">#endregion</span>
}</pre>
</div>
<p>You can set the Style properties to change the appearance.&#160; Here’s an example that puts the stack traces inside nested Expanders:</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/05/image3.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb1.png?w=492&#038;h=250" width="492" height="250" /></a> </p>
<p>Maybe you’d prefer to render as HTML (useful for health monitoring emails etc):</p>
</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> PrettyExceptionPrint
{
    <span style="color:#cc6633;">#region</span> Properties

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> ErrorStyle = <span style="color:#006080;">&quot;PEP_Error&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Error( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, ErrorStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> NamespaceStyle = <span style="color:#006080;">&quot;PEP_Namespace&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Namespace( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, NamespaceStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> MethodNameStyle = <span style="color:#006080;">&quot;PEP_MethodName&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> MethodName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, MethodNameStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> BracketStyle = <span style="color:#006080;">&quot;PEP_Bracket&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Bracket( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, BracketStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> SeparatorStyle = <span style="color:#006080;">&quot;PEP_Separator&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Separator( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, SeparatorStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> SpaceStyle = <span style="color:#006080;">&quot;PEP_Space&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Space() { <span style="color:#0000ff;">return</span> Span( <span style="color:#006080;">&quot; &quot;</span>, SpaceStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> TypeNameStyle = <span style="color:#006080;">&quot;PEP_TypeName&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> TypeName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, TypeNameStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> ArgumentStyle = <span style="color:#006080;">&quot;PEP_Argument&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Argument( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, ArgumentStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> SourceStyle = <span style="color:#006080;">&quot;PEP_Source&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Source( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, SourceStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> LocationStyle = <span style="color:#006080;">&quot;PEP_Location&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Location( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, LocationStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">double</span> ChildIndent { get; set; }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> HTML helpers

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Span( <span style="color:#0000ff;">object</span> content )
    {
        <span style="color:#0000ff;">return</span> Span( content, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Span( <span style="color:#0000ff;">object</span> content, <span style="color:#0000ff;">string</span> css )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">string</span>.Format( <span style="color:#006080;">&quot;&lt;span{0}&gt;{1}&lt;/span&gt;&quot;</span>, <span style="color:#0000ff;">string</span>.IsNullOrEmpty( css ) ? <span style="color:#0000ff;">null</span> : <span style="color:#006080;">&quot; class='&quot;</span> + css + <span style="color:#006080;">&quot;'&quot;</span>, content );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> LineBreak()
    {
        <span style="color:#0000ff;">return</span> <span style="color:#006080;">&quot;&lt;br/&gt;\n&quot;</span>;
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> Rendering helpers

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt; and inner Exceptions.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderExceptions( Exception ex )
    {
        var indent = 0d;
        var hanging = ChildIndent / 2;

        <span style="color:#0000ff;">for</span> ( ; ex != <span style="color:#0000ff;">null</span>; ex = ex.InnerException )
        {
            <span style="color:#0000ff;">foreach</span> ( var block <span style="color:#0000ff;">in</span> RenderException( ex, indent, hanging ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> block;
            indent += ChildIndent;
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;indent&quot;&gt;The indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;hanging&quot;&gt;The hanging indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderException( Exception ex, <span style="color:#0000ff;">double</span> indent, <span style="color:#0000ff;">double</span> hanging )
    {
        <span style="color:#0000ff;">foreach</span> ( var markup <span style="color:#0000ff;">in</span> RenderException( ex ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> markup;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderException( Exception ex )
    {
        <span style="color:#0000ff;">if</span> ( ex != <span style="color:#0000ff;">null</span> )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Error( ex.Message );

            <span style="color:#0000ff;">if</span> ( ex.StackTrace != <span style="color:#0000ff;">null</span> )
            {
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> RenderStackTrace( ex.StackTrace ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> method;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        <span style="color:#0000ff;">if</span> ( stackTrace != <span style="color:#0000ff;">null</span> )
        {
            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> ExceptionParser.ParseStackTrace( stackTrace ) )
            {
                <span style="color:#0000ff;">if</span> ( !first ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">foreach</span> ( var inline <span style="color:#0000ff;">in</span> RenderMethod( method ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> inline;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;method&quot;&gt;The method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderMethod( ExceptionParser.Method method )
    {
        <span style="color:#0000ff;">foreach</span> ( var ns <span style="color:#0000ff;">in</span> method.Namespace.Split( <span style="color:#006080;">'.'</span> ) )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Namespace( ns );
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Separator( <span style="color:#006080;">&quot;.&quot;</span> );
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> MethodName( method.Name );
        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;(&quot;</span> );

        <span style="color:#0000ff;">if</span> ( method.Arguments.Length &gt; 0 )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();

            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var arg <span style="color:#0000ff;">in</span> method.Arguments )
            {
                <span style="color:#0000ff;">if</span> ( !first )
                {
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;,&quot;</span> );
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                }
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> TypeName( arg.Type );
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Argument( arg.Name );
            }

            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;)&quot;</span> );
    }

    <span style="color:#cc6633;">#endregion</span>
}</pre>
</div>
<p>Then just add some CSS for the PEP_* classes to change the appearance:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>
    html, body { font-family: Arial; }
    .PEP_Namespace { color: darkblue; }
    .PEP_MethodName { color: black; font-weight: bold; }
    .PEP_Bracket { color: darkgreen; }
    .PEP_TypeName { color: teal; }
    .PEP_Argument { color: darkred; }
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>It’ll look something like this:</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/05/image4.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb2.png?w=512&#038;h=300" width="512" height="300" /></a> </p>
</p>
<p>Rendering to XML is even easier:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> PrettyExceptionPrint
{
    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt; and inner Exceptions.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;XElement&gt; RenderExceptions( Exception ex )
    {
        <span style="color:#0000ff;">for</span> ( ; ex != <span style="color:#0000ff;">null</span>; ex = ex.InnerException ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> RenderException( ex );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> XElement RenderException( Exception ex )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Exception&quot;</span>,
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Type&quot;</span>, ex.GetType() ),
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Message&quot;</span>, ex.Message ),
            <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;StackTrace&quot;</span>, RenderStackTrace( ex.StackTrace ) ) );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;XElement&gt; RenderStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        <span style="color:#0000ff;">return</span> from method <span style="color:#0000ff;">in</span> ExceptionParser.ParseStackTrace( stackTrace )
               select RenderMethod( method );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;method&quot;&gt;The method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> XElement RenderMethod( ExceptionParser.Method method )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Method&quot;</span>,
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Namespace&quot;</span>, method.Namespace ),
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Name&quot;</span>, method.Name ),
            <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Arguments&quot;</span>,
                from arg <span style="color:#0000ff;">in</span> method.Arguments
                select <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Argument&quot;</span>,
                    <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Type&quot;</span>, arg.Type ),
                    <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Name&quot;</span>, arg.Name ) ) ) );
    }
}</pre>
</div>
<p>Then you could transform it to HTML with some XSLT like this:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;?</span><span style="color:#800000;">xml</span> <span style="color:#ff0000;">version</span><span style="color:#0000ff;">=&quot;1.0&quot;</span> <span style="color:#ff0000;">encoding</span><span style="color:#0000ff;">=&quot;UTF-8&quot;</span> ?<span style="color:#0000ff;">&gt;</span>

<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:stylesheet</span> <span style="color:#ff0000;">version</span><span style="color:#0000ff;">=&quot;1.0&quot;</span> <span style="color:#ff0000;">xmlns:xsl</span><span style="color:#0000ff;">=&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span style="color:#ff0000;">exclude-result-prefixes</span><span style="color:#0000ff;">=&quot;xsl&quot;</span><span style="color:#0000ff;">&gt;</span>

    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:output</span> <span style="color:#ff0000;">method</span><span style="color:#0000ff;">=&quot;html&quot;</span><span style="color:#0000ff;">/&gt;</span>

    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:variable</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;lineFeed&quot;</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;'&amp;#xD;&amp;#xA;'&quot;</span><span style="color:#0000ff;">/&gt;</span>

    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:template</span> <span style="color:#ff0000;">match</span><span style="color:#0000ff;">=&quot;/&quot;</span><span style="color:#0000ff;">&gt;</span>

        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>
            p.exception { border: 1px solid #AAAAAA; background-color: #FFAEB9; padding: 4px; }
            table.error { border: 1px solid lightsteelblue; border-collapse: collapse; font-size: 9pt; margin-bottom: 8px; }
            table.error th { text-align: left; background-color: lightsteelblue; padding: 4px 4px 4px 4px; }
            table.error td { border: 1px solid lightsteelblue; padding: 4px 4px 4px 4px; }
            .title { background-color: white; }
            .namespace { color: navy; }
            .method { font-weight: bold; }
            .type { color: green; }
            .var { color: gray; }
            .trace { padding-left: 2em; text-indent: -2em; font-size: 8pt; }
        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>

        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:copy-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;Exceptions/Header/*&quot;</span><span style="color:#0000ff;">/&gt;</span>

        <span style="color:#008000;">&lt;!--</span>
<span style="color:#008000;">        &lt;Exceptions&gt;</span>
<span style="color:#008000;">            &lt;Exception Type=&quot;type&quot; Message=&quot;message&quot;&gt;</span>
<span style="color:#008000;">                &lt;StackTrace&gt;</span>
<span style="color:#008000;">                    &lt;Method Namespace=&quot;namespace&quot; Type=&quot;type&quot; Method=&quot;method&quot;&gt;</span>
<span style="color:#008000;">                        &lt;Argument Type=&quot;type&quot; Name=&quot;name&quot;/&gt;</span>
<span style="color:#008000;">                    &lt;/Method&gt;</span>
<span style="color:#008000;">                &lt;/StackTrace&gt;</span>
<span style="color:#008000;">            &lt;/Exception&gt;</span>
<span style="color:#008000;">        &lt;/Exceptions&gt;</span>
<span style="color:#008000;">        --&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:for-each</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;Exceptions/Exception&quot;</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">table</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;error&quot;</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">th</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">/&gt;</span>
                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">th</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Message&quot;</span><span style="color:#0000ff;">/&gt;</span>
                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;StackTrace/Method&quot;</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span> <span style="color:#ff0000;">colspan</span><span style="color:#0000ff;">=&quot;2&quot;</span><span style="color:#0000ff;">&gt;</span>
                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:for-each</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;StackTrace/Method&quot;</span><span style="color:#0000ff;">&gt;</span>
                                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;trace&quot;</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;namespace&quot;</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;@Namespace&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Namespace&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>.<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>.<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;method&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Method&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>(<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:for-each</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;Parameter&quot;</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span>=&quot;<span style="color:#ff0000;">position</span>()<span style="color:#0000ff;">&gt;</span>1&quot;<span style="color:#0000ff;">&gt;</span>,<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span> <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;type&quot;</span><span style="color:#0000ff;">&gt;</span>
                                                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                            <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span> <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;var&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Name&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:for-each</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span> )<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span>
                            <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:for-each</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">table</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:for-each</span><span style="color:#0000ff;">&gt;</span>

    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:template</span><span style="color:#0000ff;">&gt;</span>

<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:stylesheet</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/373/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=373&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Disabling HTML Input Elements</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/28/disabling-html-input-elements/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/28/disabling-html-input-elements/#comments</comments>
		<pubDate>Thu, 28 May 2009 19:36:21 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/28/disabling-html-input-elements/</guid>
		<description><![CDATA[If you’re using IE, you can disable all input elements inside a div by setting “disabled=true”.&#160; Unfortunately (thanks to standards compliance nonsense   ) it doesn’t work anywhere else.
If you’re using jQuery, take a look here.&#160; If not, this bit of script might help:

function SetDisabledStates( container, newStates )
{
    var states = [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=369&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>If you’re using IE, you can disable all input elements inside a div by setting “disabled=true”.&#160; Unfortunately (thanks to standards compliance nonsense <img src='http://s.wordpress.com/wp-includes/images/smilies/face-wink.png' alt=';)' class='wp-smiley' />  ) it doesn’t work anywhere else.</p>
<p>If you’re using jQuery, take a look <a title="Disable and enable inputs using jQuery" href="http://techchorus.net/disable-and-enable-input-elements-div-block-using-jquery" target="_blank">here</a>.&#160; If not, this bit of script might help:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">function</span> SetDisabledStates( container, newStates )
{
    <span style="color:#0000ff;">var</span> states = [];

    <span style="color:#0000ff;">var</span> replace = <span style="color:#0000ff;">function</span>( element )
    {
        states[ element.id ] = element.disabled;
        element.disabled = isArray( newStates ) ? newStates[ element.id ] : newStates;
    };

    <span style="color:#0000ff;">var</span> inputs = container.getElementsByTagName(<span style="color:#006080;">&quot;input&quot;</span>);
    <span style="color:#0000ff;">for</span> ( <span style="color:#0000ff;">var</span> i = 0; i &lt; inputs.length; ++ i ) replace( inputs[ i ] );

    <span style="color:#0000ff;">var</span> selects = container.getElementsByTagName( <span style="color:#006080;">&quot;select&quot;</span> );
    <span style="color:#0000ff;">for</span> ( <span style="color:#0000ff;">var</span> i = 0; i &lt; selects.length; ++ i ) replace( selects[ i ] );

    <span style="color:#0000ff;">return</span> states;
}

<span style="color:#0000ff;">function</span> isArray( obj )
{
   <span style="color:#0000ff;">return</span> obj.constructor.toString().indexOf(<span style="color:#006080;">&quot;Array&quot;</span>) != -1;
}</pre>
</div>
<p>To preserve and override the states, do something like this:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;height:41px;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">

<span style="color:#0000ff;">var</span> disabledStates = SetDisabledStates( myContainer, <span style="color:#0000ff;">true</span> );

&#160;
</pre>
</div>
<p>Then to restore the states, do this:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;height:35px;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">

SetDisabledStates( myContainer, disabledStates );

&#160;
</pre>
</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/369/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/369/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/369/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/369/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/369/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/369/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/369/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/369/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/369/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/369/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=369&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/28/disabling-html-input-elements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>HomeLight &#8211; 100% Silverlight website, plus physics</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/22/homelight-100-silverlight-website-physics/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/22/homelight-100-silverlight-website-physics/#comments</comments>
		<pubDate>Sat, 23 May 2009 00:27:10 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/22/homelight-100-silverlight-website-physics/</guid>
		<description><![CDATA[Speaks for itself: http://rene-schulte.info/  &#160; It almost works with Moonlight Preview 3 too! (fingers crossed Preview 4 will nail it   ).
Unfortunately I didn’t write or have anything to do with the site; I just thought it looked cool  
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=365&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Speaks for itself: <a title="http://rene-schulte.info/" href="http://rene-schulte.info/">http://rene-schulte.info/</a> <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' /> &#160; It <em>almost</em> works with <a title="Moonlight 2.0" href="http://www.mono-project.com/Moonlight/Preview" target="_blank">Moonlight Preview 3</a> too! (fingers crossed Preview 4 will nail it <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' />  ).</p>
<p>Unfortunately I didn’t write or have anything to do with the site; I just thought it looked cool <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/365/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=365&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/22/homelight-100-silverlight-website-physics/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>ASP.NET 4.0 Beta 1 and IIS App Pools</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/21/asp-net-4-0-beta-1-and-iis-app-pools/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/21/asp-net-4-0-beta-1-and-iis-app-pools/#comments</comments>
		<pubDate>Thu, 21 May 2009 16:42:41 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/21/asp-net-4-0-beta-1-and-iis-app-pools/</guid>
		<description><![CDATA[If you install .NET 4.0 Beta 1 on a machine that also needs to run ASP.NET 1.1 applications, you may need to tweak some IIS settings.&#160; The Beta 1 installer appears to assign .NET 4.0 to all existing application pools.&#160; Make sure your ASP.NET 1.1 pool looks like this:
 
Hope this helps!  
  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=364&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>If you install .NET 4.0 Beta 1 on a machine that also needs to run ASP.NET 1.1 applications, you may need to tweak some IIS settings.&#160; The Beta 1 installer appears to assign .NET 4.0 to all existing application pools.&#160; Make sure your ASP.NET 1.1 pool looks like this:</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/05/image2.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb.png?w=500&#038;h=297" width="500" height="297" /></a> </p>
<p>Hope this helps! <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/364/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=364&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/21/asp-net-4-0-beta-1-and-iis-app-pools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>ASP.NET WebForm Routing with SiteMaps</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/19/asp-net-webform-routing-with-sitemaps/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/19/asp-net-webform-routing-with-sitemaps/#comments</comments>
		<pubDate>Wed, 20 May 2009 04:36:08 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/19/asp-net-webform-routing-with-sitemaps/</guid>
		<description><![CDATA[I’ve updated my ASP.NET WebForm Routing demo with basic SiteMap support.&#160; It’s targeting ASP.NET 3.5 SP1 and expects your WebForm (Page) to implement the IRoutablePage interface (or you can derive from RoutablePage).&#160; If you’re using ASP.NET 4.0 you can omit this dependency (as RequestContext is already available on the Page   ).
SiteMap raises the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=357&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I’ve updated my <a title="ASP.NET Routing - Goodbye URL Rewriting?" href="http://chriscavanagh.wordpress.com/2008/03/11/aspnet-routing-goodbye-url-rewriting/" target="_blank">ASP.NET WebForm Routing</a> <a title="Simple ASP.NET Routing demo" href="http://www.chriscavanagh.com/chris/SimpleRoutingTest" target="_blank">demo</a> with basic SiteMap support.&#160; It’s targeting ASP.NET 3.5 SP1 and expects your WebForm (<a title="System.Web.UI.Page on MSDN" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.aspx" target="_blank">Page</a>) to implement the IRoutablePage interface (or you can derive from RoutablePage).&#160; If you’re using ASP.NET 4.0 you can omit this dependency (as RequestContext is already available on the Page <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' />  ).</p>
<p>SiteMap raises the SiteMapResolve event whenever its CurrentNode property is read.&#160; This gives you an opportunity to determine the current node based on the route, without requiring a custom SiteMapProvider.&#160; The example below takes the current route URL, removes any route values and looks for a matching SiteMapNode:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">private</span> SiteMapNode SiteMap_SiteMapResolve( <span style="color:#0000ff;">object</span> sender, SiteMapResolveEventArgs e )
{
    var routable = e.Context.CurrentHandler <span style="color:#0000ff;">as</span> IRoutablePage;

    <span style="color:#0000ff;">if</span> ( routable != <span style="color:#0000ff;">null</span> )
    {
        var rc = routable.Routing.RequestContext;
        var route = rc.RouteData.Route;
        var segments = route.GetVirtualPath( rc, <span style="color:#0000ff;">null</span> ).VirtualPath.Split( <span style="color:#006080;">'/'</span> );
        var path = <span style="color:#006080;">&quot;~/&quot;</span> + <span style="color:#0000ff;">string</span>.Join( <span style="color:#006080;">&quot;/&quot;</span>, segments.Take( segments.Length - rc.RouteData.Values.Count ).ToArray() );

        <span style="color:#0000ff;">return</span> SiteMap.Provider.FindSiteMapNodeFromKey( path );
    }

    <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">null</span>;
}</pre>
</div>
<p>You create a .sitemap file in the usual way, but put your “routed” URLs in instead:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;?</span><span style="color:#800000;">xml</span> <span style="color:#ff0000;">version</span><span style="color:#0000ff;">=&quot;1.0&quot;</span> <span style="color:#ff0000;">encoding</span><span style="color:#0000ff;">=&quot;utf-8&quot;</span> ?<span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">siteMap</span> <span style="color:#ff0000;">xmlns</span><span style="color:#0000ff;">=&quot;http://schemas.microsoft.com/AspNet/SiteMap-File-1.0&quot;</span> <span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">siteMapNode</span> <span style="color:#ff0000;">url</span><span style="color:#0000ff;">=&quot;~/&quot;</span> <span style="color:#ff0000;">title</span><span style="color:#0000ff;">=&quot;Home&quot;</span> <span style="color:#ff0000;">description</span><span style="color:#0000ff;">=&quot;Home&quot;</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">siteMapNode</span> <span style="color:#ff0000;">url</span><span style="color:#0000ff;">=&quot;~/Search&quot;</span> <span style="color:#ff0000;">title</span><span style="color:#0000ff;">=&quot;Search&quot;</span> <span style="color:#ff0000;">description</span><span style="color:#0000ff;">=&quot;Search&quot;</span> <span style="color:#0000ff;">/&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">siteMapNode</span> <span style="color:#ff0000;">url</span><span style="color:#0000ff;">=&quot;~/Details&quot;</span> <span style="color:#ff0000;">title</span><span style="color:#0000ff;">=&quot;Details&quot;</span> <span style="color:#ff0000;">description</span><span style="color:#0000ff;">=&quot;Details&quot;</span> <span style="color:#0000ff;">/&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">siteMapNode</span> <span style="color:#ff0000;">url</span><span style="color:#0000ff;">=&quot;~/NoMaster&quot;</span> <span style="color:#ff0000;">title</span><span style="color:#0000ff;">=&quot;No Master&quot;</span> <span style="color:#ff0000;">description</span><span style="color:#0000ff;">=&quot;No Master&quot;</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">siteMapNode</span> <span style="color:#ff0000;">url</span><span style="color:#0000ff;">=&quot;~/NoMaster/MySub&quot;</span> <span style="color:#ff0000;">title</span><span style="color:#0000ff;">=&quot;My Subpage&quot;</span> <span style="color:#ff0000;">description</span><span style="color:#0000ff;">=&quot;My Subpage&quot;</span><span style="color:#0000ff;">/&gt;</span>
        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">siteMapNode</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">siteMapNode</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">siteMap</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>You can use the regular <a title="SiteMapPath on MSDN" href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sitemappath.aspx" target="_blank">SiteMapPath</a> control to show the current location.&#160; However, you might prefer to render your own.&#160; The sample project includes a couple of helper methods to achieve just that:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Gets SiteMap path for the current request.</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> SiteMapPath()
{
    var pages = SiteMap.CurrentNode.For( n =&gt; n != <span style="color:#0000ff;">null</span>, n =&gt; n.ParentNode ).Reverse().Select( n =&gt; SiteMapLink( n ) );

    <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">string</span>.Join( <span style="color:#006080;">&quot; &gt; &quot;</span>, pages.ToArray() );
}

<span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Gets a SiteMap link.</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#008000;">/// &lt;param name=&quot;node&quot;&gt;The node.&lt;/param&gt;</span>
<span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> SiteMapLink( SiteMapNode node )
{
    var span = <span style="color:#0000ff;">string</span>.Format( <span style="color:#006080;">&quot;&lt;span class=\&quot;siteMapLink\&quot;&gt;{0}&lt;/span&gt;&quot;</span>, node.Title );

    <span style="color:#0000ff;">return</span> ( node != SiteMap.CurrentNode )
        ? <span style="color:#0000ff;">string</span>.Format( <span style="color:#006080;">&quot;&lt;a href=\&quot;{0}\&quot;&gt;{1}&lt;/a&gt;&quot;</span>, node.Url, span )
        : span;
}</pre>
</div>
<p>You can read more about the “For” extension method in <a title="More extension methods" href="http://chriscavanagh.wordpress.com/2009/05/18/more-extension-methods/" target="_blank">my earlier post</a>.</p>
<p>Source code for the sample project is <a title="ASP.NET 3.5 Routing sample project on CodePlex" href="http://aspnet35routing.codeplex.com/SourceControl/ListDownloadableCommits.aspx" target="_blank">available on CodePlex</a>.&#160; You can try the demo online <a title="Simple ASP.NET Routing demo" href="http://www.chriscavanagh.com/chris/SimpleRoutingTest" target="_blank">right here</a> <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' />  .</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/357/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=357&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/19/asp-net-webform-routing-with-sitemaps/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>IF + Silverlight + Linux &#8230; Almost!</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/19/if-silverlight-linux-almost/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/19/if-silverlight-linux-almost/#comments</comments>
		<pubDate>Tue, 19 May 2009 06:04:11 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/19/if-silverlight-linux-almost/</guid>
		<description><![CDATA[Using the latest preview of Moonlight 2.0, SilverGlulxe (Interactive Fiction interpreter) is [almost] running on Linux!
Here’s what it currently looks like:
 
Text is missing formatting (there should be some bold and italic in there) and the Enter key doesn’t work, which makes it tricky to give it commands  &#160; Also the scale slider has [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=356&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Using the latest preview of Moonlight 2.0, <a title="SilverGlulxe (Silverlight IF interpreter)" href="http://chriscavanagh.wordpress.com/2009/03/23/silverglulxe-interactive-fiction-in-silverlight/" target="_blank">SilverGlulxe (Interactive Fiction interpreter)</a> is [almost] running on Linux!</p>
<p>Here’s what it currently looks like:</p>
<p><a title="SilverGlulxe" href="http://www.chriscavanagh.com/chris/SilverGlulxe/SilverGlulxeTestPage.aspx" target="_blank"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/05/image1.png?w=478&#038;h=551" width="478" height="551" /></a> </p>
<p>Text is missing formatting (there should be some bold and italic in there) and the Enter key doesn’t work, which makes it tricky to give it commands <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' /> &#160; Also the scale slider has some issues (text not reformatting to fit when it’s resized).&#160; Other than that it’s looking great!</p>
<p>SilverGlulxe does some interesting things with threads, so it could be that’s behind the “Enter issue”.&#160; I’ll probably wait a few more [Moonlight] previews, then have a closer look at my code… <img src='http://s.wordpress.com/wp-includes/images/smilies/face-smile.png' alt=':)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/356/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=356&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/19/if-silverlight-linux-almost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/05/image1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>More Extension Methods</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/18/more-extension-methods/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/18/more-extension-methods/#comments</comments>
		<pubDate>Tue, 19 May 2009 05:35:17 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/18/more-extension-methods/</guid>
		<description><![CDATA[
Here are a couple more extension methods you may find useful:
Collection splitter:
Split a collection into a sequence of fixed-size groups:

/// &#60;summary&#62;
/// Splits the specified items into fixed-size groups.
/// &#60;/summary&#62;
/// &#60;typeparam name=&#34;T&#34;&#62;&#60;/typeparam&#62;
/// &#60;param name=&#34;source&#34;&#62;The source.&#60;/param&#62;
/// &#60;param name=&#34;size&#34;&#62;The group size.&#60;/param&#62;
/// &#60;returns&#62;Returns collection of groups.&#60;/returns&#62;
public static IEnumerable&#60;IGrouping&#60;int, T&#62;&#62; Split&#60;T&#62;( this IEnumerable&#60;T&#62; source, int size )
{
    [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=352&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /></p>
<p>Here are a couple more extension methods you may find useful:</p>
<h5>Collection splitter:</h5>
<p>Split a collection into a sequence of fixed-size groups:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Splits the specified items into fixed-size groups.</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#008000;">/// &lt;typeparam name=&quot;T&quot;&gt;&lt;/typeparam&gt;</span>
<span style="color:#008000;">/// &lt;param name=&quot;source&quot;&gt;The source.&lt;/param&gt;</span>
<span style="color:#008000;">/// &lt;param name=&quot;size&quot;&gt;The group size.&lt;/param&gt;</span>
<span style="color:#008000;">/// &lt;returns&gt;Returns collection of groups.&lt;/returns&gt;</span>
<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;IGrouping&lt;<span style="color:#0000ff;">int</span>, T&gt;&gt; Split&lt;T&gt;( <span style="color:#0000ff;">this</span> IEnumerable&lt;T&gt; source, <span style="color:#0000ff;">int</span> size )
{
    var index = 0d;

    <span style="color:#0000ff;">return</span> source.GroupBy( v =&gt; (<span style="color:#0000ff;">int</span>)( ( index++ ) / size ) );
}</pre>
</div>
<p>You could use it like this:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">var items = <span style="color:#0000ff;">new</span>[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
var chunks = items.Split( 5 );
</pre>
<p>
</div>
<h5>“For” enumerator:</h5>
<p>Generate a sequence of elements like a for loop:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Generates a sequence of elements while &lt;paramref name=&quot;predicate&quot;/&gt; is &lt;see cref=&quot;true&quot;/&gt;.</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#008000;">/// &lt;typeparam name=&quot;T&quot;&gt;&lt;/typeparam&gt;</span>
<span style="color:#008000;">/// &lt;param name=&quot;value&quot;&gt;The initial value.&lt;/param&gt;</span>
<span style="color:#008000;">/// &lt;param name=&quot;predicate&quot;&gt;A predicate to control continuation of the sequence.&lt;/param&gt;</span>
<span style="color:#008000;">/// &lt;param name=&quot;selector&quot;&gt;A function to retrieve the next element.&lt;/param&gt;</span>
<span style="color:#008000;">/// &lt;returns&gt;Returns a sequence of elements.&lt;/returns&gt;</span>
<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;T&gt; For&lt;T&gt;( <span style="color:#0000ff;">this</span> T <span style="color:#0000ff;">value</span>, Predicate&lt;T&gt; predicate, Func&lt;T, T&gt; selector )
{
    <span style="color:#0000ff;">while</span> ( predicate != <span style="color:#0000ff;">null</span> &amp;&amp; predicate( <span style="color:#0000ff;">value</span> ) )
    {
        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">value</span>;

        <span style="color:#0000ff;">value</span> = ( selector != <span style="color:#0000ff;">null</span> ) ? selector( <span style="color:#0000ff;">value</span> ) : <span style="color:#0000ff;">default</span>( T );
    }
}</pre>
</div>
<p>It’s good for making non-enumerable sequences enumerable:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">var pages = SiteMap.CurrentNode.For( n =&gt; n != <span style="color:#0000ff;">null</span>, n =&gt; n.ParentNode ).Reverse();

<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">string</span>.Join( <span style="color:#006080;">&quot; &gt; &quot;</span>, pages.Select( p =&gt; p.Title ).ToArray() );
</pre>
<p>
</div>
</p>
<p>Comments, suggestions and improvements always welcome!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/352/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=352&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/18/more-extension-methods/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
	</channel>
</rss>