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

<channel>
	<title>gaskell.org &#187; asp.net</title>
	<atom:link href="http://gaskell.org/category/aspnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://gaskell.org</link>
	<description>picking up where teh rest leave off</description>
	<lastBuildDate>Sun, 15 Nov 2009 07:55:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Rails helper distance_of_time_in_words ported to C#</title>
		<link>http://gaskell.org/rails-helper-distance_of_time_in_words-ported-to-c/</link>
		<comments>http://gaskell.org/rails-helper-distance_of_time_in_words-ported-to-c/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 06:31:10 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[asp.net MVC]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://gaskell.org/?p=85</guid>
		<description><![CDATA[While learning rails I came across a very cool helper method called distance_of_time_in_words. You&#8217;ve probably seen this method in action if you&#8217;ve used Twitter &#8211; no guessing about time zones and as a user I think it&#8217;s a nice touch. So on to the port itself&#8230;
The Good
C# is automatically faster because everyone knows Ruby is [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:right;margin: 1em 2em;" src="/upload/kabouter-can-scale.jpg" alt="kabouter can scale." title="kabouter can scale." />While learning rails I came across a very cool helper method called <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#M001712">distance_of_time_in_words</a>. You&#8217;ve probably seen this method in action if you&#8217;ve used Twitter &#8211; no guessing about time zones and as a user I think it&#8217;s a nice touch. So on to the port itself&#8230;</p>
<p><strong>The Good</strong><br />
C# is automatically faster because everyone knows Ruby is slow and that <a href="http://canrailsscale.com">rails can&#8217;t scale</a>.<br />
Seriously though, the port to C# uses resource files so internationalization is handled by simply adding a translated resource file to your project. </p>
<p><strong>The Bad</strong><br />
C# doesn&#8217;t have the concept of static extension methods. To me DateTime.DistanceOfTimeInWords would be much nicer than DateHelper.DistanceOfTimeInWords.<br />
Range support in the language is hokey at best. No ranges in switch statements. bleh.</p>
<p><strong>The Ugly</strong><br />
The code! If you compare the C# version to the Ruby version it&#8217;s a little ahhhhhhhhhhh&#8230; inelegant? The Ruby version weighs in at 28 lines of <em>readable</em> code. The C# version is a b-e-a-s-t with 55 lines of code including 2 helper methods. I&#8217;m open to any suggestions in making the C# code shorter or more readable.</p>
<p><strong>The Rest</strong><br />
The method <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#M001713">time_ago_in_words</a> has also been ported. Altogether the helper code is 74 lines &#8211; also included is over 250 lines of test code. All examples listed on the Rails page were also included in the test.</p>
<p>You can grab the code <a href="http://gaskell.org/upload/Helpers.zip">here</a> or at the subversion repository <a href="http://svn.gaskell.org/helpers">http://svn.gaskell.org/helpers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/rails-helper-distance_of_time_in_words-ported-to-c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bulletproof Ajax with ASP.NET MVC (this time with jQuery)</title>
		<link>http://gaskell.org/bulletproof-ajax-with-aspnet-mvc-this-time-with-jquery/</link>
		<comments>http://gaskell.org/bulletproof-ajax-with-aspnet-mvc-this-time-with-jquery/#comments</comments>
		<pubDate>Sun, 10 Aug 2008 22:11:11 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://gaskell.org/?p=81</guid>
		<description><![CDATA[As a follow up a recent post about using unobtrusive javascript and Ajax in your ASP.NET MVC applications, I ported the Bulletproof Ajax bookstore application to use jQuery instead of Hijax. This led to more terse code &#8211; lines of javascript were reduced from 178 to 41. If you&#8217;ve spent at least few hours jQuery [...]]]></description>
			<content:encoded><![CDATA[<p>As a follow up a <a href="/bulletproof-ajax-with-aspnet-mvc/">recent post</a> about using <a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript" target="_blank">unobtrusive javascript</a> and Ajax in your ASP.NET MVC applications, I ported the <a href="http://www.amazon.com/Bulletproof-Ajax-Jeremy-Keith/dp/0321472667&amp;tag=9182-20">Bulletproof Ajax</a> bookstore application to use jQuery instead of <a href="http://bulletproofajax.com/shop/javascript/hijax.js">Hijax</a>. This led to more terse code &#8211; lines of javascript were reduced from 178 to 41. If you&#8217;ve spent at least few hours jQuery then you should find that the new code is also more readable. No server side code changes were necessary.
<p>jQuery is also really easy to extend &#8211; I wrote a couple of extensions that would be usable throughout an application. Here&#8217;s the extension I wrote to produce the ubiquitous <a href="http://www.37signals.com/svn/archives/000558.php">yellow fade effect</a>: </p>
<pre class="code">(<span style="color: blue">function</span>($) {
   $.fn.yellowFade = <span style="color: blue">function</span>() {
    <span style="color: blue">return this</span>.css({backgroundColor: <span style="color: #a31515">&quot;#ffffcc&quot;</span>})
    .animate({backgroundColor: <span style="color: #a31515">&quot;#ffffff&quot;</span>}, 1500, <span style="color: #a31515">&quot;linear&quot;</span>);
   }
 })(jQuery);</pre>
<p>Calling this method flows with the rest of jQuery style chaining of methods:</p>
<pre class="code"><span style="color: blue">function</span>(data) { $(<span style="color: #a31515">&quot;div#basket&quot;</span>).html(data).yellowFade(); });</pre>
<p>This one liner is a callback from our http post to the /Cart/AddProduct. The data parameter contains the response from the server. $(<span style="color: #a31515">&quot;div#basket&quot;</span>) is getting the container div from our shopping cart. Then we replace the html within the shopping cart div with the response from the server and follow it up with a yellow fade to provide user feedback.</p>
<p>Code is downloadable <a href="http://gaskell.org/upload/jShop.zip" target="_blank">here</a>. The <a href="http://jshop.gaskell.org" target="_blank">demo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/bulletproof-ajax-with-aspnet-mvc-this-time-with-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Microsoft&#8217;s Ajax Support for ASP.NET MVC Fails (for now)</title>
		<link>http://gaskell.org/microsofts-ajax-support-for-aspnet-mvc-fails-for-now/</link>
		<comments>http://gaskell.org/microsofts-ajax-support-for-aspnet-mvc-fails-for-now/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 04:10:22 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://gaskell.org/?p=73</guid>
		<description><![CDATA[But it&#8217;s not an epic fail (for now). It&#8217;s important that my sites function without javascript or Ajax support. Ajax should be used enhance usability and is not a requirement to access my content.
I was checking out Hanselman&#8217;s Ajax example (the truly lazy can download the code here) and I was pretty bummed when I [...]]]></description>
			<content:encoded><![CDATA[<p>But it&#8217;s not an epic fail (for now). It&#8217;s important that my sites function <em>without</em> javascript or Ajax support. Ajax should be used enhance usability and is not a requirement to access my content.</p>
<p>I was checking out <a href="http://www.hanselman.com/blog/ASPNETMVCPreview4UsingAjaxAndAjaxForm.aspx">Hanselman&#8217;s Ajax example</a> (the truly lazy can download the code <a href="/upload/MvcApplication1.zip">here</a>) and I was pretty bummed when I disabled javascript and saw this:</p>
<div style="margin:10px;">
<img src="/upload/failure-to-ajaxing.jpg" alt="failure on the ajax front" />
</div>
<p>Oops. That&#8217;s probably not what the user expected. Maybe there&#8217;s some way to get the AjaxHelper to save us but none of the 10 overloads for the ActionLink or Form methods stood out to me. Until I get around to really learning jQuery, I&#8217;ll stick with writing Ajax by hand. This allows me to request different urls based on whether or not javascript is enabled. And writing your own javascript really isn&#8217;t that hard &#8211; go grab a <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.com%2FJavaScript-Definitive-Guide-David-Flanagan%2Fdp%2F0596101996%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1217909078%26sr%3D8-1&#038;tag=9182-20&#038;linkCode=ur2&#038;camp=1789&#038;creative=9325">good</a><img src="http://www.assoc-amazon.com/e/ir?t=9182-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.com%2FHead-First-JavaScript%2Fdp%2F0596527748%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1217909078%26sr%3D8-3&#038;tag=9182-20&#038;linkCode=ur2&#038;camp=1789&#038;creative=9325">book</a><img src="http://www.assoc-amazon.com/e/ir?t=9182-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/microsofts-ajax-support-for-aspnet-mvc-fails-for-now/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bulletproof Ajax with ASP.NET MVC</title>
		<link>http://gaskell.org/bulletproof-ajax-with-aspnet-mvc/</link>
		<comments>http://gaskell.org/bulletproof-ajax-with-aspnet-mvc/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 03:26:26 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://gaskell.org/?p=59</guid>
		<description><![CDATA[After reading the excellent Bulletproof Ajax by Jeremy Keith, I thought porting the Bulletproof Books sample application to ASP.NET MVC would be a great first attempt at building an ASP.NET MVC application. One of the main points of Bulletproof Ajax is that Ajax should be used to enhance usability and not to make Ajax a [...]]]></description>
			<content:encoded><![CDATA[<p>After reading the excellent <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.com%2FBulletproof-Ajax-Jeremy-Keith%2Fdp%2F0321472667&#038;tag=9182-20&#038;linkCode=ur2&#038;camp=1789&#038;creative=9325">Bulletproof Ajax</a><img src="http://www.assoc-amazon.com/e/ir?t=9182-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Jeremy Keith, I thought porting the Bulletproof Books sample application to ASP.NET MVC would be a great first attempt at building an ASP.NET MVC application. One of the main points of Bulletproof Ajax is that Ajax should be used to enhance usability and not to make Ajax a requirement to access your content. <a href="http://dotnet.gaskell.org">My version</a> of the <a href="http://bulletproofajax.com/shop/">Bulletproof Books Shop</a> also makes Javascript and XMLHttpRequest support optional.</p>
<div style="margin-bottom:10px;margin-top:10px">
Keeping the site accessible to most web browsers took some extra work and consideration when building the Controllers. I decided that any HomeController actions would render html for the entire page. </div>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20         \cf3 public\cf0  \cf4 ActionResult\cf0  Index()\par ??        \{\par ??            ViewData.Model = \cf4 Product\cf0 .Products;\par ??            \cf3 return\cf0  View(\cf5 "Index"\cf0 );\par ??        \}\par ??\par ??        \cf3 public\cf0  \cf4 ActionResult\cf0  AddProductToCart(\cf3 string\cf0  productID, \cf3 int\cf0  quantity)\par ??        \{\par ??            \cf4 CartController\cf0  cartController = \cf3 new\cf0  \cf4 CartController\cf0 ();\par ??            cartController.AddProduct(productID, quantity);\par ??            \cf3 return\cf0  Index();\par ??        \}\par ??\par ??        \cf3 public\cf0  \cf4 ActionResult\cf0  RateProduct(\cf3 string\cf0  productID, \cf3 string\cf0  rating)\par ??        \{\par ??            \cf4 RatingController\cf0  ratingController = \cf3 new\cf0  \cf4 RatingController\cf0 ();\par ??            ratingController.RateProduct(productID, rating);\par ??            \cf3 return\cf0  Index();\par ??        \}}<br />
--></p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;13</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">ActionResult</span> Index()</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;14</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ViewData.Model = <span style="color: #2b91af;">Product</span>.Products;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;16</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> View(<span style="color: #a31515;">&#8220;Index&#8221;</span>);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;17</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;18</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;19</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">ActionResult</span> AddProductToCart(<span style="color: blue;">string</span> productID, <span style="color: blue;">int</span> quantity)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;20</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;21</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">CartController</span> cartController = <span style="color: blue;">new</span> <span style="color: #2b91af;">CartController</span>();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;22</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cartController.AddProduct(productID, quantity);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;23</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> Index();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;24</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;25</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;26</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">ActionResult</span> RateProduct(<span style="color: blue;">string</span> productID, <span style="color: blue;">string</span> rating)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;27</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">RatingController</span> ratingController = <span style="color: blue;">new</span> <span style="color: #2b91af;">RatingController</span>();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ratingController.RateProduct(productID, rating);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> Index();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;31</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
</div>
<div style="margin-bottom:10px;margin-top:10px;">Controllers that refresh partial chunks of html will know how to respond to actions (add product to cart, rate a product) and render views mapped to MVC user controls. The client will make http requests to different urls based on javascript support in the browser. For example to add a product to a cart with javascript enabled, the javascript will make a post to /Cart.mvc/AddProduct and the server will response with a chunk of html. To add a product with javascript disabled the client will post to /Home.mvc/AddProductToCart and the server will respond with an entire page. The HomeController ends up forwarding the call to the appropriate controller so we&#8217;re able to avoid duplicating logic.</div>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20         \cf3 public\cf0  \cf4 ActionResult\cf0  DisplayCart()\par ??        \{\par ??            \cf4 Cart\cf0  cart = GetCart();\par ??            \cf3 return\cf0  View(\cf5 "Cart"\cf0 , cart);\par ??        \}\par ??\par ??        \cf3 public\cf0  \cf4 ActionResult\cf0  AddProduct(\cf3 string\cf0  productID, \cf3 int\cf0  quantity)\par ??        \{\par ??            \cf4 Cart\cf0  cart = GetCart();\par ??            \cf4 Product\cf0  product = \cf4 Product\cf0 .Products.Find(s =&gt; s.ID == productID);\par ??            cart.AddProduct(product, quantity);\par ??            SetCart(cart);\par ??            \cf3 return\cf0  View(\cf5 "Cart"\cf0 , cart);\par ??        \}}<br />
--></p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">ActionResult</span> DisplayCart()</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Cart</span> cart = GetCart();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;31</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> View(<span style="color: #a31515;">&#8220;Cart&#8221;</span>, cart);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;33</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">ActionResult</span> AddProduct(<span style="color: blue;">string</span> productID, <span style="color: blue;">int</span> quantity)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Cart</span> cart = GetCart();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;37</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Product</span> product = <span style="color: #2b91af;">Product</span>.Products.Find(s =&gt; s.ID == productID);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;38</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cart.AddProduct(product, quantity);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SetCart(cart);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;40</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> View(<span style="color: #a31515;">&#8220;Cart&#8221;</span>, cart);</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
</div>
<div style="margin-bottom:10px;margin-top:10px">One thing I&#8217;m not sure about is state management in ASP.NET MVC, so I&#8217;m currently storing the cart and ratings in session.</div>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20         \cf3 private\cf0  \cf4 Rating\cf0  GetRatings()\par ??        \{\par ??            \cf4 Rating\cf0  rating = System.Web.\cf4 HttpContext\cf0 .Current.Session[\cf5 "Rating"\cf0 ] \cf3 as\cf0  \cf4 Rating\cf0 ;\par ??            \cf3 if\cf0  (rating == \cf3 null\cf0 )\par ??            \{\par ??                rating = \cf3 new\cf0  \cf4 Rating\cf0 ();\par ??            \}\par ??            \cf3 return\cf0  rating;\par ??        \}\par ??\par ??        \cf3 private\cf0  \cf3 void\cf0  SetRating(\cf4 Rating\cf0  rating)\par ??        \{\par ??            System.Web.\cf4 HttpContext\cf0 .Current.Session[\cf5 "Rating"\cf0 ] = rating;\par ??        \}}<br />
--></p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;22</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: #2b91af;">Rating</span> GetRatings()</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;23</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;24</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Rating</span> rating = System.Web.<span style="color: #2b91af;">HttpContext</span>.Current.Session[<span style="color: #a31515;">"Rating"</span>] <span style="color: blue;">as</span> <span style="color: #2b91af;">Rating</span>;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;25</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (rating == <span style="color: blue;">null</span>)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;26</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;27</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rating = <span style="color: blue;">new</span> <span style="color: #2b91af;">Rating</span>();</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> rating;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;31</span>&nbsp;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> SetRating(<span style="color: #2b91af;">Rating</span> rating)</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;33</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.Web.<span style="color: #2b91af;">HttpContext</span>.Current.Session[<span style="color: #a31515;">"Rating"</span>] = rating;</p>
<p style="margin: 0px;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
</div>
<div style="margin-bottom:10px;margin-top:10px">
You can download the source <a href="http://gaskell.org/upload/BulletproofShop.zip">here</a>.</div>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/bulletproof-ajax-with-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Using the digg API in an ASP.NET Page</title>
		<link>http://gaskell.org/using-the-digg-api-in-an-aspnet-page/</link>
		<comments>http://gaskell.org/using-the-digg-api-in-an-aspnet-page/#comments</comments>
		<pubDate>Sat, 21 Apr 2007 05:05:22 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://gaskell.org/using-the-digg-api-in-an-aspnet-page/</guid>
		<description><![CDATA[Digg released their API yesterday &#8211; I haven&#8217;t really done much with RESTful web services because in the .net world, most of the time SOAP/WSDL is used. I thought a very basic RESTful web service project would be useful for other .net developers.
This example gets a list of all topics that digg offers. The code [...]]]></description>
			<content:encoded><![CDATA[<p>Digg <a href="http://blog.digg.com/?p=72" target="_blank">released their API yesterday</a> &#8211; I haven&#8217;t really done much with <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">RESTful</a> web services because in the .net world, most of the time SOAP/<a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank">WSDL</a> is used. I thought a very basic RESTful web service project would be useful for other .net developers.</p>
<p>This example gets a <a href="http://apidoc.digg.com/ListTopics" target="_blank">list of all topics</a> that digg offers. The code is pretty simple:</p>
<pre class="code">
<code>// Create the web request, change the appkey to for your applications
HttpWebRequest request = WebRequest.Create("http://services.digg.com/topics?appkey=http%3A%2F%2Fgaskell.org") as HttpWebRequest;

// won't get a response from digg if UserAgent is not set
request.UserAgent = ".net"; 

// Get response
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
     // Get the response stream
     StreamReader reader = new StreamReader(response.GetResponseStream());

     DataSet ds = new DataSet();
     ds.ReadXml(reader);

     this.topicsGridView.DataSource = ds.Tables[1];
     this.topicsGridView.DataBind();
}    </code>
</pre>
<p><a href='http://gaskell.org/wp-content/uploads/2007/04/digg_api_example.zip' title='Digg API Example in ASP.NET'>Download</a> the project or check out the <a href="http://dotnet.gaskell.org/Digg_API_Example" target="_blank">live demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/using-the-digg-api-in-an-aspnet-page/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Now with 100% more .net</title>
		<link>http://gaskell.org/now-with-100-more-net/</link>
		<comments>http://gaskell.org/now-with-100-more-net/#comments</comments>
		<pubDate>Thu, 19 Apr 2007 03:44:48 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://gaskell.org/now-with-100-more-net/</guid>
		<description><![CDATA[I host my blog on the fantastic WordPress blog platform which typically runs on the LAMP stack. That means I can&#8217;t put up live demos of my .net posts so I created a new .net playground at http://dotnet.gaskell.org. I&#8217;ll have live examples of all of my projects as well as project downloads.
To get things started [...]]]></description>
			<content:encoded><![CDATA[<p>I host my blog on the fantastic WordPress blog platform which typically runs on the <a href="http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29">LAMP</a> stack. That means I can&#8217;t put up live demos of my .net posts so I created a new .net playground at <a href="http://dotnet.gaskell.org">http://dotnet.gaskell.org</a>. I&#8217;ll have live examples of all of my projects as well as project downloads.</p>
<p>To get things started here&#8217;s a <a target="_blank" href="http://dotnet.gaskell.org/Digg_Style_Paging">live demo</a> of the <a href="http://gaskell.org/digg-style-custom-paging-for-gridviews-in-aspnet/">digg style paging in asp.net</a> project I created.</p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/now-with-100-more-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digg style custom paging for GridViews in ASP.NET</title>
		<link>http://gaskell.org/digg-style-custom-paging-for-gridviews-in-aspnet/</link>
		<comments>http://gaskell.org/digg-style-custom-paging-for-gridviews-in-aspnet/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 01:09:45 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://gaskell.org/digg-style-custom-paging-for-gridviews-in-aspnet/</guid>
		<description><![CDATA[I&#8217;ve been on a bit of a digg kick lately and I like how they handle paging so I decided to create a GridView control that uses custom paging similar to digg&#8217;s. The algorithm is based on this post. As far as html output goes, this should be fairly close to the actual output on [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been on a bit of a digg kick lately and I like how they handle paging so I decided to create a GridView control that uses custom paging similar to digg&#8217;s. The algorithm is based on <a href='http://www.strangerstudios.com/blog/2006/07/07/paginate-your-site-like-digg/'>this post</a>. As far as html output goes, this should be fairly close to the actual output on digg and I&#8217;m using digg&#8217;s stylesheet in the demo. </p>
<p>About the algorithm (from <a href='http://www.strangerstudios.com/sandbox/pagination/diggstyle.php'>Stranger Studios</a>):</p>
<blockquote>
<ol>
<li>The pagination object has a &#8220;previous&#8221; and &#8220;next&#8221; button which takes the user to the next page. The previous button is disabled on the first page. Similarly, the next button is disabled on the last page.</li>
<li>The pagination object will always display links to the first two pages and the last two pages of the set.</li>
<li>The pagination object will always display links to the first x (adjacents in the code) pages before and after the current page.</li>
<li>The pagination object will only show at most 5+2x links (first two + prior x + current page + next x + last two). All links not shown will be replaced by &#8230; </li>
</blockquote>
<p>A little preview:<br /><img src='http://gaskell.org/wp-content/uploads/2007/04/digg-style-paging.gif' alt='digg style paging preview' /></p>
<p>You can download the project <a href='http://gaskell.org/wp-content/uploads/2007/04/digg_style_paging.zip'>here</a>. I didn&#8217;t spend a ton of time testing this code, please leave any bug reports in the comments &#8211; Thanks!</p>
<p><strong>Update:</strong>  Changed the code a bit &#8211; paging is now handled via query string instead of posting back. Not a huge deal but the code is easier to read.</p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/digg-style-custom-paging-for-gridviews-in-aspnet/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Digg It button User Control for ASP.NET</title>
		<link>http://gaskell.org/digg-it-button-user-control-for-aspnet/</link>
		<comments>http://gaskell.org/digg-it-button-user-control-for-aspnet/#comments</comments>
		<pubDate>Sun, 08 Apr 2007 04:43:37 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://www.gaskell.org/digg-it-button-user-control-for-aspnet/</guid>
		<description><![CDATA[I came across Tuggo&#8217;s excellent diggIT plugin for WordPress and thought it&#8217;d be cool to make an ASP.NET User Control that provides similar functionality. The control is really easy to use. 

Here&#8217;s the basic tag:


&#60;uc1:DiggItButton  ID="DiggItButton"
                   [...]]]></description>
			<content:encoded><![CDATA[<p>I came across <a href="http://tuggo.org/paul/2007/02/07/diggit-100-released/" target="_blank">Tuggo&#8217;s</a> excellent diggIT plugin for WordPress and thought it&#8217;d be cool to make an ASP.NET User Control that provides similar functionality. The control is really easy to use. </p>
<p></p>
<p>Here&#8217;s the basic tag:</p>
<p></p>
<pre class="code">
<code>&lt;uc1:DiggItButton  ID="DiggItButton"
                   runat="server"
                   Url="http://gaskell.org"
                   Title="Test title"
                   Body="Test body" /&gt;</code>
</pre>
<p></p>
<p>You don&#8217;t need to set the Url, Title and Body properties in the tag, they are also available as public properties in the codebehind. The only property that is required to be set is the Url property &#8211; if you pass in the Title and/or Body, digg will pre-populate those fields. Digg also asks that you url encode your strings and this control handles that for you. Check out the code and sample page <a href="http://www.gaskell.org/wp-content/uploads/2007/04/diggit.zip">here</a>. </p>
<p></p>
<p>You can view an example of the control <a href="http://www.gifninja.com/ViewAnimatedGif.aspx?GifID=8dd7c57b-ac79-4812-9c56-e31f9150a57c" target="_blank" >here at gifninja</a>. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/digg-it-button-user-control-for-aspnet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Setting a default button using Master Pages in ASP.NET</title>
		<link>http://gaskell.org/setting-a-default-button-using-master-pages-in-aspnet/</link>
		<comments>http://gaskell.org/setting-a-default-button-using-master-pages-in-aspnet/#comments</comments>
		<pubDate>Tue, 02 May 2006 16:09:00 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://www.gaskell.org/setting-a-default-button-using-master-pages-in-aspnet/</guid>
		<description><![CDATA[This one&#8217;s pretty easy, but wasn&#8217;t apparent to me at first. Put this code in your Page_Load to set a default button in master pages:

this.Form.DefaultButton = this.YOUR_DEFAULT_BUTTON.UniqueID;

]]></description>
			<content:encoded><![CDATA[<p>This one&#8217;s pretty easy, but wasn&#8217;t apparent to me at first. Put this code in your Page_Load to set a default button in master pages:</p>
<pre class="code">
<code>this.Form.DefaultButton = this.YOUR_DEFAULT_BUTTON.UniqueID;</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/setting-a-default-button-using-master-pages-in-aspnet/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Formatting data in databound controls</title>
		<link>http://gaskell.org/formatting-data-in-databound-controls/</link>
		<comments>http://gaskell.org/formatting-data-in-databound-controls/#comments</comments>
		<pubDate>Tue, 18 Apr 2006 20:00:07 +0000</pubDate>
		<dc:creator>andy gaskell</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://www.gaskell.org/formatting-data-in-databound-controls/</guid>
		<description><![CDATA[I&#8217;ve been trying to format DateTime and currency in asp.net 2.0 databound controls (DetailsView and GridView). After some googling I was able to get it figured out. 
To format DateTime values, you might expect to use a tag like this:

&#60;asp:BoundField
     DataField="BeginDate"
     DataFormatString="{0:d}"
     HeaderText="Begin [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been trying to format <a href="http://msdn2.microsoft.com/en-US/library/system.datetime(VS.80).aspx">DateTime</a> and currency in asp.net 2.0 databound controls (DetailsView and GridView). After some googling I was able to get it figured out. </p>
<p>To format DateTime values, you might expect to use a tag like this:</p>
<pre class="code">
<code>&lt;asp:BoundField
     DataField="BeginDate"
     DataFormatString="{0:d}"
     HeaderText="Begin Date" /&gt;</code>
</pre>
<p>and have a result like this:<br />
10/10/2004</p>
<p>but instead you get a result like this:<br />
10/10/2004 12:00:00 AM</p>
<p>Here&#8217;s the fix &#8211; add HtmlEncode=&#8221;false&#8221; to your BoundField tag:</p>
<pre class="code">
<code>&lt;asp:BoundField
     DataField="BeginDate"
     <strong>HtmlEncode="false"</strong>
     DataFormatString="{0:d}"
     HeaderText="Begin Date" /&gt;</code>
</pre>
<p>The same idea applies to formatting currency, I&#8217;m assuming other types of data formatting as well. <a href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=b00b3ec6-e8fa-4f4d-b1e9-39162abc847b">Here&#8217;s</a> Microsoft&#8217;s explanation.</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/asp.net" rel="tag">asp.net</a>, <a href="http://technorati.com/tag/formatting+datetime" rel="tag"> formatting datetime</a>, <a href="http://technorati.com/tag/formatting+currency" rel="tag"> formatting currency</a>, <a href="http://technorati.com/tag/DetailsView" rel="tag"> DetailsView</a>, <a href="http://technorati.com/tag/GridView" rel="tag"> GridView</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gaskell.org/formatting-data-in-databound-controls/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.437 seconds -->
