<?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">David Findley's Blog</title><subtitle type="html">My little home in the cloud.</subtitle><id>http://weblogs.asp.net/dfindley/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/dfindley/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2006-10-20T22:38:14Z</updated><entry><title>ASP.NET MVC – Multiple buttons in the same form</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx</id><published>2009-05-31T13:04:22Z</published><updated>2009-05-31T13:04:22Z</updated><content type="html">&lt;p&gt;I keep seeing this question in forums and on twitter so I thought I’d post all the various ways you can handle this and what the pros and cons are.&lt;/p&gt;  &lt;h3&gt;The Scenario&lt;/h3&gt;  &lt;p&gt;Imagine you have a user signup form. There are several textbox fields for entering the new account information and then two buttons: Signup and Cancel. Signup will process the account information and Cancel will return the user to the home page.&lt;/p&gt;  &lt;h4&gt;Option 1 – Each button submits the form but provides a different value&lt;/h4&gt;  &lt;p&gt;~/Views/Account/Register.aspx&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  1: &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt; using (Html.BeginForm()) { &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  2:     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  3:         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fieldset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  4:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;legend&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Account Information&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;legend&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  5:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  6:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Username:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  7:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;username&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  8:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;username&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  9:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 10:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 11:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;email&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Email:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 12:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;email&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 13:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;email&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 14:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 15:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 16:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Password:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 17:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.Password(&amp;quot;password&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 18:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;password&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 19:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 20:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 21:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;confirmPassword&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Confirm password:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 22:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.Password(&amp;quot;confirmPassword&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 23:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;confirmPassword&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 24:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 25:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;register&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Register&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 26:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;cancel&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Cancel&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 27:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 28:         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fieldset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 29:     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 30:  &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt; } &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;~/Controllers/AccountController.cs &lt;/p&gt;

