<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Jason Conway</title><subtitle type="html">just trying to help</subtitle><id>http://weblogs.asp.net/jasonconway/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/jasonconway/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2007-10-20T17:20:00Z</updated><entry><title>Include and Exclude Constraints in ASP.NET MVC</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/archive/2009/10/23/include-and-exclude-constraints-in-asp-net-mvc.aspx" /><id>http://weblogs.asp.net/jasonconway/archive/2009/10/23/include-and-exclude-constraints-in-asp-net-mvc.aspx</id><published>2009-10-24T00:02:20Z</published><updated>2009-10-24T00:02:20Z</updated><content type="html">&lt;p&gt;Otherwise known as a white list or black list for route tokens, this simple &lt;a title="IRouteConstraint" href="http://msdn.microsoft.com/en-us/library/system.web.routing.irouteconstraint.aspx" target="_blank"&gt;IRouteConstraint&lt;/a&gt; is coming in handy and I thought i would share:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;   &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; height: 470px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;enum&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ListConstraintType&lt;/span&gt; {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Exclude,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Include&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ListConstraint&lt;/span&gt; : IRouteConstraint {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; ListConstraintType ListType { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; IList&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt; List { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; ListConstraint() : &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;(ListConstraintType.Include, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] { }) { }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; ListConstraint(&lt;span style="color:#0000ff"&gt;params&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] list) : &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;(ListConstraintType.Include, list) { }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; ListConstraint(ListConstraintType listType, &lt;span style="color:#0000ff"&gt;params&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] list) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (list == &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#a31515"&gt;&amp;quot;list&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ListType = listType;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.List = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(list);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; Match(HttpContextBase httpContext, Route route, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; parameterName, RouteValueDictionary values, RouteDirection routeDirection) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(parameterName)) &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#a31515"&gt;&amp;quot;parameterName&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (values == &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#a31515"&gt;&amp;quot;values&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; value = values[parameterName.ToLower()] &lt;span style="color:#0000ff"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; found = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.List.Any(s =&amp;gt; s.Equals(value, StringComparison.OrdinalIgnoreCase));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ListType == ListConstraintType.Include ? found : !found;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;You can then use the ListConstraint like this:&lt;/p&gt;   &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; RegisterRoutes(RouteCollection routes) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;routes.IgnoreRoute(&lt;span style="color:#a31515"&gt;&amp;quot;{resource}.axd/{*pathInfo}&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;routes.IgnoreRoute(&lt;span style="color:#a31515"&gt;&amp;quot;content/{*pathInfo}&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;routes.IgnoreRoute(&lt;span style="color:#a31515"&gt;&amp;quot;favicon.ico&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;routes.MapRoute(&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&amp;quot;UserShortcuts&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&amp;quot;{action}/{id}&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color:#a31515"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;, id = &lt;span style="color:#a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt; },&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; { action = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ListConstraint(ListConstraintType.Include, &lt;span style="color:#a31515"&gt;&amp;quot;signin&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;signout&amp;quot;&lt;/span&gt;) }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;routes.MapRoute(&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&amp;quot;HomeShortcuts&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&amp;quot;{action}&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color:#a31515"&gt;&amp;quot;home&amp;quot;&lt;/span&gt; },&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; { action = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ListConstraint(&lt;span style="color:#a31515"&gt;&amp;quot;sitemap&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;contact&amp;quot;&lt;/span&gt;) } &lt;span style="color:#008000"&gt;//default Include&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;routes.MapRoute(&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&amp;quot;Default&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&amp;quot;{controller}/{action}/{id}&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color:#a31515"&gt;&amp;quot;home&amp;quot;&lt;/span&gt;, action = &lt;span style="color:#a31515"&gt;&amp;quot;index&amp;quot;&lt;/span&gt;, id = &lt;span style="color:#a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt; },&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; { id = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ListConstraint(ListConstraintType.Exclude, &lt;span style="color:#a31515"&gt;&amp;quot;123&amp;quot;&lt;/span&gt;) }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Application_Start() {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;RegisterRoutes(RouteTable.Routes);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p&gt;Which then allows only those included constraints to use the UserShortcuts route:&lt;/p&gt; &lt;img border="0" align="middle" src="http://weblogs.asp.net/blogs/jasonconway/shortcutsignin.jpg" /&gt;   &lt;p&gt;Or prevents the id of &lt;strong&gt;123&lt;/strong&gt; from being used on the Default route:&lt;/p&gt; &lt;img border="0" align="middle" src="http://weblogs.asp.net/blogs/jasonconway/id123404.jpg" /&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hope folks find this useful,&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Jason Conway&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7237506" width="1" height="1"&gt;</content><author><name>nicequy</name><uri>http://weblogs.asp.net/members/nicequy.aspx</uri></author></entry><entry><title>Aliasing and Localizing Routes in ASP.NET MVC</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/archive/2009/10/22/aliasing-and-localizing-routes-in-asp-net-mvc.aspx" /><id>http://weblogs.asp.net/jasonconway/archive/2009/10/22/aliasing-and-localizing-routes-in-asp-net-mvc.aspx</id><published>2009-10-22T19:35:15Z</published><updated>2009-10-22T19:35:15Z</updated><content type="html">&lt;p&gt;I had come across a forum post where someone wanted to localize urls in the RouteTable and I thought I would come up with my first stab at a better solution.&amp;#160; What I discovered turned out to be a pretty simple way of what I am calling ‘Aliasing Routes’ where a route token can have an alias value as a localized value.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/jasonconway/Salient6.MvcSamples.zip"&gt;&lt;img border="0" align="middle" src="http://weblogs.asp.net/blogs/jasonconway/download.gif" /&gt;&lt;span style="margin-left: 5px"&gt;&lt;strong&gt;DOWNLOAD&lt;/strong&gt; – My entire MvcSamples VSTS solution&lt;/span&gt;&lt;/a&gt; (complete with Moq and 100% code coverage)&lt;/p&gt;  &lt;p&gt;This is how you do it (the complete source is available for download above):&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Step 1: Persistence&lt;/u&gt;&lt;/strong&gt; – we need a way to store the aliases, so I created a custom &lt;a title="ConfigurationSection" href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationsection.aspx" target="_blank"&gt;ConfigurationSection&lt;/a&gt; (an external file or database would also work) that looks like this when complete:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;     &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; white-space: nowrap; background: #ffffff; padding-top: 0px"&gt;       &lt;li&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;aliasRoutes&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;routes&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;token&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;controller&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;home&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;aliases&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;inicio, beginning, baile, start&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;token&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;controller&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;about&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;aliases&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;info, sobre, more, additional&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;token&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;action&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;signin&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;aliases&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;login, logon, ingresar, anmelden&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;routes&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;aliasRoutes&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Step 2: Module&lt;/u&gt;&lt;/strong&gt; – we need a way to inspect route data and change route values when applicable, so I derived from &lt;a title="UrlRoutingModule" href="http://msdn.microsoft.com/en-us/library/system.web.routing.urlroutingmodule.aspx" target="_blank"&gt;UrlRoutingModule&lt;/a&gt; that looks like this when complete:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="background: #ddd; height: 850px; overflow: auto"&gt;     &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; white-space: nowrap; background: #ffffff; padding-top: 0px"&gt;       &lt;li&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AliasRoutingModule&lt;/span&gt; : UrlRoutingModule { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; itemsKey = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;(); &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RequestInfo&lt;/span&gt; { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; OriginalPath { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; } &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IHttpHandler HttpHandler { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; } &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PostMapRequestHandler(HttpContextBase context) { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Guard.AgainstNullParameter(context, &lt;span style="color: #a31515"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RequestInfo info = context.Items[itemsKey] &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; RequestInfo; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (info == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.RewritePath(info.OriginalPath); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Handler = info.HttpHandler; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PostResolveRequestCache(HttpContextBase context) { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Guard.AgainstNullParameter(context, &lt;span style="color: #a31515"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RouteData routeData = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.RouteCollection.GetRouteData(context); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (routeData == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IRouteHandler routeHandler = routeData.RouteHandler; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (routeHandler == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span style="color: #a31515"&gt;&amp;quot;No RouteHandler identified&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (routeHandler &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; StopRoutingHandler) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IDictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; values = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;(routeData.Values); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AliasRoutesSection section = SectionRepository.Current.AliasRoutes; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;//*** magic happens here&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; token &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; values.Keys) { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; alias = values[token].ToString(); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value = section.Routes.GetValue(token, alias); &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (value != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) routeData.Values[token] = value; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RequestContext requestContext = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RequestContext(context, routeData); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (httpHandler == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&lt;span style="color: #a31515"&gt;&amp;quot;No HttpHandler identified&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RequestInfo info = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RequestInfo { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OriginalPath = context.Request.Path, &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HttpHandler = httpHandler &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Items[itemsKey] = info; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.RewritePath(&lt;span style="color: #a31515"&gt;&amp;quot;~/UrlRouting.axd&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;        &lt;li&gt;} &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Step 3: Web Config&lt;/u&gt;&lt;/strong&gt; – need to change our UrlRoutingModule registration in the web.config to the new AliasRoutingModule:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="background: #ddd; height: 130px; overflow: auto"&gt;     &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; white-space: nowrap; background: #ffffff; padding-top: 0px"&gt;       &lt;li&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;ScriptModule&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;AliasRoutingModule&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;Salient6.MvcSamples.Web.Modules.AliasRoutingModule&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;        &lt;li&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.web&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Step 4: RegisterRoutes&lt;/u&gt;&lt;/strong&gt; – our Global stays clean and manageable:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;     &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; white-space: nowrap; background: #ffffff; padding-top: 0px"&gt;       &lt;li&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RegisterRoutes(RouteCollection routes) { &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; routes.IgnoreRoute(&lt;span style="color: #a31515"&gt;&amp;quot;{resource}.axd/{*pathInfo}&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; routes.IgnoreRoute(&lt;span style="color: #a31515"&gt;&amp;quot;content/{*pathInfo}&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; routes.IgnoreRoute(&lt;span style="color: #a31515"&gt;&amp;quot;favicon.ico&amp;quot;&lt;/span&gt;); &lt;/li&gt;        &lt;li&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; routes.MapRoute( &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;Default&amp;quot;&lt;/span&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;{controller}/{action}/{id}&amp;quot;&lt;/span&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515"&gt;&amp;quot;home&amp;quot;&lt;/span&gt;, action = &lt;span style="color: #a31515"&gt;&amp;quot;index&amp;quot;&lt;/span&gt;, id = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt; } &lt;/li&gt;        &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; ); &lt;/li&gt;        &lt;li&gt;} &lt;/li&gt;     &lt;/ol&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Step 5: Browser&lt;/u&gt;&lt;/strong&gt; – we should be able to get to the Home Controller now by navigating to /start:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Alias Route Start" border="0" alt="Alias Route Start" src="http://weblogs.asp.net/blogs/jasonconway/aliasroutestart.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;OR&lt;/strong&gt; something &lt;u&gt;way cooler&lt;/u&gt; like /inicio/anmelden&amp;#160; which is a combination of Controller and Action aliases!&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Alias Route Start" border="0" alt="Alias Route Start" src="http://weblogs.asp.net/blogs/jasonconway/aliasroutesignin.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;What’s nice about this is you can alias and/or localize your url without having to MapRoute, you can make changes in the config without having to recompile, and you can mix and match aliases as long as they resolve to a valid endpoint!&lt;/p&gt;  &lt;p&gt;Anyway, I hope folks find this useful!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Jason Conway&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fjasonconway%2farchive%2f2009%2f10%2f22%2faliasing-and-localizing-routes-in-asp-net-mvc.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fjasonconway%2farchive%2f2009%2f10%2f22%2faliasing-and-localizing-routes-in-asp-net-mvc.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7236259" width="1" height="1"&gt;</content><author><name>nicequy</name><uri>http://weblogs.asp.net/members/nicequy.aspx</uri></author><category term="route" scheme="http://weblogs.asp.net/jasonconway/archive/tags/route/default.aspx" /><category term="asp.net mvc" scheme="http://weblogs.asp.net/jasonconway/archive/tags/asp.net+mvc/default.aspx" /><category term="localize" scheme="http://weblogs.asp.net/jasonconway/archive/tags/localize/default.aspx" /><category term="alias" scheme="http://weblogs.asp.net/jasonconway/archive/tags/alias/default.aspx" /></entry><entry><title>Using the ConwayControls RadioButton - Scenario 2</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/archive/2008/05/11/using-the-conwaycontrols-radiobutton-scenario-2.aspx" /><id>http://weblogs.asp.net/jasonconway/archive/2008/05/11/using-the-conwaycontrols-radiobutton-scenario-2.aspx</id><published>2008-05-11T19:34:36Z</published><updated>2008-05-11T19:34:36Z</updated><content type="html">&lt;div class="scenariodescription"&gt; 	&lt;h3&gt;Scenario&lt;/h3&gt; 	&lt;span&gt;Upon a simple asp:Button click event (postback), iterate the rows of a GridView finding the checked RadioButton&lt;span&gt; &lt;/div&gt;   &lt;p&gt;&lt;/p&gt; &lt;div class="downloadsection"&gt;&lt;a href="http://weblogs.asp.net/blogs/jasonconway/Radio%20Button%20-%20Scenario%202.zip" title="download sample files"&gt;&lt;img src="http://weblogs.asp.net/blogs/jasonconway/download.gif" border="0" align="middle" title="download" /&gt;&lt;span&gt;Radio Button Files - Scenario 2&lt;span&gt;&lt;/a&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;h4 class="contentgroup"&gt;ASP.NET - &lt;span&gt;RadioButtonSpike2.aspx&lt;/span&gt;&lt;/h4&gt;  &lt;div class="csharpcode-wrapper"&gt;&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="RadioButtonSpike2.aspx.cs" 
      Inherits="RadioButtonSpike2" %&amp;gt;&lt;/span&gt;

