<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jason Conway</title><link>http://weblogs.asp.net/jasonconway/default.aspx</link><description>just trying to help</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Using the ConwayControls RadioButton - Scenario 2</title><link>http://weblogs.asp.net/jasonconway/archive/2008/05/11/using-the-conwaycontrols-radiobutton-scenario-2.aspx</link><pubDate>Sun, 11 May 2008 19:34:36 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6179614</guid><dc:creator>Jason Conway</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jasonconway/rsscomments.aspx?PostID=6179614</wfw:commentRss><comments>http://weblogs.asp.net/jasonconway/archive/2008/05/11/using-the-conwaycontrols-radiobutton-scenario-2.aspx#comments</comments><description>&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;</description></item><item><title>Meta Tags in ASP.NET using MasterPage and ContentPlaceHolders</title><link>http://weblogs.asp.net/jasonconway/archive/2008/03/24/meta-tags-in-asp-net-using-masterpage-and-contentplaceholders.aspx</link><pubDate>Mon, 24 Mar 2008 15:19:50 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6019413</guid><dc:creator>Jason Conway</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jasonconway/rsscomments.aspx?PostID=6019413</wfw:commentRss><comments>http://weblogs.asp.net/jasonconway/archive/2008/03/24/meta-tags-in-asp-net-using-masterpage-and-contentplaceholders.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/jasonconway/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/ContentPlaceHolders/default.aspx">ContentPlaceHolders</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/MasterPage/default.aspx">MasterPage</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Meta/default.aspx">Meta</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Meta+Keywords/default.aspx">Meta Keywords</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Meta+Tags/default.aspx">Meta Tags</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Meta+Description/default.aspx">Meta Description</category></item><item><title>Using the ConwayControls RadioButton - Scenario 1</title><link>http://weblogs.asp.net/jasonconway/archive/2008/03/22/using-the-conwaycontrols-radiobutton-scenario-1.aspx</link><pubDate>Sat, 22 Mar 2008 22:43:06 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6012430</guid><dc:creator>Jason Conway</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jasonconway/rsscomments.aspx?PostID=6012430</wfw:commentRss><comments>http://weblogs.asp.net/jasonconway/archive/2008/03/22/using-the-conwaycontrols-radiobutton-scenario-1.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Button/default.aspx">Button</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/RadioButton/default.aspx">RadioButton</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/DataGrid/default.aspx">DataGrid</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/GridView/default.aspx">GridView</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Control/default.aspx">Control</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Group+Name/default.aspx">Group Name</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/DataList/default.aspx">DataList</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Repeater/default.aspx">Repeater</category></item><item><title>RadioButton for the DataGrid or GridView</title><link>http://weblogs.asp.net/jasonconway/archive/2007/10/20/radiobutton-for-the-datagrid-or-gridview.aspx</link><pubDate>Sun, 21 Oct 2007 00:20:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4658004</guid><dc:creator>Jason Conway</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jasonconway/rsscomments.aspx?PostID=4658004</wfw:commentRss><comments>http://weblogs.asp.net/jasonconway/archive/2007/10/20/radiobutton-for-the-datagrid-or-gridview.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Button/default.aspx">Button</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/RadioButton/default.aspx">RadioButton</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/DataGrid/default.aspx">DataGrid</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/GridView/default.aspx">GridView</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/Control/default.aspx">Control</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/jasonconway/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>