&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  1: [AcceptVerbs(HttpVerbs.Post)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  2: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Register(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; button, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; userName, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; email, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; password, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; confirmPassword)
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  3: {
&lt;/pre&gt;&lt;pre style="background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  4:     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (button == &amp;quot;c&lt;span style="color: #8b0000"&gt;ancel&lt;/span&gt;&amp;quot;)
&lt;/pre&gt;&lt;pre style="background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  5:         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RedirectToAction(&amp;quot;&lt;span style="color: #8b0000"&gt;Index&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;Home&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  6: 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  7:     ViewData[&amp;quot;&lt;span style="color: #8b0000"&gt;PasswordLength&lt;/span&gt;&amp;quot;] = MembershipService.MinPasswordLength;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  8: 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  9:     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ValidateRegistration(userName, email, password, confirmPassword))
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 10:     {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 11:         &lt;span style="color: #008000"&gt;// Attempt to register the user&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 12:         MembershipCreateStatus createStatus = MembershipService.CreateUser(userName, password, email);
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 13: 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 14:         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (createStatus == MembershipCreateStatus.Success)
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 15:         {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 16:             FormsAuth.SignIn(userName, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt; &lt;span style="color: #008000"&gt;/* createPersistentCookie */&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 17:             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RedirectToAction(&amp;quot;&lt;span style="color: #8b0000"&gt;Index&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;Home&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 18:         }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 19:         &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 20:         {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 21:             ModelState.AddModelError(&amp;quot;&lt;span style="color: #8b0000"&gt;_FORM&lt;/span&gt;&amp;quot;, ErrorCodeToString(createStatus));
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 22:         }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 23:     }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 24: 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 25:     &lt;span style="color: #008000"&gt;// If we got this far, something failed, redisplay form&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 26:     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 27: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;The downside to this solution is that you have to add some yucky conditional logic to your controller and all the form data has to be submitted to the server just so the server can issue a redirect. To make the controller code a little better you could implement a custom ActionMethodSelectorAttribute like this:&lt;/p&gt;

&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AcceptParameterAttribute : ActionMethodSelectorAttribute
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  3:     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  4:     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Value { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  5: 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  6:     &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;bool&lt;/span&gt; IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  7:     {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  8:         var req = controllerContext.RequestContext.HttpContext.Request;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  9:         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; req.Form[&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Name] == &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Value;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 10:     }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 11: }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 12: &lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Now I can split into two action methods like this:&lt;/p&gt;

&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  1: [ActionName(&amp;quot;&lt;span style="color: #8b0000"&gt;Register&lt;/span&gt;&amp;quot;)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  2: [AcceptVerbs(HttpVerbs.Post)]
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  3: [AcceptParameter(Name=&amp;quot;&lt;span style="color: #8b0000"&gt;button&lt;/span&gt;&amp;quot;, Value=&amp;quot;&lt;span style="color: #8b0000"&gt;cancel&lt;/span&gt;&amp;quot;)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  4: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Register_Cancel()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  5: {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  6:     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RedirectToAction(&amp;quot;&lt;span style="color: #8b0000"&gt;Index&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;Home&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  7: }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  8: 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  9: [AcceptVerbs(HttpVerbs.Post)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 10: [AcceptParameter(Name=&amp;quot;&lt;span style="color: #8b0000"&gt;button&lt;/span&gt;&amp;quot;, Value=&amp;quot;&lt;span style="color: #8b0000"&gt;register&lt;/span&gt;&amp;quot;)]
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 11: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Register(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; userName, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; email, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; password, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; confirmPassword)
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 12: {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 13:   &lt;span style="color: #008000"&gt;// process registration&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 14: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Again, this isn’t the most efficient method but it does let you handle different buttons with different controller methods.&lt;/p&gt;

&lt;h4&gt;Option 2 – A second form&lt;/h4&gt;

&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  1: &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt; using (Html.BeginForm()) { &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  2:     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  3:         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fieldset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  4:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;legend&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Account Information&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;legend&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  5:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  6:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Username:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  7:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;username&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  8:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;username&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  9:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 10:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 11:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;email&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Email:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 12:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;email&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 13:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;email&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 14:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 15:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 16:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Password:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 17:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.Password(&amp;quot;password&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 18:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;password&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 19:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 20:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 21:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;for&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;confirmPassword&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Confirm password:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 22:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.Password(&amp;quot;confirmPassword&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 23:                 &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;confirmPassword&amp;quot;) &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 24:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 25:             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 26:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Register&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 27:                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$('#cancelForm').submit()&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Cancel&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 28:             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 29:         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fieldset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 30:     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 31: &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt; } &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 32: &lt;span style="background-color: #ffff00; color: black"&gt;&amp;lt;%&lt;/span&gt; using (Html.BeginForm(&amp;quot;Register_Cancel&amp;quot;, &amp;quot;Account&amp;quot;, FormMethod.Post, new { id=&amp;quot;cancelForm&amp;quot; })) {} &lt;span style="background-color: #ffff00; color: black"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; 33: &lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;All I did here was add a new form after the registration form and point it at my other controller action. I then changed the cancel button to type=”button” so that it would try to submit the form it was sitting in and added an onlick that uses a simple jQuery expression to submit my other “cancel” form. This is more efficient now that it wont submit all the registration data but it is still not the most efficient since it is still using the server to do a redirect.&lt;/p&gt;

&lt;h4&gt;Option 3: All client side script&lt;/h4&gt;

&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  2:     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Register&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  3:     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;document.location.href=$('#cancelUrl').attr('href')&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Cancel&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  4:     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;a&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;cancelUrl&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;href&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;lt;%= Html.AttributeEncode(Url.Action(&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Index&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #ff0000"&gt;Home&lt;/span&gt;&amp;quot;)) %&amp;gt;&amp;quot; &lt;span style="color: #ff0000"&gt;style&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;display:none;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  5: &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  6: &lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;This is the most efficient way to handle the cancel button. There is no interaction with the server to get the url to redirect to. I rendered a hidden &amp;lt;a&amp;gt; tag to contain the url but still used the &amp;lt;button&amp;gt; and some script so that the cancel option still looked like a button on the form. It would also work if I just displayed the &amp;lt;a&amp;gt; tag instead of the button. I’ve noticed several sites that have buttons for actions that submit data and links for actions like cancel that do not. I bet it has to do with this same sort of problem.&lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;When I write MVC applications I use this criteria for choosing what a button should do:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Does the button apply to the form that it is sitting in? e.g. “Save”, “Update”, “Ok”, “Submit” 
    &lt;br /&gt;Use a standard &amp;lt;button&amp;gt; element. &lt;/li&gt;

  &lt;li&gt;Does the button need to post some other data to the server? e.g. “Delete” 
    &lt;br /&gt;Use a&amp;#160; &amp;lt;button&amp;gt; element with type=”button” and and onclick handler that submits another form with hidden input elements. &lt;em&gt;more on this in a follow-up blog post&lt;/em&gt; &lt;/li&gt;

  &lt;li&gt;Is the button purely navigational? e.g. “Cancel”, “Back”, “Next”, “Prev” 
    &lt;br /&gt;Use and &amp;lt;a&amp;gt; element or a &amp;lt;button&amp;gt; with script to simply navigate the browser to the new location &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7104187" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /><category term="MVC" scheme="http://weblogs.asp.net/dfindley/archive/tags/MVC/default.aspx" /></entry><entry><title>ASP.NET MVC ModelState should work like TempData</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2009/03/13/asp-net-mvc-modelstate-should-work-like-tempdata.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2009/03/13/asp-net-mvc-modelstate-should-work-like-tempdata.aspx</id><published>2009-03-13T23:16:00Z</published><updated>2009-03-13T23:16:00Z</updated><content type="html">&lt;p&gt;I prefer to have the actions that forms post to just process the posted data and then redirect to a different action for viewing the results. So in order to pass validation errors back to the form action I need ModelState to work like TempData does. In fact it seemed that before ModelState was added that one of the most common scenarios for using TempData was passing validation error messages between actions so I’m not sure why it doesn't already work like this. I’m using RC2 so its doubtful this will change before RTM. :(&lt;/p&gt;  &lt;p&gt;Anyhoo, this code totally saved me: &lt;a href="http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/" title="http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/" mce_href="http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/"&gt;http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6957751" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /><category term="MVC" scheme="http://weblogs.asp.net/dfindley/archive/tags/MVC/default.aspx" /></entry><entry><title>Interesting finds 3/13/2009</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2009/03/13/interesting-finds-3-13-2009.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2009/03/13/interesting-finds-3-13-2009.aspx</id><published>2009-03-13T22:23:17Z</published><updated>2009-03-13T22:23:17Z</updated><content type="html">&lt;p&gt;As soon as I get some time I need to look at these a little closer:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://www.codeplex.com/FluentValidation" href="http://www.codeplex.com/FluentValidation"&gt;http://www.codeplex.com/FluentValidation&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://www.jetbrains.com/teamcity/" href="http://www.jetbrains.com/teamcity/"&gt;http://www.jetbrains.com/teamcity/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6957727" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author></entry><entry><title>Merry Christmas Indeed!</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/12/26/merry-christmas-indeed.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/12/26/merry-christmas-indeed.aspx</id><published>2007-12-27T03:37:00Z</published><updated>2007-12-27T03:37:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;Janice went all out this year and got me an Ibanez &lt;A class="" href="http://www.ibanez.com/eg/guitar.aspx?m=JS1000" target=_blank mce_href="http://www.ibanez.com/eg/guitar.aspx?m=JS1000"&gt;JS1000&lt;/A&gt; (Joe Satriani series) guitar,&amp;nbsp;a &lt;A class="" href="http://www.line6.com/podx3live/" target=_blank mce_href="http://www.line6.com/podx3live/"&gt;Line 6 POD X3 Live&lt;/A&gt; effects board and a pair of &lt;A class="" href="http://www.roland.com/products/en/CM-30/index.html" target=_blank mce_href="http://www.roland.com/products/en/CM-30/index.html"&gt;Roland CM-30&lt;/A&gt; amplified monitors. My fingers are all tore up now since I've been out of practice for some time now. But it sure is fun to get back to some jamming. The JS1000 is pretty light and has easy action. Combined with the POD X3 I can get quite a variety of amazing sounds. I even got the X3 hooked up to my MacBook Pro and finally was able to try out Garage Band. I was able to lay down the rhythm track for &lt;A class="" href="http://www.satriani.com/2004/discography/Surfing_With_The_Alien/" target=_blank mce_href="http://www.satriani.com/2004/discography/Surfing_With_The_Alien/"&gt;Crushing Day&lt;/A&gt; (what I could remember from back in the day)&amp;nbsp;and then play the lead part over it with no lag. The roland CM-30s are nice because I can run my Alesis QS8&amp;nbsp;and the&amp;nbsp;POD X3 into them at the same time.&amp;nbsp;This is probly the best setup&amp;nbsp;I've ever had. &lt;/P&gt;
&lt;P mce_keep="true"&gt;Later today I hooked up a microphone to the X3 and the kids had a blast talking and play singing into it. "Daddy it sounds kinda like&amp;nbsp;I'm in a cave...". Perhaps I should cut down some of that reverb. :)&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Santa Clause was good to me this year. (Thanks Janice)&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5506558" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="Music" scheme="http://weblogs.asp.net/dfindley/archive/tags/Music/default.aspx" /><category term="XMAS" scheme="http://weblogs.asp.net/dfindley/archive/tags/XMAS/default.aspx" /><category term="Guitar" scheme="http://weblogs.asp.net/dfindley/archive/tags/Guitar/default.aspx" /></entry><entry><title>LINQ - The Uber FindControl</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/06/29/linq-the-uber-findcontrol.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/06/29/linq-the-uber-findcontrol.aspx</id><published>2007-06-29T14:14:00Z</published><updated>2007-06-29T14:14:00Z</updated><content type="html">&lt;P&gt;With a simple extension method to ControlCollection to flatten the control tree you can use LINQ to query the control tree:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; PageExtensions
{
    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;Control&amp;gt; All(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt; ControlCollection controls)
    {
        &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (Control control &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; controls)
        {
            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (Control grandChild &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; control.Controls.All())
                &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; grandChild;

            &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; control;
        }
    }
}
&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;Now I can do things like this:&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;// get the first empty textbox&lt;/SPAN&gt;
TextBox firstEmpty = accountDetails.Controls
    .All()
    .OfType&amp;lt;TextBox&amp;gt;()
    .Where(tb =&amp;gt; tb.Text.Trim().Length == 0)
    .FirstOrDefault();

&lt;SPAN class=rem&gt;// and focus it&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (firstEmpty != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
    firstEmpty.Focus();
&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;P&gt;Pretty cool! I can do all sorts of querying of the control tree now. LINQ you are my hero.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2975485" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author></entry><entry><title>A Quick Fix for the Validator SetFocusOnError Bug</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx</id><published>2007-06-29T14:03:00Z</published><updated>2007-06-29T14:03:00Z</updated><content type="html">&lt;DIV class=csharpcode&gt;The ASP.NET validators have this nice property called "SetFocusOnError" that is supposed to set the focus to the first control that failed validation. This all works great until your validator control is inside a naming container. I ran into this recently when using validators in a DetailsView. Take this simple example:&lt;/DIV&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=asp&gt;&amp;lt;%@ Page Language="C#" %&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;script&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;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Page_Load(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, EventArgs e)
    {
        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!IsPostBack)
            DataBind();
    }
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;script&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;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 Transitional//EN"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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;&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;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;="_frm"&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;asp:DetailsView&lt;/SPAN&gt; 
        &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="dv1"&lt;/SPAN&gt; 
        &lt;SPAN class=attr&gt;DefaultMode&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Edit"&lt;/SPAN&gt; 
        &lt;SPAN class=attr&gt;DataSource&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;='&amp;lt;%# new object[1] %&amp;gt;'&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;Fields&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;="First Name:"&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;EditItemTemplate&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:TextBox&lt;/SPAN&gt; &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="FirstNameTextBox"&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;asp:RequiredFieldValidator&lt;/SPAN&gt; 
                    &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="FirstNameValidator1"&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;ControlToValidate&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="FirstNameTextBox"&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;ErrorMessage&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="First name is required."&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;Display&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Dynamic"&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;EnableClientScript&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="false"&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;SetFocusOnError&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="true"&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;ValidationGroup&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="bug"&lt;/SPAN&gt;
                    &lt;SPAN class=attr&gt;Text&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="*"&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;EditItemTemplate&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;Fields&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;FooterTemplate&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:ValidationSummary&lt;/SPAN&gt; 
            &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="vs1"&lt;/SPAN&gt;
            &lt;SPAN class=attr&gt;DisplayMode&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="List"&lt;/SPAN&gt;
            &lt;SPAN class=attr&gt;ValidationGroup&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="bug"&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;asp:Button&lt;/SPAN&gt; 
            &lt;SPAN class=attr&gt;ID&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Button1"&lt;/SPAN&gt; 
            &lt;SPAN class=attr&gt;Text&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="Post Back"&lt;/SPAN&gt;
            &lt;SPAN class=attr&gt;ValidationGroup&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="bug"&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;FooterTemplate&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:DetailsView&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;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;If you run this page and do a view source you'll see that the FirstNameTextBox gets rendered like this:&lt;/DIV&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;input&lt;/SPAN&gt; &lt;SPAN class=attr&gt;name&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="dv1$FirstNameTextBox"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;type&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="text"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;id&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="dv1_FirstNameTextBox"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;DIV class=csharpcode&gt;If you just do a post back without entering a value to cause the validator to fail it will output this line of java script in an attempt to set the focus to the invalid element:&lt;/DIV&gt;&lt;PRE class=csharpcode&gt;WebForm_AutoFocus(&lt;SPAN class=str&gt;'FirstNameTextBox'&lt;/SPAN&gt;);&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;See anything wrong with this? It would seem that the validators just use the string value you typed in for the ControlToValidate property rather than doing a FindControl and using the UniqueID. This is exactly what happens and I verified it with reflector. The Validate method on BaseValidator does this:&lt;/DIV&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; ((!&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.IsValid &amp;amp;&amp;amp; (&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Page != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)) &amp;amp;&amp;amp; &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.SetFocusOnError)
{
  &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Page.SetValidatorInvalidControlFocus(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.ControlToValidate);
}&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;DIV class=csharpcode&gt;If you follow the call to SetValidatorInvalidControlFocus you'll see that it never resolves the full UniqueID of the control that its going to set focus to.&lt;/DIV&gt;
&lt;DIV class=csharpcode&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=csharpcode&gt;Ok, so this sucks. How do I work around it. My solution was to simply ditch using the SetFocusOnError property and implement the focus logic myself which is actually pretty easy. I overrode Validate method on my Page like this:&lt;/DIV&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Validate(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; group)
{
    &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.Validate(group);

    &lt;SPAN class=rem&gt;// find the first validator that failed&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (IValidator validator &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; GetValidators(group))
    {
        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (validator &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; BaseValidator &amp;amp;&amp;amp; !validator.IsValid)
        {
            BaseValidator bv = (BaseValidator)validator;
            
            &lt;SPAN class=rem&gt;// look up the control that failed validation&lt;/SPAN&gt;
            Control target = 
                bv.NamingContainer.FindControl(bv.ControlToValidate);
            
            &lt;SPAN class=rem&gt;// set the focus to it&lt;/SPAN&gt;
            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (target != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                target.Focus();
            
            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;
        }
    }
}&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;If your using C# 3 this is even easier using LINQ:&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Validate(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; group)
{
    &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.Validate(group);

    &lt;SPAN class=rem&gt;// get the first validator that failed&lt;/SPAN&gt;
    var validator = GetValidators(group)
        .OfType&amp;lt;BaseValidator&amp;gt;()
        .FirstOrDefault(v =&amp;gt; !v.IsValid);

    &lt;SPAN class=rem&gt;// set the focus to the control&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;// that the validator targets&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (validator != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
    {
        Control target = validator
            .NamingContainer
            .FindControl(validator.ControlToValidate);

        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (target != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
            target.Focus();
    }
}
&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;
&lt;PRE class=csharpcode&gt;I hope this saves someone the headache of tracking this down.&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;&lt;/PRE&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2975478" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="C#" scheme="http://weblogs.asp.net/dfindley/archive/tags/C_2300_/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>VS.NET Macro To Group and Sort Your Using Statements</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/02/07/vs-net-macro-to-group-and-sort-your-using-statements.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/02/07/vs-net-macro-to-group-and-sort-your-using-statements.aspx</id><published>2007-02-08T04:20:01Z</published><updated>2007-02-08T04:20:01Z</updated><content type="html">&lt;p&gt;I try to&amp;nbsp;follow a coding standard for organizing my using statements. System.* goes at the top and then other namespaces grouped together like this:&lt;/p&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.Collections.Generic;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlClient;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Script.Services;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Services;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Services.Protocols;

        &lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.CSharp;

        &lt;span class="kwrd"&gt;using&lt;/span&gt; MyCompany;
        &lt;span class="kwrd"&gt;using&lt;/span&gt; MyCompany.Web;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;I finally got tired enough of keeping this all sorted out that I made a VS.NET macro to do it for me. This macro will take the current selection, parse it for using statements, group and sort them like the above example.&lt;/p&gt;
&lt;p&gt;Here's the macro code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; _usingPattern &lt;span class="kwrd"&gt;As&lt;/span&gt; Regex = &lt;span class="kwrd"&gt;New&lt;/span&gt; Regex( _
        &lt;span class="str"&gt;"\s*(?&amp;lt;using&amp;gt;using\s*(?&amp;lt;group&amp;gt;\w+)[^;]*);"&lt;/span&gt;, _
        RegexOptions.IgnoreCase _
        &lt;span class="kwrd"&gt;Or&lt;/span&gt; RegexOptions.Multiline _
        &lt;span class="kwrd"&gt;Or&lt;/span&gt; RegexOptions.ExplicitCapture _
        &lt;span class="kwrd"&gt;Or&lt;/span&gt; RegexOptions.CultureInvariant _
        &lt;span class="kwrd"&gt;Or&lt;/span&gt; RegexOptions.Compiled _
    )

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; SortUsing()
        &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; DTE.ActiveDocument &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sel &lt;span class="kwrd"&gt;As&lt;/span&gt; TextSelection = DTE.ActiveDocument.Selection

            &lt;span class="kwrd"&gt;If&lt;/span&gt; sel.Text.Contains(vbCrLf) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                &lt;span class="kwrd"&gt;If&lt;/span&gt; sel.ActivePoint &lt;span class="kwrd"&gt;Is&lt;/span&gt; sel.BottomPoint &lt;span class="kwrd"&gt;Then&lt;/span&gt; sel.SwapAnchor()
                sel.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn, &lt;span class="kwrd"&gt;True&lt;/span&gt;)
                sel.SwapAnchor()
                sel.EndOfLine(&lt;span class="kwrd"&gt;True&lt;/span&gt;)

                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; groups &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SortedList(Of &lt;span class="kwrd"&gt;String&lt;/span&gt;, List(Of &lt;span class="kwrd"&gt;String&lt;/span&gt;))()
                &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; match &lt;span class="kwrd"&gt;As&lt;/span&gt; Match &lt;span class="kwrd"&gt;In&lt;/span&gt; _usingPattern.Matches(sel.Text)
                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; u &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = match.Groups(&lt;span class="str"&gt;"using"&lt;/span&gt;).Value
                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; g &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = match.Groups(&lt;span class="str"&gt;"group"&lt;/span&gt;).Value

                    &lt;span class="rem"&gt;' System usings sort at the top&lt;/span&gt;
                    &lt;span class="kwrd"&gt;If&lt;/span&gt; g = &lt;span class="str"&gt;"System"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; g = &lt;span class="str"&gt;"_"&lt;/span&gt; + g

                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; list &lt;span class="kwrd"&gt;As&lt;/span&gt; List(Of &lt;span class="kwrd"&gt;String&lt;/span&gt;)
                    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; groups.TryGetValue(g, list) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                        list = &lt;span class="kwrd"&gt;New&lt;/span&gt; List(Of &lt;span class="kwrd"&gt;String&lt;/span&gt;)()
                        groups.Add(g, list)
                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
                    list.Add(u)
                &lt;span class="kwrd"&gt;Next&lt;/span&gt;

                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; builder &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; StringBuilder()
                &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; group &lt;span class="kwrd"&gt;As&lt;/span&gt; KeyValuePair(Of &lt;span class="kwrd"&gt;String&lt;/span&gt;, List(Of &lt;span class="kwrd"&gt;String&lt;/span&gt;)) &lt;span class="kwrd"&gt;In&lt;/span&gt; groups
                    &lt;span class="kwrd"&gt;If&lt;/span&gt; builder.Length &amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt; builder.AppendLine()
                    group.Value.Sort()
                    &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; line &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; &lt;span class="kwrd"&gt;In&lt;/span&gt; group.Value
                        builder.Append(line)
                        builder.AppendLine(&lt;span class="str"&gt;";"&lt;/span&gt;)
                    &lt;span class="kwrd"&gt;Next&lt;/span&gt;
                &lt;span class="kwrd"&gt;Next&lt;/span&gt;

                sel.DeleteLeft()
                sel.Insert(builder.ToString())
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;
&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1579576" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="C#" scheme="http://weblogs.asp.net/dfindley/archive/tags/C_2300_/default.aspx" /><category term="Visual Studio" scheme="http://weblogs.asp.net/dfindley/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Fix ReturnUrl When Sharing Forms Authentication with Multiple Web Applications</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/02/06/fix-returnurl-when-sharing-forms-authentication-with-multiple-web-applications.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/02/06/fix-returnurl-when-sharing-forms-authentication-with-multiple-web-applications.aspx</id><published>2007-02-06T17:01:51Z</published><updated>2007-02-06T17:01:51Z</updated><content type="html">&lt;p&gt;Scenario: You have two web applications www.mydomain.com and login.mydomain.com. The login site provides a centralized login application and www contains any number of web applications that should use the auth ticket issued by the login site. &lt;/p&gt; &lt;p&gt;The auth ticket can be setup to be shared across the two 3rd level domains no problem. The problem with this setup is that when the user requests a page on www and gets redirected to login the ReturnUrl query string parameter contains a relative path. As far as I know there are not any extensibility points on the FormsAuthenication or FormsAuthenticationModule classes that you can use to fix this.&amp;nbsp;A quick and dirty fix is to use the EndRequest event in your global.asax like this:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Application_EndRequest(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; redirectUrl = &lt;span class="kwrd"&gt;this&lt;/span&gt;.Response.RedirectLocation;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(redirectUrl))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Response.RedirectLocation = Regex.Replace(redirectUrl, &lt;span class="str"&gt;"ReturnUrl=(?'url'.*)"&lt;/span&gt;, &lt;span class="kwrd"&gt;delegate&lt;/span&gt;(Match m)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt; url = HttpUtility.UrlDecode(m.Groups[&lt;span class="str"&gt;"url"&lt;/span&gt;].Value);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                Uri u = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Request.Url, url);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"ReturnUrl={0}"&lt;/span&gt;, HttpUtility.UrlEncode(u.ToString()));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            }, RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;The basic idea is to intercept the redirect and process the returnurl query string parameter with a regex. This could also be wrapped up in it's own HttpModule. It's kind of cheezy I know but it seems to work.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1562623" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>A VS.NET Macro to Generate Machine Keys.</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/02/05/a-vs-net-macro-to-generate-machine-keys.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/02/05/a-vs-net-macro-to-generate-machine-keys.aspx</id><published>2007-02-06T02:26:00Z</published><updated>2007-02-06T02:26:00Z</updated><content type="html">&lt;p&gt;I needed to create a new machine key for an asp.net site. I found a couple of command line utils out on the web that would create a new key but I thought it would be easier to just have it avail in VS.NET. So, I threw together this little macro that will generate the machine key and insert it. Just run the macro while you have you web.config open in VS.NET. If you already have a machinekey it will find it and replace it. If not it will just add it right after the &amp;lt;system.web&amp;gt; node. It should do the proper indents and everything too.&lt;/p&gt;&lt;div class="csharpcode" style="width: 747px; height: 1020px"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; EnvDTE&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; EnvDTE80&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Diagnostics&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Module&lt;/span&gt; AspNetUtils&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="preproc"&gt;#Region&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Helper Code&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; _rng &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Security.Cryptography.RNGCryptoServiceProvider()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetRandomData(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; size &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Integer&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt;()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; randomData(size) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        _rng.GetBytes(randomData)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Return&lt;/span&gt; randomData&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ToHex(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sb &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Text.StringBuilder()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;For&lt;/span&gt; i &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Integer&lt;/span&gt; = 0 &lt;span class="kwrd"&gt;To&lt;/span&gt; data.Length - 1&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            sb.AppendFormat(&lt;span class="str"&gt;&amp;quot;{0:X2}&amp;quot;&lt;/span&gt;, data(i))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Return&lt;/span&gt; sb.ToString()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; WriteNewMachineKey(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sel &lt;span class="kwrd"&gt;As&lt;/span&gt; TextSelection)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        sel.Insert(&lt;span class="str"&gt;&amp;quot;&amp;lt;machineKey&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        sel.NewLine()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        sel.Insert(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;validationKey=&amp;#39;{0}&amp;#39;&amp;quot;&lt;/span&gt;, ToHex(GetRandomData(63))))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        sel.NewLine()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        sel.Insert(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;decryptionKey=&amp;#39;{0}&amp;#39;&amp;quot;&lt;/span&gt;, ToHex(GetRandomData(23))))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        sel.NewLine()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        sel.Insert(&lt;span class="str"&gt;&amp;quot;decryption=&amp;#39;SHA1&amp;#39;&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        sel.NewLine()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        sel.Insert(&lt;span class="str"&gt;&amp;quot;/&amp;gt;&amp;quot;&lt;/span&gt;, vsInsertFlags.vsInsertFlagsContainNewText)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        sel.Unindent()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        sel.Collapse()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&lt;span class="preproc"&gt;#End Region&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;&lt;span class="preproc"&gt;#Region&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Macros&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; GenerateMachineKey()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; DTE.ActiveDocument &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;AndAlso&lt;/span&gt; DTE.ActiveDocument.Name.ToLower() = &lt;span class="str"&gt;&amp;quot;web.config&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sel &lt;span class="kwrd"&gt;As&lt;/span&gt; TextSelection = DTE.ActiveDocument.Selection&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; sel.FindPattern(&lt;span class="str"&gt;&amp;quot;\&amp;lt;machineKey((:b|\n)*:i=:q)*(:b|\n)*/\&amp;gt;&amp;quot;&lt;/span&gt;, vsFindOptions.vsFindOptionsFromStart &lt;span class="kwrd"&gt;Or&lt;/span&gt; vsFindOptions.vsFindOptionsMatchInHiddenText &lt;span class="kwrd"&gt;Or&lt;/span&gt; vsFindOptions.vsFindOptionsRegularExpression) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                &lt;span class="rem"&gt;&amp;#39; Replace an existing &amp;lt;machineKey /&amp;gt; element&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;                sel.Delete()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;                WriteNewMachineKey(sel)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; sel.FindText(&lt;span class="str"&gt;&amp;quot;&amp;lt;system.web&amp;gt;&amp;quot;&lt;/span&gt;, vsFindOptions.vsFindOptionsFromStart &lt;span class="kwrd"&gt;Or&lt;/span&gt; vsFindOptions.vsFindOptionsMatchInHiddenText) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;                &lt;span class="rem"&gt;&amp;#39; insert the new machineKey just after the &amp;lt;system.web&amp;gt; element&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                sel.Collapse()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                sel.NewLine()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;                WriteNewMachineKey(sel)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;                &lt;span class="rem"&gt;&amp;#39; no &amp;lt;system.web&amp;gt; element found so just collapse the current selection and insert&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;                &lt;span class="rem"&gt;&amp;#39; the new key at the cursor location&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;                sel.Collapse()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;                WriteNewMachineKey(sel)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;&lt;span class="preproc"&gt;#End Region&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Module&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1554825" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /><category term="Tools" scheme="http://weblogs.asp.net/dfindley/archive/tags/Tools/default.aspx" /><category term="Visual Studio" scheme="http://weblogs.asp.net/dfindley/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>LearnExpression.com is live.</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2007/02/02/learnexpression-com-is-live.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2007/02/02/learnexpression-com-is-live.aspx</id><published>2007-02-03T00:34:34Z</published><updated>2007-02-03T00:34:34Z</updated><content type="html">&lt;p&gt;We recently launched our video tutorial site for &lt;a href="http://www.learnexpression.com" target="_blank"&gt;Expression Web Designer&lt;/a&gt;. Dustin, our resident graphic artist is pumping out the video tutorials as well as designing the site using the tool. It's good to have some how to vids from a designers point of view. Watch this site throughout 2007 as he continues to expand the content.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1527488" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Scott Guthrie presents at NDDNUG</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2006/11/02/Scott-Guthrie-presents-at-NDDNUG.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2006/11/02/Scott-Guthrie-presents-at-NDDNUG.aspx</id><published>2006-11-03T03:03:59Z</published><updated>2006-11-03T03:03:59Z</updated><content type="html">&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scott&lt;/a&gt; gave a whirlwind presentation to a standing room only crowd at the &lt;a href="http://www.nddnug.net/"&gt;North Dallas Dot Net User Group&lt;/a&gt; tonight. A wide range of topics were covered from IDE tips and tricks to ASP.NET tips to MS AJAX to LINQ and DLINQ (I still like to call it DLINQ rather than LINQ to SQL). I'm still not sure how all this got packed into a little over 2 hours. :)&lt;/p&gt; &lt;p&gt;This was the first meeting that I've attended at the new Intuit location. It was quite an upgrade in venue from the previous SMU campus location. Lots of projector screens and flat panels so it was very easy to follow along even if you were in the nose bleed section.&lt;/p&gt; &lt;p&gt;While there's a ton of cool things going on with AJAX, seeing LINQ in action again reminds me of just how revolutionary LINQ is.&lt;/p&gt; &lt;p&gt;So, thanks for the great presentation Scott and don't be a stranger to Dallas! :)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=797380" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="C#" scheme="http://weblogs.asp.net/dfindley/archive/tags/C_2300_/default.aspx" /><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/.NET/default.aspx" /><category term="Debugging" scheme="http://weblogs.asp.net/dfindley/archive/tags/Debugging/default.aspx" /><category term="Visual Studio" scheme="http://weblogs.asp.net/dfindley/archive/tags/Visual+Studio/default.aspx" /><category term="JavaScript" scheme="http://weblogs.asp.net/dfindley/archive/tags/JavaScript/default.aspx" /><category term="Atlas" scheme="http://weblogs.asp.net/dfindley/archive/tags/Atlas/default.aspx" /><category term="LINQ" scheme="http://weblogs.asp.net/dfindley/archive/tags/LINQ/default.aspx" /><category term="DLINQ" scheme="http://weblogs.asp.net/dfindley/archive/tags/DLINQ/default.aspx" /><category term="XLINQ" scheme="http://weblogs.asp.net/dfindley/archive/tags/XLINQ/default.aspx" /></entry><entry><title>Parallels adds "Express Windows Installation"</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2006/11/02/Parallels-adds-_2200_Express-Windows-Installation_2200_.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2006/11/02/Parallels-adds-_2200_Express-Windows-Installation_2200_.aspx</id><published>2006-11-02T20:27:25Z</published><updated>2006-11-02T20:27:25Z</updated><content type="html">&lt;p&gt;I just ran across this over on parallels site:&lt;/p&gt; &lt;p&gt;&lt;a title="http://parallelsvirtualization.blogspot.com/2006/11/installing-windows-on-mac-is-now.html" href="http://parallelsvirtualization.blogspot.com/2006/11/installing-windows-on-mac-is-now.html"&gt;http://parallelsvirtualization.blogspot.com/2006/11/installing-windows-on-mac-is-now.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This sounds like a great feature for their virtualization product. Parallels for OSX is a top notch virtualization product and they just keep on adding features.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=795061" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="Tools" scheme="http://weblogs.asp.net/dfindley/archive/tags/Tools/default.aspx" /><category term="Mac" scheme="http://weblogs.asp.net/dfindley/archive/tags/Mac/default.aspx" /><category term="Vista" scheme="http://weblogs.asp.net/dfindley/archive/tags/Vista/default.aspx" /><category term="Windows" scheme="http://weblogs.asp.net/dfindley/archive/tags/Windows/default.aspx" /></entry><entry><title>Using IronPython for Dynamic Expressions.</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2006/11/02/Using-IronPython-for-Dynamic-Expressions_2E00_.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2006/11/02/Using-IronPython-for-Dynamic-Expressions_2E00_.aspx</id><published>2006-11-02T15:22:13Z</published><updated>2006-11-02T15:22:13Z</updated><content type="html">&lt;p&gt;We recently had this question posted to our forums over at &lt;a href="http://www.learnvisualstudio.net/"&gt;LVS&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Dear Forum Experts: &lt;/p&gt; &lt;p&gt;I am looking for very specialized solution:  &lt;p&gt;I have various Items which I store into a table in a Relational DB.&lt;br&gt;I would like to do a custom calculation, specific for each item at it's instance. Because the calculation is specific for the item, and items are soo many I wold like to store the calculation formula into a relational DB. The problem is to convert the string of formula into a real programming command and to actually perform the calculation. I do not want to use Excel or additional software in order to gain calculation speed e.g.  &lt;p&gt;ItemID = 5001, ItemSize = "a - b"&lt;br&gt;ItemID = 5002, ItemSize = "a - 2*b"&lt;br&gt;ItemID = 5003, ItemSize = "a + b"  &lt;p&gt;So, ItemSize is actually the formula expression that would calculate various instances of a and b variables ... I have tryed this:  &lt;p&gt;int a = 10;&lt;br&gt;int b = 5;  &lt;p&gt;string formula = "a + b" // This comes from ItemSIze of DB,SQL, etc.  &lt;p&gt;int Result = a + b; // This is a second line for test only - hard coded...  &lt;p&gt;int CalcResult = int.Parse(formula); //I wish this was working ...  &lt;p&gt;MessageBox.Show(Result.ToString()); // This works ...&lt;br&gt;MessageBox.Show(CalcResult.ToString()); // Never got that far.  &lt;p&gt;The result will be stored in different DB with the instances of a and b.&lt;br&gt;Could you please post any information on how should I approach this problem.  &lt;p&gt;Thanks a lot.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Several&amp;nbsp;options immediately came to mind: code up a simple expression interpreter, evaluate the expression with dynamic SQL (yuck), use lightweight code gen. Then I remembered this little thing I saw at last years PDC called IronPython. Solving this problem with IronPython was "like butta".&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f344fc39-2c9d-434c-9444-a551a4bbfccb" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 449px; padding-top: 0px"&gt;&lt;pre style="background-color:Silver;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; System;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Text;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; IronPython.Hosting;

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;namespace&lt;/span&gt;&lt;span style="color: #000000; "&gt; PythonDemo
{
  &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Program
  {
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;delegate&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; MyExpressionDelegate(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; a, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; b);
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
    {
      PythonEngine pe &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; PythonEngine();
      MyExpressionDelegate expression &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; 
        pe.CreateLambda&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;MyExpressionDelegate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;a + b&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
      &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; a &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;10&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
      &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;5&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
      &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; c &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; expression(a,b);
      Console.WriteLine(c);
    }
  }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That's all there was to it! The API for the PythonEngine was very intuitive. I could immediately see where and how I could integrate this with any number of applications that I've worked on in the past. Tip of the hat to the IronPython guys!&lt;/p&gt;
&lt;p&gt;Now I haven't tested this against a simple interpreter but I would imagine as long as you are smart and keep a cache of the expressions and don't re-parse them every time that it would perform just as well as any interpreted solution if not better. Just follow the make it work, make it work right and make it work fast model and you'll be ok.&lt;/p&gt;
&lt;p&gt;I wonder if this would also be possible by referenceing the PowerShell runtime. I'll have to take a look at that next and see how it compares.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S. Microsoft, if you're listening, please include IronPython in the Orcas/NETFX3.5 release! :) I'd love to see IDE support for python scripts and such.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=791606" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="C#" scheme="http://weblogs.asp.net/dfindley/archive/tags/C_2300_/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/.NET/default.aspx" /><category term="Programming Languages" scheme="http://weblogs.asp.net/dfindley/archive/tags/Programming+Languages/default.aspx" /><category term="Tips" scheme="http://weblogs.asp.net/dfindley/archive/tags/Tips/default.aspx" /></entry><entry><title>Suggestions for distributing CTPs as VirtualPC images</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2006/10/24/Suggestions-for-distributing-CTPs-as-VirtualPC-images.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2006/10/24/Suggestions-for-distributing-CTPs-as-VirtualPC-images.aspx</id><published>2006-10-25T02:36:32Z</published><updated>2006-10-25T02:36:32Z</updated><content type="html">&lt;p&gt;I finally got around to trying the Sept. CTP of Orcas. I loaded up the VPC images on VPC7 Beta (which seems to perform much better than VPC2004). If this is going to be the way that MS is going to release CTPs in the future here are a few suggestions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Don't have undo disks enabled. This just slows things down. If I hose out the vm image I can redownload from MSDN or just recopy it from a backup. This just makes things slow.  &lt;li&gt;Don't install every single option of VS.NET. Are there really CTP changes to Crystal Reports in this release? This is just a waste of hard drive space and makes the experience more frustrating.  &lt;li&gt;Tweak the .vmc files so that they don't have some MS developers local paths to the E drive in them. This makes the end user have to relocate the hard drives on first launch. This is a little thing but its so simple to fix why not do it.  &lt;li&gt;Please, please, please allocate more than 384M ram for a VS.NET + SQL + IIS install. At least up it to 512M. I would not advise that anyone run the Orcas CTP in less than 512M ram. It was painfully slow on my 2 Ghz Core Duo MacBook Pro. I quickly upped it to 1Gig allocation and it was like night and day. I realize that not everyone can allocate 1 gig ram so a better compromise would be 512M. If you only have 512M mem in your host PC then your virtualization experience is going to be horrible anyway. Again this is a small thing but its so brain dead simple it should just be setup correctly to begin with.  &lt;li&gt;Make the simple tweaks to make win2k more developer workstation friendly. For example: do we need to have the shutdown logging feature enabled in order to preview a CTP?&amp;nbsp;The performance options were still set to Background Services and System Cache!?! These tweaks could be made to the parent differencing disk at the beginning so that the OS install is set and ready to go for developer use.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;One of the advantages of a virtualized CTP is that we developers don't have to sit through an install process. This is negated if we have to do alot of fiddling with the VM settings in order to make it run at an acceptable level.&lt;/p&gt; &lt;p&gt;These are all little nit picks but I think the effort is really small and would give the end users a much better experience when trying out the CTPs.&lt;/p&gt; &lt;p&gt;&lt;em&gt;P.S. also consider using a tool like &lt;/em&gt;&lt;a title="http://www.invirtus.com/" href="http://www.invirtus.com/"&gt;&lt;em&gt;http://www.invirtus.com/&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;to shrink down and optimize the vm image. VM Optimizer works wonders for shrinking the size of the virtual machine which in turn improves over all perf.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=724020" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="C#" scheme="http://weblogs.asp.net/dfindley/archive/tags/C_2300_/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/.NET/default.aspx" /><category term="Tools" scheme="http://weblogs.asp.net/dfindley/archive/tags/Tools/default.aspx" /><category term="Visual Studio" scheme="http://weblogs.asp.net/dfindley/archive/tags/Visual+Studio/default.aspx" /><category term="LINQ" scheme="http://weblogs.asp.net/dfindley/archive/tags/LINQ/default.aspx" /><category term="Tips" scheme="http://weblogs.asp.net/dfindley/archive/tags/Tips/default.aspx" /></entry><entry><title>ASP.NET AJAX 1.0 (excitement builds)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/dfindley/archive/2006/10/20/ASP.NET-AJAX-1.0-_2800_excitement-builds_2900_.aspx" /><id>http://weblogs.asp.net/dfindley/archive/2006/10/20/ASP.NET-AJAX-1.0-_2800_excitement-builds_2900_.aspx</id><published>2006-10-21T03:38:14Z</published><updated>2006-10-21T03:38:14Z</updated><content type="html">&lt;p&gt;I just downloaded beta 1 of ASP.NET AJAX today. Wow! Lots and lots of changes. The type system has been greatly simplified. I like this. The move to prototypes over closures was a good decision. The core scripts are much easier to read and comprehend as well. The CTP download has been a 404 for me this evening so I haven't had a chance to dive into it. &lt;/p&gt; &lt;p&gt;Looking through the core scripts there seem to many improvements. There used to be a bunch of prototype extensions to the Function object that were really only applicable to ctor functions. This seemed like it was pretty inefficient. That doesn't seem to be the case anymore.&lt;/p&gt; &lt;p&gt;All in all the script library feels less like a hodge podge of techniques from around the web and has more of a cohesive feel to it. Maybe that'll change once I get into the CTP add-ons. Overall I'm&amp;nbsp;impressed with what I've seen so far. This definitely seems like a big step forward.&lt;/p&gt; &lt;p&gt;We used the CTPs for some back-end admin functionality on &lt;a href="http://www.learnvisualstudio.net/"&gt;http://www.learnvisualstudio.net/&lt;/a&gt;&amp;nbsp;so as soon as I can lay my hands on the new CTP bits I'll have to see what the migration process is like.&lt;/p&gt; &lt;p&gt;Ok, time to get back to playing... :)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Update: looks like the CTP download is working now. I think its going to be a long weekend. ;)&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=699734" width="1" height="1"&gt;</content><author><name>findleyd</name><uri>http://weblogs.asp.net/members/findleyd.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/ASP.NET/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/dfindley/archive/tags/.NET/default.aspx" /><category term="JavaScript" scheme="http://weblogs.asp.net/dfindley/archive/tags/JavaScript/default.aspx" /><category term="Atlas" scheme="http://weblogs.asp.net/dfindley/archive/tags/Atlas/default.aspx" /><category term="AJAX" scheme="http://weblogs.asp.net/dfindley/archive/tags/AJAX/default.aspx" /></entry></feed>