&lt;span class="asp"&gt;&amp;lt;%@ Register Assembly="ConwayControls" Namespace="ConwayControls.Web" TagPrefix="ccwc" %&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;"-//W3C//DTD XHTML 1.0 Strict//EN"&lt;/span&gt; &lt;span class="kwrd"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.w3.org/1999/xhtml"&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Radio Button Spike - Scenario 2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/css"&lt;/span&gt; &lt;span class="attr"&gt;media&lt;/span&gt;&lt;span class="kwrd"&gt;="all"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            div {padding-top: 10px;}
            h3 {display: inline;}
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;        
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="RadioButtonSpikeForm"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:GridView&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="SurveyGrid"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;="False"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Columns&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt; &lt;span class="attr"&gt;HeaderText&lt;/span&gt;&lt;span class="kwrd"&gt;="Language"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="NameLabel"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval("Name") %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt; &lt;span class="attr"&gt;HeaderText&lt;/span&gt;&lt;span class="kwrd"&gt;="Favorite"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ccwc:RadioButton&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="FavoriteButton"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;GroupName&lt;/span&gt;&lt;span class="kwrd"&gt;="FavoriteGroup"&lt;/span&gt; 
                                    &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval("Id") %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Columns&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:GridView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;  
                
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="ForPostBackButton"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="for post back"&lt;/span&gt; 
                        &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;="ForPostBackButton_Click"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="ResultsLabel"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;                          
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 class="contentgroup"&gt;C# (code behind) - &lt;span&gt;RadioButtonSpike2.aspx.cs&lt;/span&gt;&lt;/h4&gt;
&lt;div class="csharpcode-wrapper"&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; CCW = ConwayControls.Web;

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RadioButtonSpike2 : Page {

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoad(EventArgs e) {
        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnLoad(e);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.IsPostBack) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

        &lt;span class="kwrd"&gt;this&lt;/span&gt;.BindGrid();
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BindGrid() {
        List&amp;lt;SurveyItem&amp;gt; items = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;SurveyItem&amp;gt;();

        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(1, &lt;span class="str"&gt;"C#"&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(2, &lt;span class="str"&gt;"VB"&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(3, &lt;span class="str"&gt;"Perl"&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(4, &lt;span class="str"&gt;"Java"&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(5, &lt;span class="str"&gt;"Ruby"&lt;/span&gt;));

        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SurveyGrid.DataSource = items;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SurveyGrid.DataBind();
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ForPostBackButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (GridViewRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.SurveyGrid.Rows) {
            CCW.RadioButton radioButton = row.FindControl(&lt;span class="str"&gt;"FavoriteButton"&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; CCW.RadioButton;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (radioButton == &lt;span class="kwrd"&gt;null&lt;/span&gt; || !radioButton.Checked) &lt;span class="kwrd"&gt;continue&lt;/span&gt;;

            &lt;span class="rem"&gt;//the following label demonstrates the ability of grabbing other controls in the row and using it...&lt;/span&gt;
            Label label = row.FindControl(&lt;span class="str"&gt;"NameLabel"&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; Label;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (label != &lt;span class="kwrd"&gt;null&lt;/span&gt;) {
                &lt;span class="kwrd"&gt;string&lt;/span&gt; format = &lt;span class="str"&gt;"favorite language: &amp;lt;h3&amp;gt;{0} (Id: {1})&amp;lt;/h3&amp;gt;"&lt;/span&gt;;
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.ResultsLabel.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(format, label.Text, radioButton.Value);
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            }
        }
    }
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SurveyItem {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; SurveyItem(&lt;span class="kwrd"&gt;int&lt;/span&gt; id, &lt;span class="kwrd"&gt;string&lt;/span&gt; name) {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.id = id;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.name = name;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.id; }
        set { &lt;span class="kwrd"&gt;this&lt;/span&gt;.id = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; id;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.name; }
        set { &lt;span class="kwrd"&gt;this&lt;/span&gt;.name = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; name;

}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;
  It is a good practice when iterating over a collection to continue after an unwanted test and break once you have found the item you were looking for.&lt;/p&gt;
&lt;p&gt; As noted in the iteration of the GridViewRows inside the &lt;strong&gt;ForPostBackButton_Click&lt;/strong&gt; method, I tested to ensure the RadioButton was found, that it was checked, and continued if it wasn't by using the &lt;strong&gt;continue&lt;/strong&gt; keyword. Once the checked RadioButton was found, I broke the iteration using the &lt;strong&gt;break&lt;/strong&gt; keyword. Both statements/uses prevent any unnecessary code execution which is even more important during iteration of a collection.
&lt;/p&gt;

&lt;p&gt;Please let me know if you have any questions with this particular scenario.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason Conway&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6179614" width="1" height="1"&gt;</content><author><name>nicequy</name><uri>http://weblogs.asp.net/members/nicequy.aspx</uri></author></entry><entry><title>Meta Tags in ASP.NET using MasterPage and ContentPlaceHolders</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/archive/2008/03/24/meta-tags-in-asp-net-using-masterpage-and-contentplaceholders.aspx" /><id>http://weblogs.asp.net/jasonconway/archive/2008/03/24/meta-tags-in-asp-net-using-masterpage-and-contentplaceholders.aspx</id><published>2008-03-24T15:19:50Z</published><updated>2008-03-24T15:19:50Z</updated><content type="html">&lt;p&gt;Having META tags like Description and Keywords on the .aspx pages of our sites is very important.&amp;#160; It is also important that the content of the tags be easily added and/or updated.&amp;#160; Most online help will have you instantiate an &lt;a title="HtmlMeta Class on MSDN" href="http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlmeta.aspx" target="_blank"&gt;HtmlMeta&lt;/a&gt; class or write tags by implementing some variance of either:&lt;/p&gt;  &lt;ul style="list-style-type: none"&gt;   &lt;li&gt;&lt;u&gt;Option 1&lt;/u&gt; - create a base Page class with methods or properties and create an external persistence store for META content &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Option 2&lt;/u&gt; - create a base Page class with virtual methods or properties and override those on the deriving page &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Option 3&lt;/u&gt; - create an Interface or abstract class with methods or properties that the deriving page will employ &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Option 4&lt;/u&gt; - use a third-party component or write a control &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Option 5&lt;/u&gt; - on &lt;strong&gt;every&lt;/strong&gt; page, write or use existing implementation to create META tags &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;While my solution also uses the &lt;a title="HtmlMeta Class on MSDN" href="http://msdn2.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlmeta.aspx" target="_blank"&gt;HtmlMeta&lt;/a&gt; class, it differs in architecture and uses the following guidelines:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;create&lt;/strong&gt; META tags on pages in a new or existing Site &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;no&lt;/strong&gt; base Page class, abstract class, or Interface that all existing or new pages inherit &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;no &lt;/strong&gt;database or external store for persisting Tag content &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;no&lt;/strong&gt; controls or third-party components &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;just&lt;/strong&gt; want META content and not the actual tag creation on every page &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;must&lt;/strong&gt; provide unique content per page &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;must&lt;/strong&gt; provide simple, maintainable content changes without recompile &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;must&lt;/strong&gt; provide the ability to change content with basic skills and without a special interface &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In other words, I did not want to create a base Page, Interface, control, or third-party component that every single one of the pages in my site derives from or uses.&amp;#160; In addition having to ensure that any newly created pages inherited the base Page or implement some Interface is not as easily maintainable.&amp;#160; I can also use this solution on existing sites without having to worry about any Page inheritance issues.&lt;/p&gt;  &lt;p&gt;What better place to keep information about an .aspx file than right in the .aspx file?&amp;#160; Most markup resides in each .aspx file using ContentPlaceHolders anyway and when you create a new page, these ContentPlaceHolders will be included automatically!&amp;#160; For this post, I am only going to demonstrate adding META Description and Keywords tags, but this process can be applied to as many tags as you need.&amp;#160; One thing that is great about this approach, is that you will &lt;strong&gt;not&lt;/strong&gt; need a database or external file (like xml) to store META content...making the content very easily updated with a simple text editor (like Notepad) and no additional programming or database skills!&lt;/p&gt;  &lt;p class="downloadsection"&gt;&lt;a href="http://weblogs.asp.net/blogs/jasonconway/Meta%20Spike.zip"&gt;&lt;img src="http://weblogs.asp.net/blogs/jasonconway/download.gif" align="middle" border="0" /&gt;&lt;span&gt;DOWNLOAD - Meta Spike Files&lt;span&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;This is how you do it (the source files are available for download above):&lt;/p&gt;      &lt;ol&gt;       &lt;li&gt;drop 2 ContentPlaceHolders in a MasterPage's head tag, 1 for Description and 1 for Keywords making sure to set&amp;#160; &lt;font face="Courier New"&gt;Visible=&amp;quot;false&amp;quot;&lt;/font&gt;&amp;#160; &lt;/li&gt;        &lt;li&gt;wire up &lt;a title="ContentPlaceHolder Load event" href="http://msdn2.microsoft.com/en-us/library/system.web.ui.control.load.aspx"&gt;Load&lt;/a&gt; events on the ContentPlaceHolders and &lt;a title="Page LoadComplete event" href="http://msdn2.microsoft.com/en-us/library/system.web.ui.page.loadcomplete.aspx" target="_blank"&gt;LoadComplete&lt;/a&gt; on the MasterPage's Page property &lt;/li&gt;        &lt;li&gt;implement handled events &lt;/li&gt;        &lt;li&gt;create or update existing page with new Description and Keywords ContentPlaceHolders add content to place holders &lt;/li&gt;        &lt;li&gt;view page in browser and inspect rendered source &lt;/li&gt;     &lt;/ol&gt;      &lt;h4 class="contentgroup"&gt;Step 1 - &lt;span&gt;default.master&lt;/span&gt;&lt;/h4&gt;      &lt;div class="csharpcode-wrapper"&gt;       &lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Master Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeBehind=&amp;quot;Default.master.cs&amp;quot; Inherits=&amp;quot;MetaSpike.Default&amp;quot; %&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaDescriptionHolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Visible&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ContentPlaceHolder&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaKeywordsHolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Visible&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ContentPlaceHolder&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DefaultMasterForm&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ContentPlaceHolder&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContentHolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ContentPlaceHolder&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h4 class="contentgroup"&gt;Step 2 - &lt;span&gt;default.master.cs&lt;/span&gt;&lt;/h4&gt;

    &lt;div class="csharpcode-wrapper"&gt;
      &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MetaSpike {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Default : MasterPage {

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnInit(EventArgs e) {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnInit(e);

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaDescriptionHolder.Load += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(MetaDescriptionHolder_Load);
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaKeywordsHolder.Load += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(MetaKeywordsHolder_Load);

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Page.LoadComplete += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(Page_LoadComplete);
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MetaDescriptionHolder_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MetaKeywordsHolder_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_LoadComplete(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }
    }
}&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h4 class="contentgroup"&gt;Step 3 - &lt;span&gt;default.master.cs (continued)&lt;/span&gt;&lt;/h4&gt;

    &lt;div class="csharpcode-wrapper"&gt;
      &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MetaSpike {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Default : MasterPage {
        &lt;span class="kwrd"&gt;private&lt;/span&gt; HtmlMeta descriptionMeta;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; HtmlMeta keywordsMeta;

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnInit(EventArgs e) {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnInit(e);

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaDescriptionHolder.Load += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(MetaDescriptionHolder_Load);
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaKeywordsHolder.Load += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(MetaKeywordsHolder_Load);

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Page.LoadComplete += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(Page_LoadComplete);
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MetaDescriptionHolder_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; content = &lt;span class="kwrd"&gt;this&lt;/span&gt;.ParseHolderContent(&lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaDescriptionHolder);

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(content)) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.descriptionMeta = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlMeta();
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.descriptionMeta.Name = &lt;span class="str"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.descriptionMeta.Content = content;
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MetaKeywordsHolder_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; content = &lt;span class="kwrd"&gt;this&lt;/span&gt;.ParseHolderContent(&lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaKeywordsHolder);

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(content)) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.keywordsMeta = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlMeta();
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.keywordsMeta.Name = &lt;span class="str"&gt;&amp;quot;keywords&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.keywordsMeta.Content = content;
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_LoadComplete(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
            Page page = sender &lt;span class="kwrd"&gt;as&lt;/span&gt; Page;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (page == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.descriptionMeta != &lt;span class="kwrd"&gt;null&lt;/span&gt;) page.Header.Controls.Add(&lt;span class="kwrd"&gt;this&lt;/span&gt;.descriptionMeta);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.keywordsMeta != &lt;span class="kwrd"&gt;null&lt;/span&gt;) page.Header.Controls.Add(&lt;span class="kwrd"&gt;this&lt;/span&gt;.keywordsMeta);
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ParseHolderContent(ContentPlaceHolder holder) {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (holder == &lt;span class="kwrd"&gt;null&lt;/span&gt; || holder.Controls.Count == 0) &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;

            LiteralControl control = holder.Controls[0] &lt;span class="kwrd"&gt;as&lt;/span&gt; LiteralControl;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (control == &lt;span class="kwrd"&gt;null&lt;/span&gt; || &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(control.Text)) &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;

            &lt;span class="kwrd"&gt;return&lt;/span&gt; control.Text.Trim();
        }
    }
}&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h4 class="contentgroup"&gt;Step 4 - &lt;span&gt;home.aspx&lt;/span&gt;&lt;/h4&gt;

    &lt;div class="csharpcode-wrapper"&gt;
      &lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; MasterPageFile=&amp;quot;~/Default.Master&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; 
    CodeBehind=&amp;quot;Home.aspx.cs&amp;quot; Inherits=&amp;quot;MetaSpike.Home&amp;quot; Title=&amp;quot;Meta Spike Home&amp;quot; %&amp;gt;&lt;/span&gt;
    
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaDescription&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaDescriptionHolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;description goes here&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaKeywords&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaKeywordsHolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;keywords, .net, asp.net, meta&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContentHolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    this page now has a very simple mechanism for adding and updating meta tags! enjoy!
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h4 class="contentgroup"&gt;Step 5 - &lt;span&gt;view source rendered home.aspx&lt;/span&gt;&lt;/h4&gt;

    &lt;div class="csharpcode-wrapper"&gt;
      &lt;pre class="csharpcode"&gt;&lt;span&gt;&amp;lt;!&lt;/span&gt;&lt;span&gt;DOCTYPE&lt;/span&gt; &lt;span&gt;html&lt;/span&gt; &lt;span&gt;PUBLIC&lt;/span&gt; &lt;span&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;

&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt; &lt;span&gt;xmlns&lt;/span&gt;&lt;span&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Meta Spike Home&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&amp;quot;description&amp;quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;&lt;span&gt;=&amp;quot;description goes here&amp;quot;&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&amp;quot;keywords&amp;quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;&lt;span&gt;=&amp;quot;keywords, .net, asp.net, meta&amp;quot;&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;form&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&amp;quot;aspnetForm&amp;quot;&lt;/span&gt; &lt;span&gt;method&lt;/span&gt;&lt;span&gt;=&amp;quot;post&amp;quot;&lt;/span&gt; &lt;span&gt;action&lt;/span&gt;&lt;span&gt;=&amp;quot;Home.aspx&amp;quot;&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&amp;quot;aspnetForm&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
            &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
                &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;input&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&amp;quot;__VIEWSTATE&amp;quot;&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&amp;quot;__VIEWSTATE&amp;quot;&lt;/span&gt;
 		   &lt;span&gt;value&lt;/span&gt;&lt;span&gt;=&amp;quot;/wEPDwUJNDMyNDU0NjAzZGQfTG4D56NhuIUPL9dxPlf1j85RXw==&amp;quot;&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;
            &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
            &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;              
                this page now has a very simple mechanism for adding and updating meta tags! enjoy!
            &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;p&gt;Some things to note:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;ContentPlaceHolders on the MasterPage have Visible set to false &lt;/li&gt;

      &lt;li&gt;the use of the Page's LoadComplete event instead of Load &lt;/li&gt;

      &lt;li&gt;only straight text in the Content tags on Home.aspx, ASP.NET will put that text into LiteralControls &lt;/li&gt;

      &lt;li&gt;&lt;strong&gt;no&lt;/strong&gt; text in the Content tags on Home.aspx will result in &lt;strong&gt;no&lt;/strong&gt; META tags being output (good thing) &lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;This will prevent you from having to write more code than you need and leaves the actual content on the page itself (where it belongs).&amp;#160; In addition, you won't have a database or special component to worry about or pay for. &lt;/p&gt;

    &lt;p&gt;I hope you find this approach very simple, maintainable, and easily employed.&lt;/p&gt;

    &lt;p&gt;Jason Conway&lt;/p&gt;

    &lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fjasonconway%2farchive%2f2008%2f03%2f24%2fmeta-tags-in-asp-net-using-masterpage-and-contentplaceholders.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fjasonconway%2farchive%2f2008%2f03%2f24%2fmeta-tags-in-asp-net-using-masterpage-and-contentplaceholders.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6019413" width="1" height="1"&gt;</content><author><name>nicequy</name><uri>http://weblogs.asp.net/members/nicequy.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/jasonconway/archive/tags/ASP.NET/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/jasonconway/archive/tags/.NET/default.aspx" /><category term="ContentPlaceHolders" scheme="http://weblogs.asp.net/jasonconway/archive/tags/ContentPlaceHolders/default.aspx" /><category term="MasterPage" scheme="http://weblogs.asp.net/jasonconway/archive/tags/MasterPage/default.aspx" /><category term="Meta" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Meta/default.aspx" /><category term="Meta Keywords" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Meta+Keywords/default.aspx" /><category term="Meta Tags" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Meta+Tags/default.aspx" /><category term="Meta Description" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Meta+Description/default.aspx" /></entry><entry><title>Using the ConwayControls RadioButton - Scenario 1</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/archive/2008/03/22/using-the-conwaycontrols-radiobutton-scenario-1.aspx" /><id>http://weblogs.asp.net/jasonconway/archive/2008/03/22/using-the-conwaycontrols-radiobutton-scenario-1.aspx</id><published>2008-03-22T22:43:06Z</published><updated>2008-03-22T22:43:06Z</updated><content type="html">&lt;div class="scenariodescription"&gt;&lt;h3&gt;Scenario&lt;/h3&gt;&lt;span&gt;Upon a simple asp:Button click event (postback), capture the CheckChanged event of the RadioButton&lt;span&gt;&lt;/div&gt;  &lt;div class="downloadsection"&gt;&lt;a href="http://weblogs.asp.net/blogs/jasonconway/Radio%20Button%20-%20Scenario%201.zip"&gt;&lt;img src="http://weblogs.asp.net/blogs/jasonconway/download.gif" border="0" align="middle" /&gt;&lt;span&gt;Radio Button Files - Scenario 1&lt;span&gt;&lt;/a&gt;&lt;/div&gt;  &lt;h4 class="contentgroup"&gt;ASP.NET - &lt;span&gt;RadioButtonSpike1.aspx&lt;/span&gt;&lt;/h4&gt;  &lt;div class="csharpcode-wrapper"&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeFile=&amp;quot;RadioButtonSpike1.aspx.cs&amp;quot; Inherits=&amp;quot;RadioButtonSpike1&amp;quot; %&amp;gt;&lt;/span&gt;

&lt;span class="asp"&gt;&amp;lt;%@ Register Assembly=&amp;quot;ConwayControls&amp;quot; Namespace=&amp;quot;ConwayControls.Web&amp;quot; TagPrefix=&amp;quot;ccwc&amp;quot; %&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Radio Button Spike - Scenario 1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;media&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            div {padding-top: 10px;}
            h3 {display: inline;}
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;RadioButtonSpikeForm&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:GridView&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SurveyGrid&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;False&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Columns&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt; &lt;span class="attr"&gt;HeaderText&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Language&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;NameLabel&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;Name&amp;quot;) %&amp;gt;'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt; &lt;span class="attr"&gt;HeaderText&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Favorite&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ccwc:RadioButton&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FavoriteButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;GroupName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FavoriteGroup&amp;quot;&lt;/span&gt; 
                                    &lt;span class="attr"&gt;OnCheckChanged&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FavoriteButton_CheckChanged&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;Name&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:TemplateField&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Columns&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:GridView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ForPostBackButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ForPostBackButton_Click&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;for post back&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ResultsLabel&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 class="contentgroup"&gt;C# (code behind) - &lt;span&gt;RadioButtonSpike1.aspx.cs&lt;/span&gt;&lt;/h4&gt;

&lt;div class="csharpcode-wrapper"&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; CCW = ConwayControls.Web;

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RadioButtonSpike1 : Page {
    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoad(EventArgs e) {
        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnLoad(e);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.IsPostBack) &lt;span class="kwrd"&gt;return&lt;/span&gt;;

        &lt;span class="kwrd"&gt;this&lt;/span&gt;.BindGrid();
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BindGrid() {
        List&amp;lt;SurveyItem&amp;gt; items = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;SurveyItem&amp;gt;();

        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(1, &lt;span class="str"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(2, &lt;span class="str"&gt;&amp;quot;VB&amp;quot;&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(3, &lt;span class="str"&gt;&amp;quot;Perl&amp;quot;&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(4, &lt;span class="str"&gt;&amp;quot;Java&amp;quot;&lt;/span&gt;));
        items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SurveyItem(5, &lt;span class="str"&gt;&amp;quot;Ruby&amp;quot;&lt;/span&gt;));

        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SurveyGrid.DataSource = items;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SurveyGrid.DataBind();
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ForPostBackButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
        &lt;span class="rem"&gt;//do nothing...just needed the postback&lt;/span&gt;
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FavoriteButton_CheckChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) {
        CCW.RadioButton radioButton = sender &lt;span class="kwrd"&gt;as&lt;/span&gt; CCW.RadioButton;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (radioButton != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; radioButton.Checked) {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.ResultsLabel.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;your favorite language is: &amp;lt;h3&amp;gt;{0}&amp;lt;/h3&amp;gt;&amp;quot;&lt;/span&gt;, radioButton.Value);
        }
    }
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SurveyItem {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; SurveyItem(&lt;span class="kwrd"&gt;int&lt;/span&gt; id, &lt;span class="kwrd"&gt;string&lt;/span&gt; name) {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.id = id;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.name = name;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.id; }
        set { &lt;span class="kwrd"&gt;this&lt;/span&gt;.id = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; id;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.name; }
        set { &lt;span class="kwrd"&gt;this&lt;/span&gt;.name = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; name;

}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Now keep in mind that in this scenario and implementation, the &lt;strong&gt;CheckChanged&lt;/strong&gt; event will fire if the RadioButton changes from being checked or unchecked on &lt;strong&gt;&lt;u&gt;any&lt;/u&gt;&lt;/strong&gt; postback.&amp;#160; That means that if your grid has paging or a different unrelated button that posts, you are &lt;strong&gt;not&lt;/strong&gt; going to want to ignore this event when it happens.&amp;#160; &lt;/p&gt;

&lt;p&gt;You will still use this implementation for grids that page or unrelated postbacks; you will just need to keep track of changes by using some sort of state mechanism.&amp;#160; The other ways to use the RadioButton are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;enable AutoPostBack &lt;/li&gt;

  &lt;li&gt;iterate over all the rows in the grid (sledge hammer approach) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will demonstrate these other scenarios, including a grid with paging, in posts to follow.&lt;/p&gt;

&lt;p&gt;Please let me know if you have any questions with this particular scenario.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Jason Conway&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6012430" width="1" height="1"&gt;</content><author><name>nicequy</name><uri>http://weblogs.asp.net/members/nicequy.aspx</uri></author><category term="Button" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Button/default.aspx" /><category term="RadioButton" scheme="http://weblogs.asp.net/jasonconway/archive/tags/RadioButton/default.aspx" /><category term="DataGrid" scheme="http://weblogs.asp.net/jasonconway/archive/tags/DataGrid/default.aspx" /><category term="GridView" scheme="http://weblogs.asp.net/jasonconway/archive/tags/GridView/default.aspx" /><category term="Control" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Control/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/jasonconway/archive/tags/ASP.NET/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/jasonconway/archive/tags/.NET/default.aspx" /><category term="Group Name" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Group+Name/default.aspx" /><category term="DataList" scheme="http://weblogs.asp.net/jasonconway/archive/tags/DataList/default.aspx" /><category term="Repeater" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Repeater/default.aspx" /></entry><entry><title>RadioButton for the DataGrid or GridView</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jasonconway/archive/2007/10/20/radiobutton-for-the-datagrid-or-gridview.aspx" /><id>http://weblogs.asp.net/jasonconway/archive/2007/10/20/radiobutton-for-the-datagrid-or-gridview.aspx</id><published>2007-10-21T00:20:00Z</published><updated>2007-10-21T00:20:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;&lt;A href="http://weblogs.asp.net/blogs/jasonconway/ConwayControls.zip" mce_href="http://weblogs.asp.net/blogs/jasonconway/ConwayControls.zip"&gt;ConwayControls.zip&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The .zip file above contains a custom RadioButton control that works inside a DataGrid or GridView.&lt;/P&gt;
&lt;P&gt;Can be used for both 1.1 or 2.0!&lt;/P&gt;
&lt;P&gt;&lt;IMG title="Screen Shot of the RadioButton" style="WIDTH: 400px; HEIGHT: 300px" height=300 alt="Screen Shot of the RadioButton" src="http://weblogs.asp.net/blogs/jasonconway/conwaycontrols.jpg" width=400 border=0 mce_src="http://weblogs.asp.net/blogs/jasonconway/conwaycontrols.jpg"&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4658004" width="1" height="1"&gt;</content><author><name>nicequy</name><uri>http://weblogs.asp.net/members/nicequy.aspx</uri></author><category term="Button" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Button/default.aspx" /><category term="RadioButton" scheme="http://weblogs.asp.net/jasonconway/archive/tags/RadioButton/default.aspx" /><category term="DataGrid" scheme="http://weblogs.asp.net/jasonconway/archive/tags/DataGrid/default.aspx" /><category term="GridView" scheme="http://weblogs.asp.net/jasonconway/archive/tags/GridView/default.aspx" /><category term="Control" scheme="http://weblogs.asp.net/jasonconway/archive/tags/Control/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/jasonconway/archive/tags/ASP.NET/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/jasonconway/archive/tags/.NET/default.aspx" /></entry></feed>