<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkQDSH08eip7ImA9WhBSFE8.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154</id><updated>2013-02-20T20:19:39.372-08:00</updated><category term="Google Charts" /><category term="ASP.Net MVC JQuery" /><category term="ASP.Net MVC" /><category term="Razor" /><category term="knockout" /><title>A software developer's diary</title><subtitle type="html">Navigating through a web world.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ASoftwareDevelopersDiary" /><feedburner:info uri="asoftwaredevelopersdiary" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkEMQ3k7cSp7ImA9WhJXGUw.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-5043304290823669748</id><published>2012-07-14T21:40:00.000-07:00</published><updated>2012-08-13T21:31:22.709-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-13T21:31:22.709-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knockout" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>How to build a grid with knockout - Part 3: Sorting and Styling</title><content type="html">In Part 3 of this tutorial we're going to add the ability to sort the data in the grid by a particular column in ascending or descending order. The sorting is going to take place on the server and is going to work in conjunction with the paging that we implemented in &lt;a href="http://softwaredevelopmentexperiences.blogspot.co.nz/2012/03/how-to-build-grid-with-knockout-part-2.html" target="_blank"&gt;Part 2&lt;/a&gt;. I've have also added some styling to the grid so the final result will look as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" height="129" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA20AAAC1CAIAAABDFYBCAAAWZElEQVR4nO3dXXMTV4LGcX0P3/kr+KI/gQtztfdmq/qCsMAXsHNLiothyI6pSrYaQgAbAgVJGCdlQLZjB0+cBZxxAqZNYizk3o2CjCZDvFMgl9+w9qJfdPpF5vioJaSj/6+6pqRWv1HTj/rRacnJVAAAAID9y7zrAwAAAEBbokcCAABABT0SAAAAKuiRAAAAUEGPBAAAgAp6JAAAAFTQIwEAAKCCHgkAAAAVb++Ru7u7Ozs729vbm5ubGxsb6+vr5XK5XC6/BgAAgBbcdre+vr6xsbG5ubm9vb2zs7O7u1tXj3zz5s3W1la5XF5bWyuVSoVCIZ/P53K5ZQAAAGgkl8vl8/lCoVAqldbW1srl8tbW1ps3bxR75O7u7tbWlg0AAIAOUyqVXr16tbW1tceo5F49cmdnp1wu27b9EkCHIfiAfsg15Nm2ncvlSqVSuVze2dlR6ZHb29tra2ucdkAHIviAfsg15Nm2PT8/v7Kysra2tr29rdIjNzc3S6USpx3QgQg+oB9yDXm2bU9NTS0uLpZKpc3NTZUeubGxUSgUOO2ADkTwAf2Qa8izbXt0dHRubq5QKGxsbKj0yPX19Xw+z2kHdCCCD+iHXEOebds3btyYnZ3N5/Pr6+sqPbJcLudyOU47oAMRfEA/5BrybNu+du3azMxMLpcrl8uKPXJ5eZnTDuhABB/QD7mGPNu2r169OjMzs7y8rNgjX79+TY8E2l1RmrgWwQdaWWKEf/vtN3KNOOWzJeiRr1+/pkcCHYoeCegnnt/nz58H/0uuIVI+WxrTI5em+3oHu4Sp7/rKy5cvvz452HV8+nE9/9Cl6b7eK1/7zx5fP9PVe8ZaqmeLANLqkX8/7oc9HeQdqEMkvIVCoVgsPnz4MHi8nx65Yh0fPD7dnAPHO6B8tjSwR8YvJ/I98uuTg10n/57wgttQ/Ze4rgCpiH8MjWhojyTvQCOIoXZvUM7MzHz66aczMzPF8C1Lca3kHhkOI/SjfLY0tUdKW7GO73ld8TfOdQVIRfLYYxJxrZR6JHkHGkL8ZFgsFu/evXv27Nnx8fGzZ8/evXu3KNyyFNdK7JGPr5/p6h3sEu4PQDPKZ0vzeqR3FrrjkUvTfb2Dx09e6eod7Oo9Y/13cB/8jLX08uuT1Rvi0VF0d8snr/T1nrGWxOvKinXcX8u9IC1N9x2f/jo49YNb7cHlSrz5zmcsdLZIWXzy5Ekul3v69OnTp0+fPXv2yy+/1NEjk7JJ3oHGC8aWnj9/Pj09PTIyMjU1VSwWp6amRkZGpqennz9/7o4ziWsl9Uj3w96VcMCFGCakm6C1GeWzJbUeGboKLYwfEL4ceXTcm/3licGuY+PzwQIn7hWLxS/H71Xne5Y+Oua9GrUwfqB38MBnS+4qX3421NU79NGCsMD4sDenuoulj4752x8f9o5nYfxAsKK/zYTdAR3p/Pnzn3zyyenTp0+fPn3+/PkvvviimPRt62jwi/eO7hElP5vkHWgmN7nLy8vPnj0LZj579mx5ebkolevk8H55YrCrd/jLopApgtb+FM6WBvbI+AkU6ZFBv3Tf7oUrxNuvK+4VS1hr6aNj4eYq7CK+3/nPhsSfAXX11tgd0HmeP39eKBSuXr06NDQ0NDR08+bNWkvK9chYNsk70HSFQkH8+a0b88Ql4z2ymqngk1tSjyRo2tjX2ZJaj1wVPZ440Dt44OrT1bCbJwa7jk386C9wdCL2qrfW04+PDXaduL8aJ255YsS9rnz82F135KY/8+hEaBfx/VaXB7C6Gn93cBxneHj4xo0bxfA3rMW1osFfvX80FvyEbFbnk3eggYJOUCwWJyYmLl68eO/evWKxeO/evYsXL05MTASvimsl5jrcDu9H5x+b+HGVoLU35bOlhXqkcDl5+vExf8mI8JZvnhCuK8cmflxd/fHqkMx1xb38eNt5PHEgcV9Ax0j8oOk4zq+//hqZKa4l2yMj2fSQd6Cxgti6o0q3b98+d+7cd999d+7cudu3bxeF25TiWtFcT4yI7fDHq0PCp7ihjx9HliRo7Ur5bEmtR74Q2ZPuu/+LsL9+MNh1bPInf4Gjk978n64Gg+Ejf3VnTY54cz54sOeWHxztHfrY9uZ39Q4euDp51F1L2EXyfoNduFsAOli8RMa/B+MS14oG/8WDyLjF0cmEbJJ3oDniib5z587w8PCdO3ciGRfXCufa/Zg3+VP1ZT9W1Ux59xZevCBobUz5bEmtR5YAtK3EyphIXIvgA60sEl73Cyqzs7PF2H/vTlxLNteLk30fPHAfjn4w2HVs8mHq/wA0kfLZklqP/AeAtiXfI8W1CD7QyuL5dQtB/D+aLK4lmetH31wW/sN1Z/7rSWP+DWgW5bMltR75O4C2Jd8jxbUIPtDKEiMcrwXkGr/Xcbak1iP/CaDDEHxAP+Qa8tLskX8A6DAEH9APuYY8eiQAdQQf0A+5hrw0e+T/AegwBB/QD7mGPHokAHUEH9APuYa8NHvkvwB0GIIP6IdcQx49EoA6gg/oh1xDXmo98sUfr20AHYbgA/oh15D34o/XqfXIPZYBoCWCD+iHXEMePRKAOoIP6IdcQx49EoA6gg/oh1xDHj0SgDqCD+iHXEMePRKAOoIP6IdcQx49EoA6gg/oh1xDHj0SgDqCD+iHXEMePRKAOoIP6IdcQ14je6RjGRmXYTlpHGylUqlUsmbGzKa2NQD1iAU/a0ql3rGMaJAdy0jznQKAqmiu/au5l9Dg4s7FGA3skY5lpFofA/RIoHVEgr//LlgNND0SaBE1xiOzZsawnIpjmZZTfYoO16gemXRJCAYqzGyl4liGaZrCJxzHMgwr67fP4OOOv5Xq4CYfgYCWEQ9+KJ9Z07Tc6BqWVc171hQfeHMdyzCM0KgHgHeido8Mx5urMRrXI+PnV/DJxb3SBNcbv3E6lhG/fPgvCh97OHOB1hG/3ngf+dyU+slNyrvhD2lUxyPDywB4N2p8US107SWncDVvPLJ6uciabo8UxiGd2BrBOEXGzIZeo0cCraPW9/G9zAZx9R/s3SPD7wkA3o3a45F8DQVRzft+ZHw8co8e6V9bvLNW3Bg9Emgd9EhAP7VyHc0x0Njfa1eHFDP+zenQ9yP3Go/0ljUtfyhd2Bg9EmgVCd+PFL/Z/PYe6UfbsGbpkUBriF7Qw3+GQfy5AlEFfz8SgDqCD+iHXEMePRKAOoIP6IdcQx49EoA6gg/oh1xDHj0SgDqCD+iHXEMePRKAOoIP6IdcQx49EoA6gg/oh1xDHj0SgDqCD+iHXEMePRKAOoIP6IdcQ16aPZKJiYmJiYmJiamjJsYjASgi+IB+yDXk0SMBqCP4gH7INeTRIwGoI/iAfsg15NEjAagj+IB+yDXk0SMBqCP4gH7INeTRIwGoI/iAfsg15NEjAagj+IB+yDXk0SMBqCP4gH7INeQ1rEc6lpHxGJazr2PKmhkzu681ALwb4eALsffDP2sZ+30HAPBu1bqgh7PsWAbXajS0R3pnXNbcZ5OkRwLtInHcwhG6o0OPBNpNjfHI0NXcsYwM12o0q0e6p5pjGYaVtQz3RAxGLvzTUhzK4NwE2oJUjzTEsYysGUp56G3BsQzTNIWFg3cF3hKA5qndI/0kZs2MaTLmg0pT7msH55ljGfGb3P4VR/icw3gk0C5keqSbZ3dmEHR/fuhtIbJwwqdRAI2XkOsgnJUg4cQSlUqzxiODEUixRQbDEhkzG3qNcxNoF/L3tYMe6aXbexR6W4gvLH7V0qkAaIba45EZMxv+GjTB7HhN6JHiwEP1jPMvJ+55WXH8290VeiTQPhR6ZGw8cq8eyVsB0Hy1fq8djiQBRaXSnN9r+wUxPB7pDTWYlj9YLo49cG4CbWG/PTL5+5FOdEX/Qexr1AAaL5rrILWhINIjUanw9yMB1IPgA/oh15BHjwSgjuAD+iHXkEePBKCO4AP6IdeQR48EoI7gA/oh15BHjwSgjuAD+iHXkEePBKCO4AP6IdeQR48EoI7gA/oh15BHjwSgjuAD+iHXkJdmj2RiYmJiYmJiYuqoifFIAIoIPqAfcg159EgA6gg+oB9yDXn0SADqCD6gH3INefRIAOoIPqAfcg159EgA6gg+oB9yDXn0SADqCD6gH3INefRIAOoIPqAfcg159EgA6gg+oB9yDXkN7pFZM2Nm33oQcksBaDnR4GfNjM+wHDfafsAdyyDpQBuI5tqxDDfV1QATZ3ga2yOzZui8q4UeCbSphB4phDncIwG0h0iuHcu0nEqlkjUzhuVU3EekGq5G9kjHMjKm6Z93jmWYpumPU/iv+8xsJWt68yuOZXCCAu1AvkdmTT/7/pilH3gAraXGfW0/3rRICBrYIx3LMCwn+AATDIJH5leCc1O4+8UZCrSFmve1/cYYvq/tRZ+AA60ssUd6AQ6NARFlNLBHZoWBSMNyQqegYTnB00q0QFIjgbaxn/va1dBXxyYBtJ7kG4zC0E/o6o7O1rAeKXzd3v3QEu+R0fFI9yWD7+4CbUOtR1ZizwC0jliPDMU1cjVv6pGh9TSoR0bOrqyZMYdjZ55YNf1Lj3C3G0DL2/v32pWsmckY1rCZyVRvQoRvfQNoObHf2RihXCf9fhsdq9X+fmT1xzYAWh9/Zw7QD7mGvFbqke7QhVPvZgA0DdcbQD/kGvJaqUcCaDcEH9APuYY8eiQAdQQf0A+5hjx6JAB1BB/QD7mGPHokAHUEH9APuYY8eiQAdQQf0A+5hjx6JAB1BB/QD7mGvDR7JBMTExMTExMTU0dNjEcCUETwAf2Qa8ijRwJQR/AB/ZBryKNHAlBH8AH9kGvIo0cCUEfwAf2Qa8ijRwJQR/AB/ZBryKNHAlBH8AH9kGvIo0cCUEfwAf2Qa8ijRwJQR/AB/ZBryGtwj8yaGTMbfuhYRjAPQHuLBN+xDMNyvIdm8Mid6WXffSvgDQFoWdELumMZmUwmk/HS7T8luqg0ukdmzeqJJlRKAJpIuN64OXcsw7voCN2yUqlUIj0SQMupMR6ZNTOG5QSfEb2n6HCN7JGOZWRM0z/RgotHhjMP0EUs+F6RdCzDMAz3muPWyCD7Yo+sviEEIxz++4VpuXMMyzKrL2RNcSkAjVC7R4qf/vgwiEqloT3Su3z4n1iE21hcAgBNxIOfNTNm1rEMM+tYhmFlxTvdRrRHxt4QhNYp3gv3X+DCBTRBrYGhbHgG13JUGtkjgxHv0MWDcw/QScL1JmtmDMMflDRNM8j73j3SH2l0vwoTFMbk5XgPARqo9nik3yW5ksPXsB5ZvSh4VwZ6JKCfpOtN9WJT/ZKk96xmj/Sf+uvW7pGV6BMAKav1e22u44hrUI+MnGRZ0y2SGcNyOP8AfdT4gV1w/ytrVdMuflPSsIbDbwjeJ0/TEn/UXYleuILPp7yJAI1Tc2Ao/GVmkogKfz8SQD0IPqAfcg159EgA6gg+oB9yDXn0SADqCD6gH3INefRIAOoIPqAfcg159EgA6gg+oB9yDXn0SADqCD6gH3INefRIAOoIPqAfcg159EgA6gg+oB9yDXlp9kgmJiYmJiYmJqaOmtLpkZ8DAACgw6TWI/8XAAAAHSPNHvk/AAAA6Bj0SAAAgCq7id7JTusXHHaaPdIBAABoc7Ztv2wK27abv9P6iYedZo/MAwAAtLlm9sjm77R+4mGn2SOfAQAAtLlm9sjm77R+4mGn2SNzAAAAba6ZPbL5O62feNhp9sinAAAAba6ZPbL5O62feNhp9sgl0d/+crC7u7u7++Bf/ra0t8/+I7qc/LoAAACpSqh0T0YO9YgOjcyMHOo5NPKk3kImvdM69vUkhUMViYedZo/8JcFnR7oP/udM0ivVJWot8PZ1AQAA0lWj0oWrmHw5q72kbduyO62nCzagRwaHnWaP/DnBlSPdR65E57iOXPn557sfHqw+eeu6wdLd3d0HP7wrzok89WaEN+/v2V0WAAAgTqpHytuzR0rvNO0yWAfxsNPskU8ivv3wYPeRy+F5l490H/zwW+HFbz886M54+7rissF2xBcuH/HWcZ9XF798pPvI5eBVAACAWiR65Pj7wb1m96XxkUM9PT3vjws3o93lhZvTsRpo27b0Tp+MHOp5fzy2u/Ae3h93D819wT3Of/t3cd/Rw6sx6hlfrMZhp9kjHycYfq+7+73h0HPvqfdo6s99fX+eSlo1tm5oWW/14ff8AUhvY8Kz6mvd3d19f57y5tTaHQAAwGPbtosRDy/0V7+q2H/hoTun+qB/4MLDYMGBsdi6/d7LYbZtv22n/cJ2E3ZXLI4NVDfuPq6u5h1MdcbYQI9/dMHDpL0k/CtqHHaaPXIhyaXD3YcvhZ72nfpmYWHhm1N93YcvLSx8c6rPnfH2dcVl3e34C1w63N19+NLCwqXD4raiq8c2AgAAEPGWSheZ8/BCf49QutzGKZawPXvk23YaLq/F2O7GBnrCBsaCbvnwQn+88gar+gW0ZlvtqVUlxcNOs0c+El067A8EnppMfuHwpUePHj2aPNUXXaLmupOn+qrji6cmq0sePnWqr/vwpeqK3uvBCn2nJmsfEQAAgM+27dWIRxf6e/ovPEqaE39pdXX11kBPT8/ArRrr+mzb3t9O4zNvDSRt+9GF/v4Lty70u0cQOlTvoKprihuMb7ynukLiYTesRzZCUudMdumwV1MBAAD2I4Ue6XawSI2LSaFHCvtZXb01ID5MKLLCwtWHkZmhPYpbTzzsNHvkT402/qcDB/40vufr/nDknssBAADUYNv2i4iFi/09/RcXkuaEX1q4GNyLHrj9IjIzvIUXL2zb3t9Oax5JT2z7tweCZ+IqSQsL8/rdJRP/FYmH3VY9EgAAoMFs2y41RaRHNmen9WtUj5wHAABoc7Zt/6MpbNtu/k7rJx42PRIAAKDKtu3fmyLSI5uz0/rRIwEAAJLZtv3Ppoj0yObstH4p98hyuUyPBAAAerBt+4+miPTI5uy0frV6ZLlcVuyRuVyOHgkAADRAj9xbpEdeu3ZtZmYml8sp9sj19fV8Pk+PBAAAGrCb6J3stH7BYX/++ec3btyYnZ3N5/Pr6+sqPXJjY6NQKHz11Vc//PDDu/i/GwAAAM12//79W7dujY6Ozs3NFQqFjY0NlR65ublZKpXm5+fHxsYePHjwrv9RAAAAaKwHDx6MjY2NjY1NTU0tLi6WSqXNzU2VHrm9vb22traysvL999/fvn37cwAAAGjt1q1bY2Nj2Wx2fn5+ZWVlbW1te3tbpUfu7OyUy+VSqZTL5ebn56empkZHR69fv37t2rWrAAAA0Mi1a9euX78+Ojo6NTU1Pz+fy+VKpVK5XN7Z2VHpkbu7u1tbW69evSqVSisrK4uLi3Nzc7OzszMAAADQzuzs7Nzc3OLi4srKSqlUevXq1dbW1u7urkqPrFQqb9682draKpfLa2trpVKpUCjk8/lcLrcMAAAAjeRyuXw+XygUSqXS2tpauVze2tp68+bNHkXxLT3SHZXc2dnZ3t7e3Nzc2NhYX18vl8vlcvk1AAAAtOC2u/X19Y2Njc3Nze3t7Z2dnT1GImV7JAAAABBHjwQAAIAKeiQAAABU0CMBAACggh4JAAAAFfRIAAAAqKBHAgAAQAU9EgAAACrokQAAAFBBjwQAAIAKeiQAAABU0CMBAACg4v8B4TQLZTMfKFQAAAAASUVORK5CYII=" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 1 - The Javascript&lt;/b&gt;&lt;br /&gt;
Within our javascript view model
 I've added a method SetOrder() that can will be called when the user clicks on a column header, this looks as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 16;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;SetOrder(data,&amp;nbsp;event,&amp;nbsp;colName)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(_this.colName&amp;nbsp;===&amp;nbsp;colName)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.switchSortOrder();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.colName&amp;nbsp;=&amp;nbsp;colName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.sortOrder&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;"asc"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTHClass(event);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loadDataFromServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.SetOrder&amp;nbsp;=&amp;nbsp;SetOrder;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&lt;/pre&gt;
&lt;br /&gt;
The first thing the code does is check if we're already sorting by the column that has been clicked, if so we reverse the sort order. If this is the first time is has been clicked we set the sort order to ascending. This is a good example of how we can use the member properties of the view model,&lt;i&gt; _this.colName &lt;/i&gt;and&lt;i&gt; _this.sortOrder, &lt;/i&gt;to&lt;i&gt; &lt;/i&gt;remember the state of the grid in between actions.&lt;br /&gt;
&lt;br /&gt;
Once we've ascertained the column we're sorting by and the direction we can call the &lt;i&gt;setTHClass()&lt;/i&gt; function to show the correct icon for the sorting column. The code for this looks as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 16;"&gt;&lt;span style="color: blue;"&gt;   function&lt;/span&gt;&amp;nbsp;setTHClass(event)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//remove&amp;nbsp;the&amp;nbsp;existing&amp;nbsp;classes&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(event.currentTarget).parent().find(&lt;span style="color: maroon;"&gt;".sort_wrapper"&lt;/span&gt;).children(&lt;span style="color: maroon;"&gt;"span"&lt;/span&gt;).removeClass(&lt;span style="color: maroon;"&gt;"asc"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(event.currentTarget).parent().find(&lt;span style="color: maroon;"&gt;".sort_wrapper"&lt;/span&gt;).children(&lt;span style="color: maroon;"&gt;"span"&lt;/span&gt;).removeClass(&lt;span style="color: maroon;"&gt;"desc"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(_this.sortOrder&amp;nbsp;===&amp;nbsp;&lt;span style="color: maroon;"&gt;"asc"&lt;/span&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(event.currentTarget).children(&lt;span style="color: maroon;"&gt;".sort_wrapper"&lt;/span&gt;).children(&lt;span style="color: maroon;"&gt;"span"&lt;/span&gt;).addClass(&lt;span style="color: maroon;"&gt;"asc"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(event.currentTarget).children(&lt;span style="color: maroon;"&gt;".sort_wrapper"&lt;/span&gt;).children(&lt;span style="color: maroon;"&gt;"span"&lt;/span&gt;).addClass(&lt;span style="color: maroon;"&gt;"desc"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt; &lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt; &lt;/pre&gt;
We make use of css classes &lt;i&gt;asc&lt;/i&gt; and &lt;i&gt;desc&lt;/i&gt; to show the correct icon on the sorting column. The code first removes all traces of these classes from the columns and then adds the correct one where required. Extensive use of JQuery DOM traversal functions are used to make this task easier.&lt;br /&gt;
&lt;br /&gt;
The other major change is in the &lt;i&gt;loadDataFromServer()&lt;/i&gt; function where we now have to pass information to the server specifying how the data is to be sorted, this is done by adding the querystring parameters sidx and sord to the url that we post to the server:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; loadDataFromServer()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;'/people/data'&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//add&amp;nbsp;paging&amp;nbsp;params&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;+=&amp;nbsp;&lt;span style="color: maroon;"&gt;'?rows='&lt;/span&gt;&amp;nbsp;+&amp;nbsp;_this.rowsPerPage()&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;'&amp;amp;page='&lt;/span&gt;&amp;nbsp;+&amp;nbsp;_this.page() +&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;            &lt;span style="color: darkgreen;"&gt;//add sorting params&lt;/span&gt;     &lt;/pre&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&lt;span style="color: maroon;"&gt;&amp;amp;sidx='&lt;/span&gt; +&amp;nbsp;_this.colName&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: maroon;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&amp;amp;sord='&lt;/span&gt; +&amp;nbsp;_this.sortOrder;&lt;br /&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.post(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.records(data.TotalRowsCount);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.totalPages(data.TotalPageCount);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;ko.observableArray();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.people.removeAll();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ko.mapping.fromJS(data.GridData,&amp;nbsp;{},&amp;nbsp;results);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;results().length;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.people.push(results()[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;'json'&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Step 2 - The Controller&lt;/b&gt;&lt;br /&gt;
Now we need to modify the controller to make use of the additional querystring parameters that are being passed through. The first task is to sort our data by the requested column, this can be done by using a set of dynamic linq helpers that Scott Gu &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx" target="_blank"&gt;blogged&lt;/a&gt; about, it's all contained in one file that you will need to &lt;a href="http://msdn.microsoft.com/en-us/vstudio//bb894665.aspx" target="_blank"&gt;download&lt;/a&gt; and add to your project. You will also need to add a using clause of System.Linq.Dynamic to your controller class.
&lt;br /&gt;
&lt;br /&gt;
Once you have done that we can change our controller code to look as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 16;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JsonResult&lt;/span&gt;&amp;nbsp;Data(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;rows,&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;page,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;sidx,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sord)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;nbsp;qryPeople&amp;nbsp;=&amp;nbsp;GetPersonQuery();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;GridDataResult&lt;/span&gt;&amp;nbsp;gridDataResult&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GridDataResult&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gridDataResult.TotalRowCount&amp;nbsp;=&amp;nbsp;qryPeople.Count();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;totalPages&amp;nbsp;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(rows&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalPages&amp;nbsp;=&amp;nbsp;gridDataResult.TotalRowCount&amp;nbsp;/&amp;nbsp;rows;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(gridDataResult.TotalRowCount&amp;nbsp;%&amp;nbsp;rows&amp;nbsp;!=&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalPages&amp;nbsp;+=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gridDataResult.TotalPageCount&amp;nbsp;=&amp;nbsp;totalPages;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//now&amp;nbsp;do&amp;nbsp;the&amp;nbsp;sorting&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qryPeople&amp;nbsp;=&amp;nbsp;qryPeople.OrderBy(sidx&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+ sord);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gridDataResult.GridData&amp;nbsp;=&amp;nbsp;qryPeople
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Skip((page&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;rows)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Take(rows);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;Json(gridDataResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;br /&gt;
Because we are now using the Dynamic Linq helpers we can order qryPeople using strings, perfect for doing sorting!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 3 - The Html&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;The final step is modifying the html to make sure that when a column header is clicked the view model is notified to that we can reorder the grid. We do this by binding to the table header using knockout as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 16;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'click:&amp;nbsp;function(data,&amp;nbsp;event)&amp;nbsp;{&amp;nbsp;SetOrder(data,&amp;nbsp;event,&amp;nbsp;"FirstName")}'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"sort_wrapper"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;First&amp;nbsp;Name&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"grid_order&amp;nbsp;ui_icon"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'click:&amp;nbsp;function(data,&amp;nbsp;event)&amp;nbsp;{&amp;nbsp;SetOrder(data,&amp;nbsp;event,&amp;nbsp;"LastName")}'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"sort_wrapper"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Last&amp;nbsp;Name&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"grid_order&amp;nbsp;ui_icon"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'click:&amp;nbsp;function(data,&amp;nbsp;event)&amp;nbsp;{&amp;nbsp;SetOrder(data,&amp;nbsp;event,&amp;nbsp;"Age")}'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"sort_wrapper"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Age&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"grid_order&amp;nbsp;ui_icon"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&amp;nbsp;&lt;/pre&gt;
We now have a grid that supports paging, sorting and has been nicely styled. If you would like to download the code you can do so &lt;a href="https://bitbucket.org/dwcarter/knockoutgrid" target="_blank"&gt;here&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/g1_C99sffGY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/5043304290823669748/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2012/07/in-part-3-of-this-tutorial-were-going.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/5043304290823669748?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/5043304290823669748?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/g1_C99sffGY/in-part-3-of-this-tutorial-were-going.html" title="How to build a grid with knockout - Part 3: Sorting and Styling" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>8</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2012/07/in-part-3-of-this-tutorial-were-going.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAGQXc-fip7ImA9WhVQF00.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-7452026290538397541</id><published>2012-04-06T01:14:00.000-07:00</published><updated>2012-04-06T01:25:20.956-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-06T01:25:20.956-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knockout" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>ASP.net MVC - Handling json dates with a custom converter.</title><content type="html">Handling dates in json can be a real pain as it has no concept of a date datatype - however by using the jQuery &lt;i&gt;ajax()&lt;/i&gt; method and specifying a custom converter you can easily turn dates sent from the server into Date objects on the client.&lt;br /&gt;
&lt;br /&gt;
A date when it comes down from the server in json format looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre role="list"&gt;&lt;code class="wrappedText focusRow" role="listitem"&gt;"BirthDate":"\/Date(1507546800000)\/"&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;What is nice about this rather unfriendly format is that is has the /Date prefix (the backslashes are escape chars in json), this means we can look at a string and determine whether we should treat is as a date or not.&lt;br /&gt;
&lt;br /&gt;
I typically use the jQuery &lt;i&gt;ajax()&lt;/i&gt; method ($.ajax) to get a json payload from the server. By default if you specify a &lt;i&gt;dataType &lt;/i&gt;of 'json' the &lt;i&gt;ajax()&lt;/i&gt; method will use an inbuilt converter to turn the returned json string into a javascript object. Fortunately this method also takes a &lt;i&gt;converters &lt;/i&gt;object which we can use to parse and transform the json before it is passed to the &lt;i&gt;success() &lt;/i&gt;method.&lt;br /&gt;
&lt;br /&gt;
In order for our converter to be called we need to specify a particular datatype - &lt;b&gt;this cannot be one of the default in-built ones or it will be ignored&lt;/b&gt;&amp;nbsp; &lt;b&gt;(such as json)&lt;/b&gt; - in this instance I've called mine &lt;i&gt;jsonWithDate&lt;/i&gt;s. When you specify your converter the first option is a string which says what you're converter is going to take in and return. You need to provide two values in the string separated by a a space (this feels a bit clumsy!). In this case I've specified &lt;i&gt;"text jsonWithDates"&lt;/i&gt; because I specified that the dataType I want to deal with is &lt;i&gt;"jsonWithDates"&lt;/i&gt; and I want &lt;i&gt;"text"&lt;/i&gt; passed into my converter. When the response is received from the server jQuery will look at the converters and see that I have a converter that knows how to do the necessary conversion. Be warned that if you specify &lt;i&gt;"json jsonWithDates" &lt;/i&gt;your converter will be passed a javascript object to convert and not a json string as jQuery will do a conversion for you implicitly, that's why I've used &lt;i&gt;"text jsonWithDates".&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Ok - so now we know how to hook into the pipeline and set up a converter, that's the hard part done! The second option in the converter object is a function that takes in the payload from the response and provides a converted response. It's up to you now to handle the transformation as you see fit. For my purposes I've used the &lt;i&gt;JSON.parse()&lt;/i&gt; method which handily takes in a function that we can use to map individual values when parsing json. In my function I do a check to see if it is a date using a regular expression, if it passes I convert it to a javascript date object and return it.&lt;br /&gt;
&lt;pre role="list"&gt;&lt;code class="wrappedText focusRow" role="listitem"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;pre role="list"&gt;&lt;code class="wrappedText focusRow" role="listitem"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
Now in my &lt;i&gt;success&lt;/i&gt; method I will receive a javascript object that has properties that are of type Date. The full code looks like the following:&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 16;"&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;LoadDataFromServer()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.ajax({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;GetGridURL(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&lt;span style="color: maroon;"&gt;'GET'&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataType:&amp;nbsp;&lt;span style="color: maroon;"&gt;'jsonWithDates'&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentType:&amp;nbsp;&lt;span style="color: maroon;"&gt;'application/json:charset=utf-8'&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//add&amp;nbsp;a&amp;nbsp;custom&amp;nbsp;converter&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;dates&amp;nbsp;and&amp;nbsp;the&amp;nbsp;way&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;&lt;span style="color: darkgreen;"&gt;            //they&amp;nbsp;are&amp;nbsp;sent&amp;nbsp;back&amp;nbsp;from&amp;nbsp;the&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//server&amp;nbsp;in&amp;nbsp;.net&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;converters:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;"text&amp;nbsp;jsonWithDates"&lt;/span&gt;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(jsonText)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;JSON.parse(jsonText,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(key,&amp;nbsp;value)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Check&amp;nbsp;for&amp;nbsp;the&amp;nbsp;/Date(x)/&amp;nbsp;pattern&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;match&amp;nbsp;=&amp;nbsp;/\/Date\((\d+)\)\//.exec(value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(match)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;dateIn&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Date(parseInt(value.substr(6)));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; dateIn;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Not&amp;nbsp;a&amp;nbsp;date,&amp;nbsp;so&amp;nbsp;return&amp;nbsp;the&amp;nbsp;original&amp;nbsp;value&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{&amp;nbsp;alert(data);&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 16px;"&gt;} &lt;/pre&gt;
Json date conversion - done!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/H47nA59VfQo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/7452026290538397541/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2012/04/handling-dates-in-json-can-be-real-pain.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/7452026290538397541?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/7452026290538397541?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/H47nA59VfQo/handling-dates-in-json-can-be-real-pain.html" title="ASP.net MVC - Handling json dates with a custom converter." /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2012/04/handling-dates-in-json-can-be-real-pain.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAEQnY8eSp7ImA9WhJRGEk.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-1178301901786135562</id><published>2012-03-24T23:50:00.001-07:00</published><updated>2012-07-20T21:58:23.871-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-20T21:58:23.871-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knockout" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>How to build a grid with knockout - Part 2:  Paging</title><content type="html">In &lt;a href="http://softwaredevelopmentexperiences.blogspot.co.nz/2012/03/how-to-build-grid-with-knockout-and.html" target="_blank"&gt;Part 1&lt;/a&gt; of this tutorial we built a simple HTML table using knockout, in this post we're going to add paging functionality to it.&lt;br /&gt;
&lt;br /&gt;
The code for the entire index.cshtml view now looks as follows:&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.Title&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;;
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;}&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Index&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;table&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"people"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;First&amp;nbsp;Name&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Last&amp;nbsp;Name&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Age&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tbody&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"foreach:&amp;nbsp;people"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text:&amp;nbsp;FirstName"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text:&amp;nbsp;LastName"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text:&amp;nbsp;Age"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tbody&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'grid_footer&amp;nbsp;ui-helper-clearfix'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'grid_info'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'text:&amp;nbsp;pagesText'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'paging'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'visible:&amp;nbsp;page()&amp;nbsp;&amp;gt;&amp;nbsp;1,&amp;nbsp;click:&amp;nbsp;PageFirst'&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'ui-button'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;First&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'visible:&amp;nbsp;page()&amp;nbsp;&amp;gt;&amp;nbsp;1,&amp;nbsp;click:&amp;nbsp;PageBack'&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'ui-button'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Previous&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'visible:&amp;nbsp;page()&amp;nbsp;&amp;lt;&amp;nbsp;totalPages(),&amp;nbsp;click:&amp;nbsp;PageNext'&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'ui-button'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Next&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'visible:&amp;nbsp;page()&amp;nbsp;&amp;lt;&amp;nbsp;totalPages(),&amp;nbsp;click:&amp;nbsp;PageLast'&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;'ui-button'&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Last&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;peopleViewModel()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;_this&amp;nbsp;=&amp;nbsp;{};
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//pager&amp;nbsp;data&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.page&amp;nbsp;=&amp;nbsp;ko.observable(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.records&amp;nbsp;=&amp;nbsp;ko.observable(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.totalPages&amp;nbsp;=&amp;nbsp;ko.observable(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.rowsPerPage&amp;nbsp;=&amp;nbsp;ko.observable(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.pagesText&amp;nbsp;=&amp;nbsp;ko.computed(&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;()&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;_this.page()&amp;nbsp;+&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;span style="color: maroon;"&gt;        "&amp;nbsp;of&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;_this.totalPages()&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"&amp;nbsp;pages"&lt;/span&gt;;&amp;nbsp;});

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _this.people&amp;nbsp;=&amp;nbsp;ko.observableArray();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;/************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Public&amp;nbsp;Functions
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;************************/&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;PageFirst(item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.page(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadDataFromServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.PageFirst&amp;nbsp;=&amp;nbsp;PageFirst;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;PageLast(item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.page(_this.totalPages());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadDataFromServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.PageLast&amp;nbsp;=&amp;nbsp;PageLast;
 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;PageBack(item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.page(_this.page()&amp;nbsp;-&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadDataFromServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.PageBack&amp;nbsp;=&amp;nbsp;PageBack;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;PageNext(item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.page(_this.page()&amp;nbsp;+&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadDataFromServer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.PageNext&amp;nbsp;=&amp;nbsp;PageNext;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;LoadDataFromServer()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;'/people/data'&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//add&amp;nbsp;paging&amp;nbsp;params&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;+=&amp;nbsp;&lt;span style="color: maroon;"&gt;'?rows='&lt;/span&gt;&amp;nbsp;+&amp;nbsp;_this.rowsPerPage()&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;'&amp;amp;page='&lt;/span&gt;&amp;nbsp;+&amp;nbsp;_this.page();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.post(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.records(data.TotalRowsCount);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.totalPages(data.TotalPageCount);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;ko.observableArray();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.people.removeAll();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ko.mapping.fromJS(data.GridData,&amp;nbsp;{},&amp;nbsp;results);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;results().length;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.people.push(results()[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;'json'&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;/************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Initialization
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;************************/&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ko.applyBindings(_this,&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"body"&lt;/span&gt;).get(0));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadDataFromServer();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;_this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;viewModel&amp;nbsp;=&amp;nbsp;peopleViewModel();
 
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 1 - The HTML&lt;/b&gt;&lt;br /&gt;
If you look at the listing above you'll see I've added a&lt;i&gt; &amp;lt;div&amp;gt;&lt;/i&gt; below the &lt;i&gt;&amp;lt;table&amp;gt;&lt;/i&gt;, this is where the elements of the pager are going. Within the &lt;i&gt;&amp;lt;div&amp;gt;&lt;/i&gt; I've added four &lt;i&gt;&amp;lt;a&amp;gt;&lt;/i&gt;s for each of the paging buttons that will be required and a &lt;i&gt;&amp;lt;span&amp;gt;&lt;/i&gt; to show some text. I've also introduced some new knockout binding methods: &lt;i&gt;visible &lt;/i&gt;which determines if a span will be shown or not, and &lt;i&gt;click &lt;/i&gt;which will call a function on our javascript model when the&lt;i&gt; &amp;lt;a&amp;gt;&lt;/i&gt; is clicked.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 2 - The Javascript&lt;/b&gt;&lt;br /&gt;
Within our javascript view model I've added observables to track the information that we need to make the pager work. I've also added a &lt;i&gt;pagesText&lt;/i&gt; variable which is a&lt;i&gt; ko.computed()&lt;/i&gt; function. This means that when any of the observables that the function references are changed knockout will do a rebind, this is paricularly usefull in this instance.&lt;br /&gt;
&lt;br /&gt;
The other major change is in the &lt;i&gt;LoadDataFromServer()&lt;/i&gt; function where we now get an object back from the server that not only contains the rows for the grid but paging information including the total number of rows and the total number of pages.&lt;br /&gt;
&lt;br /&gt;
I've set the number of rows per page in this instance to 1 so that the paging functionality is obvious with only 3 rows!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 3 - The Controller&amp;nbsp; &lt;/b&gt;&lt;br /&gt;
The code for the controller method now looks as follows:&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;knockoutGrid.Controllers
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PeopleController&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Controller&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;Index()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;View();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JsonResult&lt;/span&gt;&amp;nbsp;Data(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;rows,&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;nbsp;people&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Richie"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"McCaw"&lt;/span&gt;,&amp;nbsp;33));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Dan"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Carter"&lt;/span&gt;,&amp;nbsp;32));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Owen"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Franks"&lt;/span&gt;,&amp;nbsp;23));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GridDataResult&lt;/span&gt;&amp;nbsp;gridDataResult&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GridDataResult&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gridDataResult.TotalRowCount&amp;nbsp;=&amp;nbsp;people.Count;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;totalPages&amp;nbsp;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(rows&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalPages&amp;nbsp;=&amp;nbsp;gridDataResult.TotalRowCount&amp;nbsp;/&amp;nbsp;rows;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(gridDataResult.TotalRowCount&amp;nbsp;%&amp;nbsp;rows&amp;nbsp;!=&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalPages&amp;nbsp;+=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gridDataResult.TotalPageCount&amp;nbsp;=&amp;nbsp;totalPages;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gridDataResult.GridData&amp;nbsp;=&amp;nbsp;people.Skip((page&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;rows).Take(rows);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;Json(gridDataResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GridDataResult&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;TotalRowCount&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;TotalPageCount&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;GridData&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;FirstName&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;LastName&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;Age&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;Person(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;firstName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lastName,&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;age)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstName&amp;nbsp;=&amp;nbsp;firstName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastName&amp;nbsp;=&amp;nbsp;lastName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Age&amp;nbsp;=&amp;nbsp;age;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
}&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I've added a class called &lt;i&gt;GridDataResult &lt;/i&gt;- this will enable us to send some more information about the paging back to the browser, because I want to use this class for all my controller methods that return data to a grid I have made the GridData property of type object (you could use generics if you wanted to). The MVC JSON serializer has no problems with serializing this into JSON properly. &lt;br /&gt;
&lt;br /&gt;
The &lt;i&gt;GridData()&lt;/i&gt; controller method is still straight forward with some added logic to work out the total rows and pages for the grid. The LINQ methods &lt;i&gt;skip()&lt;/i&gt; and &lt;i&gt;next()&lt;/i&gt; are used to get the correct subset of the data to be sent back . If you are using a database framework that supports LINQ (such as the Entity Framework) to retrieve your records from a database this is particularly usefull.&lt;br /&gt;
&lt;br /&gt;
And that's it! A grid with paging - done!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/sQ38LIwYu-4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/1178301901786135562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2012/03/how-to-build-grid-with-knockout-part-2.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/1178301901786135562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/1178301901786135562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/sQ38LIwYu-4/how-to-build-grid-with-knockout-part-2.html" title="How to build a grid with knockout - Part 2:  Paging" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2012/03/how-to-build-grid-with-knockout-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIDRng-fSp7ImA9WhJRGEk.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-7231372806899552117</id><published>2012-03-24T21:49:00.000-07:00</published><updated>2012-07-20T21:56:17.655-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-20T21:56:17.655-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knockout" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>How to build a grid with knockout and ASP.Net MVC</title><content type="html">&lt;br /&gt;
Fairly recently the team at &lt;a href="http://www.canterburybusinesssolutions.co.nz/" target="_blank"&gt;CBS&lt;/a&gt; decided to adopt knockout to help us build our UIs. One of our major undertakings was to replace the JQGrid with a knockout equivalent, we haven't regretted it for a minute. The ability to quickly adapt the functionality to meet the different demands of our various clients plus the ability to style easily and effectively (a big gripe with the JQGrid)&amp;nbsp; has paid off handsomely.&lt;br /&gt;
&lt;br /&gt;
This tutorial is broken into 3 parts:&lt;br /&gt;
Part 1 - building the basic HTML table using knockout and loading data from the server&lt;br /&gt;
&lt;a href="http://softwaredevelopmentexperiences.blogspot.co.nz/2012/03/how-to-build-grid-with-knockout-part-2.html" target="_blank"&gt;Part 2 &lt;/a&gt;- implementing paging&lt;br /&gt;
&lt;a href="http://softwaredevelopmentexperiences.blogspot.co.nz/2012/07/in-part-3-of-this-tutorial-were-going.html" target="_blank"&gt;Part 3&lt;/a&gt; - implementing sorting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this tutorial I'm going to take you through building a basic html table using knockout and retrieving data from a controller method on the server.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 1 - Install the knockout and knockoutMapping js files&lt;/b&gt;&lt;br /&gt;
You can either download these from the knockout website or use NuGet - if you're using NuGet then you need to install the knockoutjs package and the knockout.mapping package this will add a couple of js files to the scripts folder in your solution.&lt;br /&gt;
&lt;br /&gt;
Once you have the js files added you need to reference them, I normally add them to my _Layout.cshtml file as I use them on virtually every page in my applications. Your _layout.cshtml file should look as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon;"&gt;DOCTYPE&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;head&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;title&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;ViewBag.Title&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;title&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Content/Site.css"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;rel&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/css"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/jquery-1.5.1.min.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/knockout.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/knockout.mapping-latest.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;head&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"page"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"header"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"title"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h1&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;My&amp;nbsp;MVC&amp;nbsp;Application&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h1&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"logindisplay"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.Partial(&lt;span style="color: #a31515;"&gt;"_LogOnPartial"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"menucontainer"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ul&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"menu"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.ActionLink(&lt;span style="color: #a31515;"&gt;"Home"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Home"&lt;/span&gt;)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.ActionLink(&lt;span style="color: #a31515;"&gt;"About"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"About"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Home"&lt;/span&gt;)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.ActionLink(&lt;span style="color: #a31515;"&gt;"People"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"People"&lt;/span&gt;)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;li&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;ul&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"main"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;RenderBody()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"footer"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;
&lt;/pre&gt;
&lt;b&gt;Step 2 - Build a View&lt;/b&gt;The view I added for this demo is called Index.cshtml and lives in a Views/People folder. The code looks as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.Title&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;;
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;}&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Index&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;table&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"people"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;First&amp;nbsp;Name&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Last&amp;nbsp;Name&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Age&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tbody&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"foreach:&amp;nbsp;people"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text:&amp;nbsp;FirstName"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text:&amp;nbsp;LastName"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text:&amp;nbsp;Age"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tbody&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;peopleViewModel()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;_this&amp;nbsp;=&amp;nbsp;{};
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.people&amp;nbsp;=&amp;nbsp;ko.observableArray();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ko.applyBindings(_this,&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"#people"&lt;/span&gt;).get(0));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;LoadPeopleFromServer()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.post(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;'/people/data'&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;ko.observableArray();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ko.mapping.fromJS(data,&amp;nbsp;{},&amp;nbsp;results);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;results().length;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_this.people.push(results()[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;'json'&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadPeopleFromServer();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;_this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;viewModel&amp;nbsp;=&amp;nbsp;peopleViewModel();
 
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;/pre&gt;
I've kept the HTML and Javascript in one file in order to make this easy to follow. If you have no experience of knockout I would strongly suggest you follow the &lt;b&gt;excellent&lt;/b&gt; interactive tutorial on the knockout site. The HTML is vanilla knockout, it uses the data-bind attribute to specify how knockout binds values on the javascript model to DOM elements.&lt;br /&gt;
&lt;br /&gt;
The javascript is more interesting: you'll notice that the &lt;i&gt;peopleViewModel()&lt;/i&gt; object has a property &lt;i&gt;_this.people&lt;/i&gt; which is an observableArray, this means that knockout will take notice when elements are added and removed from it and update the DOM accordingly. The&lt;i&gt; LoadPeopleFromServer() &lt;/i&gt;method makes use of the jQuery ($.post) method to retrive data from the server in a JSON format, this JSON is returned to us as an array of javascript objects by JQuery, this is then taken by the knockout mapping utility and turned into an ko.observableArray of javascript objects. The beauty of using the mapping utlity is that we don't have to create any javascript objects to represent people, this is all done for us! This also has the advatage that if we add a new property to a person object on the server we don't need to change any javascript, only the HTML where we want the new value shown.&lt;br /&gt;
&lt;br /&gt;
You may wonder why &lt;i&gt;_this.people&lt;/i&gt; has been declared and we then push objects into it once they have returned from the server rather than just passing it into the mapping method. The reason for this is that the mapping method creates a new observableArray and assigs it to the variable you passed in. This ruins your knockout bindings as they were bound to the original array that you declared. You can get around this by only binding once you have got data back from the server but this gets more complicated once you introduce paging, etc. This pattern works and is easy to follow and implement.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 3 - The Controller Method&lt;/b&gt;&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;knockoutGrid.Controllers
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PeopleController&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Controller&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;Index()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;View();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JsonResult&lt;/span&gt;&amp;nbsp;Data()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;nbsp;people&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Richie"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"McCaw"&lt;/span&gt;,&amp;nbsp;33));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Dan"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Carter"&lt;/span&gt;,&amp;nbsp;32));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Owen"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Franks"&lt;/span&gt;,&amp;nbsp;23));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;Json(people);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;FirstName&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;LastName&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;Age&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;Person(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;firstName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lastName,&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;age)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstName&amp;nbsp;=&amp;nbsp;firstName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastName&amp;nbsp;=&amp;nbsp;lastName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Age&amp;nbsp;=&amp;nbsp;age;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
}
&lt;/pre&gt;
&lt;br /&gt;
The controller code is relatively simple, normally I would be retrieving data from a database but here I've hard coded it. The only things you really need to take heed of are the use of the JsonResult type that is being returned and the Json method that is needed to turn the list of people into valid JSON.&lt;br /&gt;
&lt;br /&gt;
In &lt;a href="http://softwaredevelopmentexperiences.blogspot.co.nz/2012/03/how-to-build-grid-with-knockout-part-2.html" target="_blank"&gt;Part 2&lt;/a&gt; I will show you how to implement paging!&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;I have put the source code up on bitbucket, you can download it &lt;a href="https://bitbucket.org/dwcarter/knockoutgrid" target="_blank"&gt;here.&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/vkCO0clde0g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/7231372806899552117/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2012/03/how-to-build-grid-with-knockout-and.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/7231372806899552117?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/7231372806899552117?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/vkCO0clde0g/how-to-build-grid-with-knockout-and.html" title="How to build a grid with knockout and ASP.Net MVC" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2012/03/how-to-build-grid-with-knockout-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcMQ3w9fCp7ImA9WhVRFUo.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-5271743491276209864</id><published>2011-11-10T00:51:00.000-08:00</published><updated>2012-03-23T23:54:42.264-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-23T23:54:42.264-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>How to add offline functionality to your web pages using ASP.net MVC</title><content type="html">I was recently tasked with creating an iPad client for our online survey product &lt;a href="http://www.prosperosurvey.co.nz/" target="_blank"&gt;Prospero&lt;/a&gt; . My initial thoughts were that I was going to have to buy a Mac and a book on iPad programming, however after a bit of thought I realised that I could potentially use HTML5 and a combination of its offline caching and local storage capabilities.&lt;br /&gt;
&lt;br /&gt;
The first issue that needs to be covered is geting the web browser to cache a version of a web page and all its required resources (images, scripts, etc) locally. Web browsers do this a lot of the time anyway in order to optimise performance, however in order for them to be used in an offline storage scenario they need to be stored in a separate cache. The way that you do this is by adding a manifest file to the page, this is done by adding a manifest attribute to the html tag.as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;manifest&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"/manifest.mf"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
I choose to use an ashx (or web handler) to provide the manifest file so my code actually looks like the following:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;manifest&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"/manifest.ashx"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;/pre&gt;
&amp;nbsp; &lt;br /&gt;
The reason that I use a web handler is that you don't you need to make configuration changes to IIS in order to allow the manifest file extension to be associated with the correct content type. I like to keep IIS customisation to an absolute mimimum as it's just one more thing that can go wrong when deploying an app. The code for the web handler looks as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;Prospero
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Manifest&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IHttpHandler&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProcessRequest(&lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;&amp;nbsp;context)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.ContentType&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"text/cache-manifest"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.WriteFile(context.Server.MapPath(&lt;span style="color: #a31515;"&gt;"~/content/survey.mf"&lt;/span&gt;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;IsReusable
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt; &lt;/pre&gt;
&lt;br /&gt;
In this example I have a manifest file &lt;i&gt;survey,mdf &lt;/i&gt;in the content directory of my application.&lt;br /&gt;
&lt;br /&gt;
The next rather daunting task is to work out what exactly needs to be written in the out in the manifest file. I realised that this should be pretty easy to work out by opening the web page and checking what resources had been downloaded using &lt;a href="http://getfirebug.com/" target="_blank"&gt;Firebug&lt;/a&gt; . I then wondered if someone has written a tool to automate this process and a quick Google turned up &lt;a href="http://manifested.dregsoft.com/" target="_blank"&gt;Manifested&amp;nbsp; &lt;/a&gt;. This awesome little tool will analyse your web page and tell you exactly what should be in your manifest file - just cut and paste the results into your .mf file!&lt;br /&gt;
&lt;br /&gt;
Now you're all set to go - all you need to do is browse to your web page and it will be cached locally. If you&amp;nbsp; use Firefox to develop in you will get a warning bar at the top of the page asking you for permission to cache data locally - say yes and you're done. Now if you re-visit the page you will not be making any internet call except a call to retrieve the manifest file (if you are still online), this is done to check if there is a newer version on the server.&amp;nbsp; The way the browser determins if the file is newer is by checking the revision number in the file - you can force the browser to download all newer versions of your cached files by incrementing the revision number.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you would like to double check what Firefox has cached you can do so by typing &lt;i&gt;about:cache&lt;/i&gt; in the browser URL bar, the Offline Cache Device section show what is stored.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/zJSouqmW4EY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/5271743491276209864/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/11/how-to-add-offline-functionality-to.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/5271743491276209864?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/5271743491276209864?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/zJSouqmW4EY/how-to-add-offline-functionality-to.html" title="How to add offline functionality to your web pages using ASP.net MVC" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/11/how-to-add-offline-functionality-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08CSH89eip7ImA9WhRRFU8.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-623699372159012761</id><published>2011-09-27T20:31:00.000-07:00</published><updated>2011-11-28T15:11:09.162-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-28T15:11:09.162-08:00</app:edited><title>How to format code in your blog - the easy way</title><content type="html">I've spend numerous hours trawling the internet looking for ways to make the code that I use in my blog easy to read and nicely formatted. Unfortunately I've never managed to find anything that cuts the mustard and I had resigned myself to having to use numerous hacks. That is until I saw a colleague cut and paste some code that he was working on into a Wiki and it came out perfectly formatted straight from Visual Studio!&lt;br /&gt;
&lt;br /&gt;
"How the %$#@ did you do that?" I shouted&lt;br /&gt;
"Don't know - I just cut and pasted" was the reply&lt;br /&gt;
"Can't be. Visual Studio doesn't use HTML for it's code editor"&lt;br /&gt;
&lt;br /&gt;
Sure enough when we cut and pasted the code into a text editor you could see that it was perfectly styled using CSS. Afer a bit of digging we discovered that he had Power Productivity Tools installed which has the capacity to enable HTML cut and paste - Eureka!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-s0v24u5tBK0/ToKT9mUBaKI/AAAAAAAAABQ/bpY6KaOll2s/s1600/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://3.bp.blogspot.com/-s0v24u5tBK0/ToKT9mUBaKI/AAAAAAAAABQ/bpY6KaOll2s/s400/Capture.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You can get this add on using NuGet (Tools -&amp;gt; Extension Manager -&amp;gt; Online Gallery and then search for Power Productivity Tools).&lt;br /&gt;
&lt;br /&gt;
Now I can cust and paste code like this straight from Visual Studio:&lt;br /&gt;
&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Log&amp;nbsp;On&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Please&amp;nbsp;enter&amp;nbsp;your&amp;nbsp;pin&amp;nbsp;and&amp;nbsp;password.&amp;nbsp;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.ValidationSummary(&lt;span style="color: blue;"&gt;true&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Login&amp;nbsp;was&amp;nbsp;unsuccessful.&amp;nbsp;Please&amp;nbsp;correct&amp;nbsp;the&amp;nbsp;errors&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;span style="color: #a31515;"&gt;and&amp;nbsp;try&amp;nbsp;again."&lt;/span&gt;)
 
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(Html.BeginForm())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;fieldset&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;legend&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Account&amp;nbsp;Information&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;legend&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;span style="color: blue;"&gt;.....&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/47m-L6YaiYA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/623699372159012761/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/09/how-to-format-code-in-your-blog-easy.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/623699372159012761?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/623699372159012761?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/47m-L6YaiYA/how-to-format-code-in-your-blog-easy.html" title="How to format code in your blog - the easy way" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-s0v24u5tBK0/ToKT9mUBaKI/AAAAAAAAABQ/bpY6KaOll2s/s72-c/Capture.PNG" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/09/how-to-format-code-in-your-blog-easy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8HQH0_fyp7ImA9WhdQGUw.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-6404700768012209056</id><published>2011-08-21T02:05:00.000-07:00</published><updated>2011-08-21T02:10:31.347-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-21T02:10:31.347-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC JQuery" /><title>ASP.Net MVC - validating if an email address is already in use</title><content type="html">&lt;b&gt;Problem &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The need to check if an email is already registered by a signed up user is a very common scenario that any application using Forms Authentication need to cater for. Ideally you want to make use of Ajax so that the user can get instant feedback and it should fit into your current client side validation framework. At &lt;a href="http://www.canterburybusinesssolutions.co.nz/"&gt;CBSL&lt;/a&gt; we use the JQuery Validation plugin to achieve this, it is very well featured and infintely customisable and makes it easy to cater for this scenario.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution&lt;/b&gt;&lt;br /&gt;
The code in the .cshtml view file looks as follows (please note that I have removed the master page to make the code simpler to replicate):&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;
    &amp;lt;script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type="text/javascript"&amp;gt;

        $(document).ready(function () {

            $("#testForm").validate({
                rules: {
                    "emailAddress": {
                        required: true,
                        email: true,
                        remote: {
                            url: "EmailValidation/checkEmail",
                            type: "post"
                        }
                    }
                },
                messages: {
                    "emailAddress": { remote: "This email address is already in use." }
                }
            });

        });

    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form action='/EmailValidation' id='testForm'&amp;gt;
        &amp;lt;h1&amp;gt;
            Email Validation&amp;lt;/h1&amp;gt;
        &amp;lt;span&amp;gt;Email address&amp;lt;/span&amp;gt;
        @Html.TextBox("emailAddress")
        &amp;lt;br /&amp;gt;
        &amp;lt;button type="submit"&amp;gt;Save&amp;lt;/button&amp;gt;        
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;Of&amp;nbsp; special interest in this code is the JQuery "validate" method that takes in a rules object where we can define what the validation rules for a field should be and what messages should be displayed if validation should fail. In particular we can specify that the field should be validated using the "email" rule, which means it will be checked for the correct formatting and we can specify the use of the "remote" rule which means there will be a callback to an action on a controller when performing validation.&lt;br /&gt;
&lt;br /&gt;
The data that jQuery posts back to the controller will be the value of the field that is being validated, in return it will expect a JsonResult with the result being true if it is the validation passes or false if not.&amp;nbsp; The content of the controller file looks as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre brush="csharp" style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;using System;
using System.Web.Mvc;
using System.Web.Security;

namespace Blog.Controllers
{
    public class EmailValidationController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }

        public virtual JsonResult CheckEmail(string emailAddress)
        {
            JsonResult result = new JsonResult();

            result.Data = Membership.FindUsersByEmail(emailAddress).Count == 0;

            return result;
        }

    }
}

&lt;/code&gt;&lt;/pre&gt;In the example above I've used the&amp;nbsp; ASP.Net Membership service to test if there is a user with that email already in the system, easy!&lt;br /&gt;
&lt;br /&gt;
For more information on the JQuery Validation plugin check out the &lt;a href="http://docs.jquery.com/Plugins/Validation"&gt;documentation&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/9VIJLGxYteY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/6404700768012209056/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/08/aspnet-mvc-how-to-validate-if-email-is.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/6404700768012209056?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/6404700768012209056?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/9VIJLGxYteY/aspnet-mvc-how-to-validate-if-email-is.html" title="ASP.Net MVC - validating if an email address is already in use" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/08/aspnet-mvc-how-to-validate-if-email-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YFRH09fSp7ImA9WhZbGEU.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-6206542075053352675</id><published>2011-06-14T18:24:00.000-07:00</published><updated>2011-06-23T21:18:35.365-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-23T21:18:35.365-07:00</app:edited><title>Javascript, read the manual!</title><content type="html">&amp;nbsp;There is nothing more than frustrating than opening up a flat pack piece of furniture and finding that there is no manual. Sure you can put it together by trial and error but odds are it won't quite look the way you want, or it will break the first time something heavy is put on it. That has always been my relationship wth Javascript in the past, frustrated home DIY maintenance man!&lt;br /&gt;
&lt;br /&gt;
Fortunately I managed to find the manual, &lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1308100743&amp;amp;sr=1-1"&gt;Javascript the Good Parts &lt;/a&gt;by Douglas Crocker explains most of what you need to know about putting tother a decent piece of Javascript. As it turns out you can build maintainable, modular software using Javascript and enjoy doing it. Javascript is a very elegant and in parts well thought out language, but as with most things in life you need to out some effort in to get the most out of it.&lt;br /&gt;
&lt;br /&gt;
Instead of dreading the next Javascript project&amp;nbsp; arriving I now look forward to the experience. Get yourself a manual you won't regret it!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/BKnuxwszPsM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/6206542075053352675/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/06/javascript-read-manual.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/6206542075053352675?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/6206542075053352675?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/BKnuxwszPsM/javascript-read-manual.html" title="Javascript, read the manual!" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/06/javascript-read-manual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUCQ3k_fCp7ImA9WhZVF0k.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-7053531023371023651</id><published>2011-05-30T01:31:00.000-07:00</published><updated>2011-05-30T01:31:02.744-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-30T01:31:02.744-07:00</app:edited><title>The story of a very long domain name</title><content type="html">Three months ago I started a new job at a flash company called Datasouth. Everyone had an iPhone and a fleet of new company cars was always in full view parked outside the brand new company HQ. Any reasonable person would assume that they had money, oodles of it.&lt;br /&gt;
&lt;br /&gt;
At the interview I asked the usual questions about budgets and revenue forecasts and was assured that this was one company that was hitting the ball out the park. Hence I was somewhat taken aback when three weeks later we were called for a meeting and told that we no longer had jobs as the company was going into receivership! I won't go into detail other than noting that there were a number of members of the Serious Fraud Office on site in the following days gleefully rubbing their hands. &lt;br /&gt;
&lt;br /&gt;
On the plus side I had the pleasure of forming some great relationships with a couple of Datasouth employees, &lt;a href="http://onehundredwatt.wordpress.com/"&gt;Steve Knutson&lt;/a&gt; and Peter Cummins, and we decided to start our own company to service the Datasouth software clients. One day later we were registering the company and doing our first bits of paid work. Two months later we are still in business, having a great time and learning many lessons, one of which is to never rush into choosing a domain name - we are the proud owners of &lt;a href="http://www.canterburybusinesssolutions.co.nz/"&gt;www.canterburybusinesssolutions.co.nz&lt;/a&gt;. Our email addresses take at least twenty seconds to type out and we have the dubious honour of having 3 consecutive "s"s in our name, something which never fails to get pointed out to us by new clients!&lt;br /&gt;
&lt;br /&gt;
I am currently leading a team of contractors in building ASP.Net MVC applications for a range of clients. I continue to be amazed at the simplicity and joy of MVC compared to the traditional ASP.Net Web Forms and continually feel like a kid in a candy shop when faced with all the various tools that we can now make use of to build responsive, task focused applications. Over the coming year I plan to be blogging a lot on the lessons we are learning as a new software business and the joy of MVC.&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/B-WQW2pO_qo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/7053531023371023651/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/05/story-of-very-long-domain-name.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/7053531023371023651?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/7053531023371023651?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/B-WQW2pO_qo/story-of-very-long-domain-name.html" title="The story of a very long domain name" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/05/story-of-very-long-domain-name.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIAQHc4eip7ImA9Wx9WGUk.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-9211616038498352608</id><published>2011-01-25T01:06:00.000-08:00</published><updated>2011-01-25T01:09:01.932-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-25T01:09:01.932-08:00</app:edited><title>ASP.Net MVC - How to switch javascript links between Debug and Release builds using Razor</title><content type="html">I use JQuery and numerous associated plugins in virtually every site I develop now days. Depending on what I am doing I want to be using a specific version of a file, for instance when debugging I often want to be using jquery.js so I can debug if required, while in the production version of the code I want to use the CDN to make use of caching on the browser. Currently there is no easy way to do this, so I sat down at the keyboard to see what I could come up with.&lt;br /&gt;
&lt;br /&gt;
My requirements were:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;it had to be very easy to use in the view page, much like the current URL.Content() method&lt;/li&gt;
&lt;li&gt;it had to be easy to set up the paths for the files, no fiddling around with lots of strings in&amp;nbsp; the web.config for this&lt;/li&gt;
&lt;li&gt;it had to be easy to switch between debug and release versions of the strings&lt;/li&gt;
&lt;li&gt;it had to perform well as it could be called a number of times&lt;/li&gt;
&lt;/ul&gt;The entire code for the solution is included at the end of this post, to use it you need to do the following:&lt;br /&gt;
&lt;br /&gt;
1. Set up the paths to your javascript and css files in your global.asx file as the following example shows:&lt;br /&gt;
&lt;pre class="brush:csharp.js"&gt;protected void Application_Start()
{
&amp;nbsp;  UrlHelperExt.Instance().AddUrls(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new FileUrl("JQuery", UrlMode.Debug, "~/Scripts/jquery-1.4.4.js"),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new FileUrl("JQuery", UrlMode.Release, "https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/pre&gt;The UrlHelperExt class makes use of the singleton pattern and is instantiated by the Instance() method. The AddUrls() method takes an array of FileUrl classes. The FileUrl class constructor takes the following parameters:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;FileKey&lt;/b&gt;: this is the unique identifier for the script and what you will use to reference it in the view page&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UrlMode&lt;/b&gt;: This is an enum which determines which Url is used depending on the UrlMode you configure in your web.config file.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UrlPath&lt;/b&gt;: This is the actual path to the script file. You can pass in a path using the ~ notation and it will be resolved to the correct path at runtime using the current HTTPRequest.&lt;/li&gt;
&lt;/ul&gt;2. Use a UrlHelper extension method in your view pages as follows:&lt;br /&gt;
&lt;pre class="brush:csharp.js"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="@Url.ContentPath("JQuery")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
3. Switch between the Urls that are used in your pages by adding the following to your web.config file:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp.js"&gt;&amp;lt;appSettings&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="URLMode" value="Release"/&amp;gt;
&amp;nbsp; &amp;lt;/appSettings&amp;gt;
&lt;/pre&gt;The URLMode key can be set to Release/Staging/Debug. If there is no key or it cannot be parsed correctly it will use the 'debug' mode strings.&lt;br /&gt;
&lt;br /&gt;
So where are these strings cached? Well I decided that I would make use of HTTPApplication to store the UrlHelperExt class. This means that there is only one stored in memory independent of how many sessions you may have running. Any thread contention issues are taken care of by making sure that the dictionary that stores the FileUrl objects is locked each time a read takes place. &lt;br /&gt;
&lt;br /&gt;
The entire code for the classes and extension methods is as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp.js"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Web.Mvc;
using System.Web;

namespace DWC.MVC.Common
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; public enum UrlMode { Debug, Staging, Release };
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static class UrlHelperExtensions
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string ContentPath(this UrlHelper helper, string urlKey)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return UrlHelperExt.Instance().GetURL(urlKey, helper);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }


&amp;nbsp;&amp;nbsp;&amp;nbsp; public class FileUrl
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string UrlPath { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string UrlKey { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UrlMode UrlMode { get; set; }


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public FileUrl(string urlKey, UrlMode mode, string urlPath)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.UrlKey = urlKey;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.UrlPath = urlPath;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.UrlMode = mode;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string GetKey()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return GetKey(this.UrlMode,this.UrlKey);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string GetKey(UrlMode mode, string urlKey)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ((int)mode).ToString() + "_" + urlKey;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public class UrlHelperExt
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UrlMode UrlMode { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dictionary&amp;lt;string, FileUrl&amp;gt; Urls = new Dictionary&amp;lt;string, FileUrl&amp;gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object _syncLock = new object();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UrlHelperExt()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string configMode = ConfigurationManager.AppSettings["URLMode"];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.UrlMode = UrlMode.Debug;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!String.IsNullOrEmpty(configMode))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UrlMode result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Enum.TryParse&amp;lt;UrlMode&amp;gt;(configMode, out result))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.UrlMode = result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static UrlHelperExt Instance()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (HttpContext.Current.Application["URL_HELPER_EXT"] == null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext.Current.Application["URL_HELPER_EXT"] = new UrlHelperExt();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (UrlHelperExt)HttpContext.Current.Application["URL_HELPER_EXT"];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void AddUrls(params FileUrl[] fileURLs)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var fileURL in fileURLs)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Urls.Add(fileURL.GetKey(), fileURL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string GetURL(string urlKey, UrlHelper urlHelper)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileUrl fileUrl = null;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string key = FileUrl.GetKey(this.UrlMode,urlKey);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //lock while we are reading from the dictionary as it is stored in appdata
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lock (this._syncLock)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileUrl = this.Urls[key];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (fileUrl.UrlPath.StartsWith("~"))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return urlHelper.Content(fileUrl.UrlPath);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return fileUrl.UrlPath;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;Of course this needn't be restricted to javascript files, you could also use it for your css files and if you were really keen you could even use it for things like displaying different messages to users, e.g. "This is the test website" or "This is the staging website". &lt;br /&gt;
&lt;br /&gt;
Word of warning, this has not been tested in production yet, but it will be soon! I also blogged in an earlier post about how to easily add javascript and css links to web pages using Razor &lt;a href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/css-and-javascript-links-with-razor.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/IubBjOkyU5o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/9211616038498352608/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-switch-javascript.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/9211616038498352608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/9211616038498352608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/IubBjOkyU5o/aspnet-mvc-how-to-switch-javascript.html" title="ASP.Net MVC - How to switch javascript links between Debug and Release builds using Razor" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-switch-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMNSHkyfyp7ImA9Wx9XGUs.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-3107717402709425434</id><published>2011-01-13T16:54:00.000-08:00</published><updated>2011-01-13T16:54:59.797-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-13T16:54:59.797-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google Charts" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>A Quick and Easy HTMLHelper for Google Charts</title><content type="html">Virtually every project I do now days needs some form of a chart in it. Up until now I’ve been using DevExpress for their great range of web controls including a very powerful Chart control. However recently I’ve been reading about the &lt;a href="http://code.google.com/apis/chart/docs/making_charts.html"&gt;Google Charts API&lt;/a&gt; for quickly and easily creating charts on the fly, so I decided to give it a go. After all it’s free and there is no need to add any DLL’s to the project, two very good attributes in my book!&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to add charts to my MVC web pages I built an HTMLHelper extension method so now all I need to do is write the following for a chart:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp.js"&gt;&amp;lt;%= Html.GoogleChart(rdi.Series, ChartType.Pie, width: 400, height: 225) %&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
The extension method and its associated classes look like the following:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp.js"&gt;&amp;nbsp; public enum ChartType { Pie = 1, Bar = 2 };
&amp;nbsp;&amp;nbsp; public class SeriesData
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Value { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Description { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SeriesData(int value, string description)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Value = value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Description = description;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; public class GoogleChart
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Height { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Width { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ChartType ChartType { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;SeriesData&amp;gt; Series = new List&amp;lt;SeriesData&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string GetURL()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string result = "&lt;a href="http://chart.apis.google.com/chart?%22;"&gt;http://chart.apis.google.com/chart?";&lt;/a&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //add the chart size
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result += String.Format("chs={0}x{1}&amp;amp;", this.Width, this.Height);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //add the type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result += String.Format("cht={0}&amp;amp;", ChartTypeAsString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //add the data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string seriesValues = "chd=t:" ;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string axisLabels = "chl=" ;
&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var s in this.Series)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; seriesValues += s.Value.ToString() + ",";
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; axisLabels += s.Description + "|";
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result += seriesValues.TrimEnd(","[0]) +"&amp;amp;"&amp;nbsp; + axisLabels;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return String.Format("&amp;lt;img src='{0}' width='{1}' height='{2}' alt='' /&amp;gt;", result, this.Width, this.Height);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string ChartTypeAsString()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (this.ChartType)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ChartType.Pie:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "p";
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ChartType.Bar:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "bvs";
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "p";
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; public static class GoogleChartExtensions
&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string GoogleChart(this HtmlHelper helper, List&amp;lt;KeyValuePair&amp;lt;string,int&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp; SeriesValues,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int width, int height)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GoogleChart gc = new GoogleChart();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gc.Height = height;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gc.Width = width;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gc.ChartType = ChartType.Pie;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; seriesValues.ForEach(x =&amp;gt; gc.Series.Add(new SeriesData(x.Value,x.Key)));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return gc.GetURL();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; }

&lt;/pre&gt;&lt;br /&gt;
This is enough to get a pretty basic pie or bar chart showing on your web page. The Google Charts API is extremely powerful and their are a myriad of options available for customisation, I plan to add further capabilities to this helper and blog about them in the future. &lt;br /&gt;
&lt;br /&gt;
Enjoy your charts!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/EFmlricaGOc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/3107717402709425434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/quick-and-easy-htmlhelper-for-google.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/3107717402709425434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/3107717402709425434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/EFmlricaGOc/quick-and-easy-htmlhelper-for-google.html" title="A Quick and Easy HTMLHelper for Google Charts" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/01/quick-and-easy-htmlhelper-for-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUGRnszeCp7ImA9Wx9XF0o.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-1191337639657325057</id><published>2011-01-10T22:48:00.000-08:00</published><updated>2011-01-11T11:13:47.580-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-11T11:13:47.580-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>ASP.Net MVC 3 - Is the ViewBag a good thing?</title><content type="html">MVC 3 introduces a ViewBag property to controllers. This is a dynamic data dictionary, which essentially means you can declare properties of the object on the fly and then reference them later, so you can write code like:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;ViewData.Title = "Hi";
&lt;/pre&gt;&lt;br /&gt;
in the controller and then in the view reference it like:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;label&amp;gt;@ViewBag.Title&amp;lt;/label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Cool, right? Well no, not really. When I first came across the concept I was quite excited because I thought the compiler would throw a compile time error if you reference a property on a dynamic object that hadn't previously been assigned to. I know next to nothing about compilers but I'm guessing that isn't the case because it's too difficult to work out what happened first, the assignment or the use.&lt;br /&gt;
&lt;br /&gt;
So essentially we don't get the benefits of compile time checking using a dynamic object. Semantically the code looks nicer than using the ViewData dictionary with it's strings and you don't have to typecast the whole time which is good. However I think that anything that allows, and indeed &lt;i&gt;encourages&lt;/i&gt;, people to write poor code is a Very Bad Thing. I am going to put my purist hat on and say that when passing data to a view you should be using a dedicated class with strongly typed properties which will give you the major benefit of compile time checking. &lt;br /&gt;
&lt;br /&gt;
Perhaps a T4 genius could write a script that will take all the ViewBag properties referenced in a view, create a class with the relevant properties and use the newly created class to strongly type the view. Wouldn't that be nice!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/wYIuyvYojjE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/1191337639657325057/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-3-is-viewbag-good-thing.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/1191337639657325057?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/1191337639657325057?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/wYIuyvYojjE/aspnet-mvc-3-is-viewbag-good-thing.html" title="ASP.Net MVC 3 - Is the ViewBag a good thing?" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-3-is-viewbag-good-thing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUNQ3Y7eip7ImA9Wx9XF00.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-4398981963538960291</id><published>2011-01-10T15:59:00.000-08:00</published><updated>2011-01-10T16:04:52.802-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-10T16:04:52.802-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>ASP.Net MVC - How to postback to the server when a dropdown changes</title><content type="html">&lt;b&gt;&lt;span style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I recently needed to call a controller action on the server when a dropdown list on a web page changed. This is a fairly common scenario and in this case I was needing to show a list of options from the database based on the value of the dropdown. If the dropdown was contained within a form element I could have called the form submit method and posted back that way, but it wasn't so I had to come up with another way.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Solution &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
We can trigger the web page to call back to the desired controller and action on the server by using some javascript to assign the desired URL to the window.location.href property of the page.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js"&gt;&amp;lt;script type="text/javascript"&amp;gt;
&amp;nbsp; function ChangeLanguage() {
&amp;nbsp;   window.location.href = &amp;lt;%= String.Format("'{0}'",
      Url.Content("~/FileUpload/Index/")) %&amp;gt; + $('#language').val();
&amp;nbsp; }
&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
I've used some jQuery goodness here to grab the selected value of the dropdown list by using the val() method. This is then appended to the URL of the controller action and can be accessed by declaring the method on the server with an id parameter:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;public ActionResult Index(int? id)
{
&amp;nbsp; //do something with the id
}
&lt;/pre&gt;&lt;br /&gt;
Now all we need to do is hook up the ChangeLanguage() function to the language dropdown list:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;%: Html.DropDownList("language", (SelectList)ViewData["LanguageList"],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { onchange = "ChangeLanguage(); return false;" })%&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
This could have been done using jQuery to bind to the dropdown list change event but for this simple page I didn't see the need.&lt;br /&gt;
&lt;br /&gt;
Posting back to the server when a dropdown list changes - done!&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/eJb07IrPST8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/4398981963538960291/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-postback-to-server.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/4398981963538960291?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/4398981963538960291?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/eJb07IrPST8/aspnet-mvc-how-to-postback-to-server.html" title="ASP.Net MVC - How to postback to the server when a dropdown changes" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-postback-to-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIARnwzeyp7ImA9WhdaFko.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-8122843196979853553</id><published>2011-01-08T16:50:00.000-08:00</published><updated>2011-10-26T17:15:47.283-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T17:15:47.283-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Razor" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net MVC" /><title>CSS and javascript links with Razor</title><content type="html">&lt;span style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;I've recently started work on an ASP.Net MVC project and I am using Razor as the view engine. So far I really like it, compared to the default view engine, the syntax is far cleaner and more concise.&amp;nbsp; However o&lt;/span&gt;ne of the issues I have come across is the need to add CSS links to a web page. Unlike a javascript link which can be placed anywhere in the body of an HTML page CSS links always need to be added in the &amp;lt;head&amp;gt; section of an HTML page which we do not have access to in a child page. . What to do?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;
In VS2010 with each new Razor MVC project a _Layout.cshtml page is  included in the Views/Shared folder, this is the Razor equivalent of a  master page. In addition there is a dynamic data dictionary called the ViewBag which can be accessed by a controller or view.My first thought was to use the ViewBag to define a collection of links which could then be rendered in the _layout.cshtml page. This, however, would have been pretty clunky and semantically not very pretty. A while later I read an article about &lt;i&gt;sections&lt;/i&gt; in Razor and realized that these very powerful constructs would be perfect for this scenario!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: yellow;"&gt;@RenderSection("head",false)&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The important bit to note here is the addition of the @RenderSection method which will then cause any code that you created in a "head" section of a child page to be rendered here. It takes a parameter indicating whether every child page need to define the section in question or not, by default this parameter is set to true, I have set it to false as not every child page will have to define extra head content.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The code that was added to the child page looks as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="background-color: yellow; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;@section Head&lt;/span&gt;&lt;br style="background-color: yellow; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;{&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href="@Url.Content("~/Content/datePicker.css")" rel="stylesheet" type="text/css" /&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: inherit;"&gt;
&lt;span style="font-size: small;"&gt;Razor keeps on with the easy to use fluid syntax by allowing you to declare which section you are defining content for by simply writing @section and the name of the section. Nice! You can now add any content css links, javascript links, etc to your web page simply and easily.&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: inherit;"&gt;
&lt;span style="font-size: small;"&gt;CSS links in Razor - done!&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;I have also blogged on how to easily switch between different versions of javascript files &lt;a href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-switch-javascript.html"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;i&gt;Edit 27 Oct 2010 &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;A number of readers commented that they were getting an error stating "element link cannot be nested within element link", I personally haven't experienced this issue so I suggest trying a complete rebuild of your project if you do encounter it. Otherwise another reader has suggested you can get around it by &lt;/span&gt;switching the "Target Schema for Validation" to HTML5.
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/tlrvRQcYo-g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/8122843196979853553/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/css-and-javascript-links-with-razor.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/8122843196979853553?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/8122843196979853553?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/tlrvRQcYo-g/css-and-javascript-links-with-razor.html" title="CSS and javascript links with Razor" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>9</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/01/css-and-javascript-links-with-razor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIMR3g5fip7ImA9Wx9XFkk.&quot;"><id>tag:blogger.com,1999:blog-6168350169615053154.post-5373775467457717843</id><published>2011-01-07T16:46:00.000-08:00</published><updated>2011-01-09T23:29:46.626-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-09T23:29:46.626-08:00</app:edited><title>ASP.Net MVC - how to post values to the server that are not in an input element</title><content type="html">&lt;h2&gt;Problem&lt;/h2&gt;I am building a web page that allows the user to select dates in a  calendar and then shows the dates in an unordered list. The problem now  is that those dates need to be sent to the server on page submit so that  they can be saved to the database. If I was storing the dates in an  input element, say a textbox, that wouldn't be an issue but because they  are in an html element whose contents are not posted to the server an  alternative strategy needs to be developed.&lt;br /&gt;
&lt;h2&gt;Solution&lt;/h2&gt;The approach that I took to solve this problem is as follows:&lt;br /&gt;
&lt;i&gt;1. Place a hidden input field on the form &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&lt;input id="hiddenDates" name="hiddenDates" type="hidden" value="" /&gt;
&lt;/pre&gt;&lt;br /&gt;
ASP.Net MVC has an Html helper with a method called Hidden() that will do this for you &lt;br /&gt;
&lt;pre class="brush:csharp"&gt;@Html.Hidden("hiddenDates").
&lt;/pre&gt;2. &lt;i&gt;Copy the values from the html element to the hidden input field before submitting the form&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
The following javascript is added to the page:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js"&gt;$(function () {
  $('#formCreate').submit(function () {
    PopulateHiddenDates();
  });
});&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:js"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:js"&gt;function PopulateHiddenDates() {
  var dateValues = '';&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:js"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:js"&gt;$($('#dateList').children('li')).each(function(index) {
    dateValues += $(this).attr("id") + ",";
  });

  $('#hiddenDates').val(dateValues);
}&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:js"&gt;&amp;nbsp;&lt;/pre&gt;I'm using jQuery to bind to the form submit event so that my method  to populate the hidden field gets called before the form is submitted.  The dateList element is an unordered list and by using the jQuery each  function I can itterate through all the &amp;lt;li&amp;gt; items that it  contains, get each items id attribute (to which I have assigned the  value of the date in millisecs) and write them to the hidden field as a  comma delimited string.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;3. Process the dates on the server&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;[HttpPost]
public ActionResult Create(string hiddenDates, string utcOffset)
{
  List&amp;lt;DateTime&amp;gt; dates = GetDates(hiddenDates, utcOffset);
}&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:csharp"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:csharp"&gt;private List&amp;lt;DateTime&amp;gt; GetDates(string hiddenDates, int utcOffset)
{
  List&amp;lt;DateTime&amp;gt; dates = new List&amp;lt;DateTime&amp;gt;();

  var values = hiddenDates.Split(",".ToCharArray(),&lt;/pre&gt;&lt;pre class="brush:csharp"&gt;StringSplitOptions.RemoveEmptyEntries);

  foreach (var item in values)
  {
    DateTime newDate = new DateTime(1970, 1, 1)&lt;/pre&gt;&lt;pre class="brush:csharp"&gt;.AddMilliseconds(double.Parse(item)).AddMinutes(utcOffset*-1);&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:csharp"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:csharp"&gt;dates.Add(newDate);
  }

  return dates;
}
&lt;/pre&gt;&lt;br /&gt;
By declaring a parameter with the same name as the hidden field  ASP.Net will take care of finding the corresponding entry in the form  collection posted back to the server and binding it to the hiddenDates  parameter! Excellent! I now have my dates the user selected and I can  save them to the database.&lt;br /&gt;
&lt;br /&gt;
I have also used the same technique to pass  back a utcOffset so that I know what timezone the user is in and I can  show the dates correctly to users in other timezones if necessary (this  isn't strictly necessary at the moment but I plan to introduce times  later).&lt;br /&gt;
&lt;br /&gt;
Saving multiple dates from an unordered list - &lt;b&gt;DONE!&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;a _fcksavedurl="http://s48.sitemeter.com/stats.asp?site=s48dwcarter" href="http://s48.sitemeter.com/stats.asp?site=s48dwcarter" target="_top"&gt; &lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/ASoftwareDevelopersDiary/~4/cyq-mxQyij8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwaredevelopmentexperiences.blogspot.com/feeds/5373775467457717843/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-post-values-to-server.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/5373775467457717843?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6168350169615053154/posts/default/5373775467457717843?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ASoftwareDevelopersDiary/~3/cyq-mxQyij8/aspnet-mvc-how-to-post-values-to-server.html" title="ASP.Net MVC - how to post values to the server that are not in an input element" /><author><name>David Carter</name><uri>http://www.blogger.com/profile/12603631574276960953</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/-s7VaAuNSWZg/TsTAytUGbgI/AAAAAAAAABY/9rXnp9VH9-w/s1600/7cba97347c55c52146d289aa7ffacc07.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://softwaredevelopmentexperiences.blogspot.com/2011/01/aspnet-mvc-how-to-post-values-to-server.html</feedburner:origLink></entry></feed>
