<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-894673367938301322</id><updated>2012-01-27T06:21:52.280-08:00</updated><category term='Description'/><category term='Per Request cache'/><category term='Visual Studio'/><category term='Cross domain communication'/><category term='IIS 7'/><category term='Model View Presenter'/><category term='MVC'/><category term='Cache'/><category term='Display Dynamic problem'/><category term='Server Controls Path'/><category term='SQL Server'/><category term='Deployment'/><category term='Customizing Dynamic Data'/><category term='Dynamic Variable'/><category term='Forms Authentication'/><category term='CodeProject'/><category term='Response.Redirect'/><category term='System.Web.HttpException'/><category term='Asp.net Ajax'/><category term='Interface'/><category term='TeamWork'/><category term='Remove wrapping table element'/><category term='Visual Studio 2010'/><category term='HttpContext.Current.Items'/><category term='Ado.net'/><category term='EntityTemplates'/><category term='BreakPoint'/><category term='Recursive Function'/><category term='Path problems'/><category term='_SiteLayout.cshtml'/><category term='FieldTemplates'/><category term='General'/><category term='HTML Path'/><category term='Current Request Storage'/><category term='Conditional Load'/><category term='RequiredFieldValidator'/><category term='Asp.net Folders'/><category term='_AppStart.cshtml'/><category term='Performance Profiling'/><category term='Asp.net'/><category term='App_Browsers'/><category term='HTML Encoding'/><category term='Same Origin Policy'/><category term='Asp.net WebForm'/><category term='Articles'/><category term='ClientIDMode'/><category term='Transformation Files'/><category term='TSQL Recursive UDF'/><category term='Expand right side'/><category term='Dynamic typing'/><category term='Database Deployment'/><category term='URL Routing'/><category term='Dynamic meta properties'/><category term='Asp.net 4.0'/><category term='Wrapping table element'/><category term='Javascript'/><category term='Asp.net Razor'/><category term='Abstract Class'/><category term='Software Development'/><category term='Performance Monitor'/><category term='Predictable'/><category term='Database change script'/><category term='Keyword'/><category term='MVP'/><category term='Missing Column'/><category term='SSO'/><category term='Best Practices'/><category term='Exception Handling'/><category term='CustomPages'/><category term='Learning'/><category term='Example'/><category term='ThreadAbortException'/><category term='ScriptManager'/><category term='TreeView'/><category term='DataReader'/><category term='Transform Web.config'/><category term='New Encoding Expression'/><category term='One click publish'/><category term='Razor'/><category term='OOP'/><category term='Dynamic Data'/><category term='Debug'/><category term='Performance Monitor individual application'/><category term='Late Binding'/><category term='Dynamic Binding'/><category term='iFrame'/><category term='Debugging Timeout'/><category term='Windows Application'/><category term='PageTemplates'/><category term='C# 4.0'/><title type='text'>Shubho on .NET</title><subtitle type='html'>While ( ILearnThroughWork() ) { ITryToShare(); }</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.shubho.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.shubho.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-4668478956616648425</id><published>2011-03-30T22:20:00.000-07:00</published><updated>2011-03-30T22:21:46.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Razor'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net Razor'/><title type='text'>Say hello to Asp.net Razor web site. Part2 : Basic concepts</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;a href="http://www.shubho.net/2011/03/say-hello-to-aspnet-razor-web-site.html"&gt;previous part of this article&lt;/a&gt; introduces with an Asp.net Razor web site, which is built on top of Razor view engine. This part will cover some basic Razor stuff which would be kind of essentials to know, in order to develop an Asp.net Razor web site based application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Here we go&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you might know already, unlike the Asp.net Web Forms, there is no Server control or CodeBehind classes available in Razor web sites. All you have is the cshtml files, which contains the plain old html markups with simple Razor expressions @. In Razor, you stay closest to the basic HTML, that gives you the power to customize the front-end functionality to your heart's content. The good news is, even though you don't have the powerful server controls here, you've got powerful built-in Helpers which lets you add complex user interface modules with functionality in the cshtml pages. Razor is simple, and beautiful.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Following are some of the basic Razor things that you should know, in order to be able to start building a real application:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;The IsPost property&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Like the IsPostBack property in Asp.net web forms, you can determine whether the current Request is due to a form Post or Get request by checking the IsPost property as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@{  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Layout = "~/_SiteLayout.cshtml";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(IsPost) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Retrieve the numbers that the user entered.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var user = Request["UserName"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var password = Request["Password"];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; UserManager userManager = new UserManager();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var success = userManager.TryLogin(user, password);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Enter UserName and Password&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;form action="" method="post"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="text1"&amp;gt;UserName:&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="text" name="UserName" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="text2"&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="text" name="Password" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="submit" value="Login" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Mixture of HTML and Razor &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In Razor, @ is just a replacement of the server side expression &amp;lt;%=%&amp;gt; and &amp;lt;%...%&amp;gt; which are using in aspx web forms. Using the @ symbol doesn't require you to end the expression with something, which greatly simplifies the mixture of HTML markups and server side expressions and improves readability a lot.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Have a look at the following codes:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;@if(IsPost) {&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; You submitted data at &amp;lt;b&amp;gt;@DateTime.Now&amp;lt;/b&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt; &lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Today is @DateTime.Now and system welcomes you&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The basic rule is, you start any server side expression with @, and, you don't need to end it. All of the other programmatic syntax should be there as they should be, like, if you open the curly brace "{", you need to close it "}".&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@*  A one-line code comment. *@&lt;br /&gt;&lt;br /&gt;@*  This is a multiline code comment.     &lt;br /&gt;It can continue for any number of lines. &lt;br /&gt;*@&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;The @Href method&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For resolving correct relative paths for resources in HTML, the @Href method is your good friend. The WebPage object (The current object of the page, equivalent to the Page object in WebForms) has this handy method, which could be used as follows to resolve correct relative paths:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;link href="@Href("~/Styles/Site.css")" rel="stylesheet" /&amp;gt;&lt;br /&gt;&amp;lt;link href="@Href("~/favicon.ico")" rel="shortcut icon" type="image/x-icon" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Including another page using &lt;/b&gt;&lt;/span&gt;&lt;span class="pln" style="font-size: large;"&gt;&lt;b&gt;@RenderPage()&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The layout pages contain a &lt;/span&gt;&lt;span class="pln" style="font-size: small;"&gt;@RenderBody()&amp;nbsp; method, which is replaced by the content of a child page at run-time. Using the layout page thus gives a way to have consistent look of the entire site.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="pln" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="pln" style="font-size: small;"&gt;Much like the @RenderBody(), there is another way you can include the output of an another page in an existing page. The&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span class="pln" style="font-size: small;"&gt;&lt;b&gt;@RenderPage(PageName) &lt;/b&gt;method allows such facility. For example, a layout page could have a @RenderPage(PageName) to include the output of another page in it. It works much like adding a User Control in an aspx page.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="pln" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="pln" style="font-size: small;"&gt;_SiteLayout.cshtml&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt; Title &amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href="@Href("/Styles/Site.css")" rel="stylesheet" type="text/css" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @RenderPage("/_Header.cshtml")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="main"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @RenderBody()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="footer"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;copy; 2010 SmartAspects. All rights reserved.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Passing data to Layout page&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Passing data from the content page to Layout page is a very basic need. Pages in Razor has a PageData property which is used for this purpose. The following example shows passing Page title from the content page to the Layout page:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Layout Page:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;@PageData["Title"]&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Child Page&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;@{  &lt;br /&gt;  Layout = "~/_SiteLayout.cshtml";&lt;br /&gt;  PageData["Title"] = "User details page";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Helpers&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;A helper is a component that lets you accomplish a task using a single line of code. ASP.NET includes many built-in helpers which are ready to be used in cshtml files, such as the following, which displays data in Grid layout using the built-in WebGrid helper:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var db = Database.Open("DBConn") ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var query = "SELECT * FROM Product ORDER BY Id";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = db.Query(query );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var grid = new WebGrid(data);&lt;br /&gt;}&lt;br /&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Displaying Data Using the WebGrid Helper&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt; Products&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="grid"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @grid.GetHtml()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There are many built-in helpers which you could use to achieve several necessary functions and features. Some are as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;WebCache &lt;/b&gt;helper : Lets you using Caching in cshtml pages as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = WebCache.Get("Key");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (data == null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = "Test";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebCache.Set("Key", data, 1, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;FileUpload &lt;/b&gt;helper : Lets you upload single or multiple files&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;FileUpload - Multiple File Example&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form id="myForm" method="post"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enctype="multipart/form-data"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; action=""&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;File Upload - Multiple-File Example&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @if (!IsPost) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @FileUpload.GetHtml(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initialNumberOfFiles:5,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allowMoreFilesToBeAdded:true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; includeFormTag:true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addText:"Add another file",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uploadText:"Upload")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;Video &lt;/b&gt;helper : Lets you include a Video in the page&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Flash Video&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Video.Flash(path: "Media/sample.swf",&lt;br /&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; width: "400",&lt;br /&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; height: "600",&lt;br /&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; play: true,&lt;br /&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; loop: true,&lt;br /&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; menu:&amp;nbsp; false,&lt;br /&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; bgColor: "red",&lt;br /&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; quality: "medium",&lt;br /&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; scale: "exactfit",&lt;br /&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; windowMode: "transparent")&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;WebMail &lt;/b&gt;helper : Lets you send emails&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize WebMail helper&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.SmtpServer = "smtp.mydomain.com";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.SmtpPort = 25;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.EnableSsl = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.UserName = "user";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.From = "shubho@smartaspects.com";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.Password = "123456";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var mailBody = Utility.GetEmailBody();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send email&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebMail.Send(to: "user@example.com",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subject: "Newsletter for - " + customerName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; body: mailBody &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;b&amp;gt;Failed to send email.&amp;lt;/b&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;Bing &lt;/b&gt;helper : Lets you add a search functionality with Bing search engine&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bing.SiteUrl = "www.asp.net";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bing.SiteTitle = "ASP.NET Custom Search";&lt;br /&gt;}&lt;br /&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Bing Search Box&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Search the ASP.NET site: &amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Bing.SearchBox()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;Advanced Search&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Search the ASP.NET site: &amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Bing.AdvancedSearchBox(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boxWidth: "300px",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultWidth: 600,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultHeight: 900,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; themeColor: "Green",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; locale: "en-US")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;LinkShare &lt;/b&gt;helper.&lt;br /&gt;The &lt;b&gt;Twitter &lt;/b&gt;helper.&lt;br /&gt;The &lt;b&gt;Facebook &lt;/b&gt;helper.&lt;b&gt;&lt;br /&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;These let you add social network functionality in cshtml pages&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt; &lt;/b&gt;The &lt;b&gt;WebSecurity &lt;/b&gt;helper.&lt;br /&gt;The &lt;b&gt;SimpleMembership &lt;/b&gt;helper.&lt;br /&gt;The &lt;b&gt;ReCaptcha &lt;/b&gt;helper.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;These let you implement user registration and login functionality with Membership&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Custom helpers&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You also may want to create and use custom helpers in your application and use that helper across the pages for a consistent look and functions. Here is how you can do this:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. Add the App_Code folder in your web site&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. Create a new .cshtml file inside App_Code folder&amp;nbsp; and name it Helpers.cshtml.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. Replace the existing content with the following and save the file:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@helper BuildMessage(string user) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="message"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;strong&amp;gt;Hello&amp;lt;/strong&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp; @user!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once created, you can use the helper as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Helpers Page&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Helpers.BuildMessage("My test note content.")&lt;br /&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Further study&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Enjoyed Razor? Does it seem interesting? See &lt;a href="http://www.asp.net/webmatrix/tutorials/1-getting-started-with-webmatrix-and-asp-net-web-pages"&gt;http://www.asp.net/webmatrix/tutorials/1-getting-started-with-webmatrix-and-asp-net-web-pages&lt;/a&gt; for more detailed on Asp.net Razor and keep exploring, Razor is fun.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-4668478956616648425?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/aspnet-razor-basic-concepts.html' title='Say hello to Asp.net Razor web site. Part2 : Basic concepts'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/4668478956616648425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/aspnet-razor-basic-concepts.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/4668478956616648425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/4668478956616648425'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/aspnet-razor-basic-concepts.html' title='Say hello to Asp.net Razor web site. Part2 : Basic concepts'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-1740508580537368413</id><published>2011-03-28T09:28:00.000-07:00</published><updated>2011-08-25T22:14:10.606-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='_SiteLayout.cshtml'/><category scheme='http://www.blogger.com/atom/ns#' term='_AppStart.cshtml'/><category scheme='http://www.blogger.com/atom/ns#' term='Razor'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net Razor'/><title type='text'>Say hello to Asp.net Razor web site. Part1 : Introduction</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Asp.net MVC3 introduces a new View Engine "Razor", which greatly simplifies the creation of view components and improves productivity. Once you have installed MVC3 from &lt;a href="http://www.asp.net/mvc/mvc3"&gt;http://www.asp.net/mvc/mvc3&lt;/a&gt;, when you create an Asp.net MVC3 application using Visual Studio 2010, you are going to see a prompt like the following where you need to specify the View Engine (Either Aspx or Razor):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eIACgoHHd_M/TZCPO77QGFI/AAAAAAAAAPs/-jDoEsMpZIA/s1600/Razor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-eIACgoHHd_M/TZCPO77QGFI/AAAAAAAAAPs/-jDoEsMpZIA/s1600/Razor.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Specify View Enginge while creating an Asp.net MVC3 application&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Specifying "Razor" as the view engine results in creating an MVC application based on Razor view engine where the file extensions end up with .cshtml.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Interesting thing is, once you install Asp.net MVC3, you get a new template in Visual Studio to create an &lt;b&gt;Asp.net web site&lt;/b&gt; based on Razor view engine. Go to File-&amp;gt;New-&amp;gt;Web Site-&amp;gt;Asp.net Web Site(Razor) to add a Razor based Asp.net web site in Visual Studio:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sZ54f7E4IJg/TZCSHA2KmxI/AAAAAAAAAPw/gT-_0x9FRz8/s1600/RazorWebSite.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-sZ54f7E4IJg/TZCSHA2KmxI/AAAAAAAAAPw/gT-_0x9FRz8/s1600/RazorWebSite.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Adding an Asp.net Razor web site in Visual Studio&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Doing so would result in adding the following Web Site in Visual Studio, which is based on Razor view engine:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CK1_Y9tYvGo/TZCTdmzhSNI/AAAAAAAAAP0/FFsc0yLrFws/s1600/RazorSolutionExplorer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-CK1_Y9tYvGo/TZCTdmzhSNI/AAAAAAAAAP0/FFsc0yLrFws/s1600/RazorSolutionExplorer.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Asp.net Razor web site in Solution explorer&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Run the application using Visual Studio and you are likely to see the following output:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eqXAwQ1xLcU/TZCUzWr-fKI/AAAAAAAAAP4/WyUn0YbVU9g/s1600/RazorWebsiteOutput.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-eqXAwQ1xLcU/TZCUzWr-fKI/AAAAAAAAAP4/WyUn0YbVU9g/s1600/RazorWebsiteOutput.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Home page of Asp.net Razor web site&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Hm..seems good. Lets try to understand how this works!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Default.cshtml&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;First of all, there is no aspx in Razor, and, no server control, ascx or CodeBehind. All you see is some plain cshtml files all over the web site.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Open the Default.cshtml in Visual Studio (Which results in the above page output in browser) and you will see it contains the following markup:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pHsTsS3mII8/TZCYMMZBCgI/AAAAAAAAAP8/FVb-zPVKP5Y/s1600/Default.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-pHsTsS3mII8/TZCYMMZBCgI/AAAAAAAAAP8/FVb-zPVKP5Y/s1600/Default.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Default.cshtml Markup&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you can see, it contains some plain old basic HTML and some C# scripts written in some new syntax. Yes, you got it right. Razor introduces a new simple way of writing scripts in HTML, which basically could be thought of as a simplified version of writing scripts which we were used to write in Aspx markup.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Conventionally, we used to write scripts or expressions in aspx as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;% &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var date = DateTime.Now;&lt;br /&gt;%&amp;gt;&lt;br /&gt;Current date is : &amp;lt;%=date %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This expression becomes the following in Razor syntax:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var date = DateTime.Now;&lt;br /&gt;}&lt;br /&gt;Current date is : @date&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As a result, the markups in Razor view components (cshtml files) becomes a lot cleaner, saves a lot of key strokes for you and lets not forget this syntax is fully supported by Visual Studio intellisence. So, you are getting the best of both worlds.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Understanding _SiteLayout.cshtml&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Notice the markup of Default.cshtml and you will see it contains a very minimal amount of codes. Yet it results in a good amount of output in the browser. How is that possible?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, the answer is _SiteLayout.cshtml. It acts like what the MasterPage does in a Web Form application and it is used in a Razor web site to define a common layout across a group of pages (cshtml files).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In Razor, if you start a cshtml file name with an underscore (_), user cannot browse the file using URL request (It is prohibited internally). The layout files are files which are to be used as an internal purpose (To define the common layout of the pages) and hence, a layout file name should always start with an underscore (_), like the default layout file _SiteLayout.cshtml.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open the _SiteLayout.cshtml and you will see the following markups:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Hd_EJy6lMWA/TZCm8pCg41I/AAAAAAAAAQA/PMPtd3fWnmk/s1600/SiteLayout.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Hd_EJy6lMWA/TZCm8pCg41I/AAAAAAAAAQA/PMPtd3fWnmk/s1600/SiteLayout.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; _SiteLayout.cshtml makrup&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Notice, its just plain old basic HTML stuff along with some Razor expressions which start with @. Most importantly, notice the &lt;b&gt;@RenderBody()&lt;/b&gt; method call in Red box. At run time, the &lt;b&gt;@RenderBody()&lt;/b&gt; method call is replaced by the HTML markups defined in the child page (The page which includes this layout page).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, when the Default.cshtml is browsed, the &lt;b&gt;@RenderBody()&lt;/b&gt; method call is replaced by the HTML defined in Default.cshtml, which is nothing but the following simple HTML:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASP.NET Web Pages make it easy to build powerful .NET based applications for the web.&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, there is no restriction of name with the layout pages except the fact that, it should always start with an underscore(_). Name it as you like and everything should be alright as long as you include the layout page correctly in children pages as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Layout = "~/_MyLayoutPage.cshtml";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Understanding _AppStart.cshtml&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you need to run some initialization functionality when the application starts, _AppStart.cshtml is the place to do so. Unlike the layout pages, it has a standard name and you cannot rename it other than _AppStart.cshtml.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Open the _AppStart.cshtml and you would see the following markup:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BGmapzPqCzI/TZCweXjzFLI/AAAAAAAAAQE/zjrIsGqT4Gs/s1600/_AppStart.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-BGmapzPqCzI/TZCweXjzFLI/AAAAAAAAAQE/zjrIsGqT4Gs/s1600/_AppStart.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; _AppStart.cshtml markup&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Basically, it contains some codes to initialize the database when the application runs.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Others &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Expand the Accounts folder and you will see several other cshtml files implemented for User Login, Registration and other user account oriented functionality. All of these utilizes Razor syntax and use the built in helpers in Razor for rendering various UI elements or built in classes for implementing several functionality.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Like a conventional Asp.net web site, a Razor web site also can have Asp.net standard folders like the App_Data for holding database and other data sources, or, App_Codes for holding cs files. Similarly, the Razor web site can hold a reference to other class libraries to be able to invoke methods on those libraries to achieve desired functionality. Most importantly, it contains many rich built in "Helpers" which help rendering some common UI output and functionality (Like, Adding a Twitter feed, or, Social network bookmarks) which you would simply love to have!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;&lt;a href="http://www.shubho.net/2011/03/aspnet-razor-basic-concepts.html"&gt;next post&lt;/a&gt;&lt;/b&gt; is going to cover some of the detailed stuff of Razor and I hope you would find it helpful.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-1740508580537368413?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/say-hello-to-aspnet-razor-web-site.html' title='Say hello to Asp.net Razor web site. Part1 : Introduction'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/1740508580537368413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/say-hello-to-aspnet-razor-web-site.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/1740508580537368413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/1740508580537368413'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/say-hello-to-aspnet-razor-web-site.html' title='Say hello to Asp.net Razor web site. Part1 : Introduction'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-eIACgoHHd_M/TZCPO77QGFI/AAAAAAAAAPs/-jDoEsMpZIA/s72-c/Razor.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-6532612260082357167</id><published>2011-03-18T18:52:00.000-07:00</published><updated>2011-03-18T18:54:39.031-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='FieldTemplates'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Data'/><category scheme='http://www.blogger.com/atom/ns#' term='Customizing Dynamic Data'/><category scheme='http://www.blogger.com/atom/ns#' term='CustomPages'/><category scheme='http://www.blogger.com/atom/ns#' term='PageTemplates'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='EntityTemplates'/><title type='text'>Dynamic Data in Asp.net 4.0. Part3 : Customizing Dynamic Data application</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is the 3rd and last part of the article on Asp.net Dynamic Data and in this part we are going to learn how to customize a Dynamic Data application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.shubho.net/2011/03/understanding-dynamic-data-application.html"&gt;The previous post&lt;/a&gt;&lt;/b&gt; explains the details of a Dynamic Data application and introduces it's building blocks. Once you go through that post, you will understand how a Dynamic Data application works and this is important to learn how to customize it.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Dynamic Data lets you quickly build a data driven Asp.net application that lets you perform the CRUD functionality along with the listing and details pages without writing almost a single line of code! But, in a real worl'ds application, the CRUD (Plus listing and details pages) functionality is not enough, and, most of the cases you would need to build custom-designed pages with many other customized functionality. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;One of the cool features of Dynamic Data is, it lets you easily customize the functionality at each granular level, and, there is no alien codes to customize (Unlike most other code generation framework). Customizing a Dynamic Data application is too easy once you understand how it works.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Lets start customizing it!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Scaffolding only particular tables instead of all&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Find the following piece of codes in the Global.asax&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;DefaultModel.RegisterContext(typeof(DynamicDataEntities), &lt;br /&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; new ContextConfiguration() { ScaffoldAllTables = true });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Specifying &lt;b&gt;ScaffoldAlltables = true&lt;/b&gt;&amp;nbsp; in the above code instructs the Dynamic Data engine to generate codes for all tables in the data source (Be it an Entity framework data source or a Linq data source). Most of the cases this is not desired and we need some mechanism to scaffold only the tables we woul like.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To do this, perform the following steps:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Specify&lt;b&gt; ScaffoldAllTables = false&lt;/b&gt; (Which is the default).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Let's assume the following three tables are included in the Entity (Or  Linq) data context and we would like only to scaffold Employee and  Address tables.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-c_wu-YaG4PA/TYM-MQTFmvI/AAAAAAAAAOw/sT-sw9tnnTs/s1600/EntityModel.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-c_wu-YaG4PA/TYM-MQTFmvI/AAAAAAAAAOw/sT-sw9tnnTs/s1600/EntityModel.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Entity Model&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Add a cs file (Say, Entity.cs) in the Dynamic Data project, write two partial classes for the Employee and Address table and specify the ScaffoldTable(true) attribute for each of the classes as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;[ScaffoldTable(true)]&lt;br /&gt;public partial class Address&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[ScaffoldTable(true)]&lt;br /&gt;public partial class Employee&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Build and run the project. You would see that, only Employee and Address table has been included now in the Dynamic Data application and the other (Department) table is ignored:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-F12D3l5Sz3s/TYNCmhuN_kI/AAAAAAAAAO0/KXri98jHfM8/s1600/ScaffoldSelectedTables.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-F12D3l5Sz3s/TYNCmhuN_kI/AAAAAAAAAO0/KXri98jHfM8/s1600/ScaffoldSelectedTables.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Output after scaffolding only selected tables&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Customizing display for individual fields&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you may already know, the "FieldTemplates" folder contains templates (In the form of User Controls) for most common data types. So, customizing these templates would result in a global change for the corresponding data types.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For example, the Text.ascx contains the following markup for displaying a text field:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:Literal runat="server" ID="Literal1" Text="&amp;lt;%# FieldValueString %&amp;gt;"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you want to display all the text fields in Green color, you can replace the above markup with the following (Assuming that you added a css class "GreenText" in the Site.css and set color : Green):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:Label runat="server" ID="Literal1" Text="&amp;lt;%# FieldValueString %&amp;gt;" CssClass="GreenText"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;After doing the change, browse the application and go to the listing page of any table. You would see the text fields all turned into green:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-xRXuKWMtVOw/TYNOcu1NfBI/AAAAAAAAAO4/8FCi5VUb7SA/s1600/GreenText.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-xRXuKWMtVOw/TYNOcu1NfBI/AAAAAAAAAO4/8FCi5VUb7SA/s1600/GreenText.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customizing text field display&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you go to any other page, you would see the text color turned into green. That's some power! So now you have the field templates, and you know how to customize those to make any global change in your application. Its all yours!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Customizing display for a table data&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The "EntityTemplates" folder contains the following three templates (In the form of User Controls) which determine how to display each column value of data for a particular table in Display, Edit and Insert mode.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-hmburMSWf20/TYNQkK7yaZI/AAAAAAAAAO8/2dAqZdCX_uo/s1600/EntityTemplates.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-hmburMSWf20/TYNQkK7yaZI/AAAAAAAAAO8/2dAqZdCX_uo/s1600/EntityTemplates.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; EntityTemplates&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, changing the templates inside this folder results in changing the display of the column values for a particular table.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As an experiment, lets do a little change in the \EntityTemplates\Default.ascx like the following (Add the class="LightGrayBackground", along with adding the class LightGrayBackground in the Site.css with setting a light gray background-color):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-D2dYGwsftxA/TYNVr9G2kCI/AAAAAAAAAPA/UE59jSd7vYU/s1600/CustomizeEntityTemplate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-D2dYGwsftxA/TYNVr9G2kCI/AAAAAAAAAPA/UE59jSd7vYU/s1600/CustomizeEntityTemplate.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customizing Entity template&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;After doing so, run the aplication and go to the View Details page for a particular data of a table. You would see that, the background color of each cell is changed:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-EIwr_LJoVX0/TYNXRmpTjCI/AAAAAAAAAPE/uRy9e9E-qTo/s1600/LightGrayBackground.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-EIwr_LJoVX0/TYNXRmpTjCI/AAAAAAAAAPE/uRy9e9E-qTo/s1600/LightGrayBackground.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Output of a change in EntityTemplates&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Similarly, you can customize the Default_Edit.aspx and Default_Insert.aspx to customize the layout and functionality of Edit and Insert view for the column values. Like the FieldTemplates, customizeing the EntityTemplates lets you make global changes from a single point.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Customizing pages&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The "PageTemplates" folder contains the page templates, which are as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/--xK0h9h8AOg/TYNYXcRY-aI/AAAAAAAAAPI/FUd7-x4qdWM/s1600/PageTemplates.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/--xK0h9h8AOg/TYNYXcRY-aI/AAAAAAAAAPI/FUd7-x4qdWM/s1600/PageTemplates.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Figure :&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt; Page Templates&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you know already, doing any change in any of these page templates (And their corresponding code behind classes) would result in change of display and functions in the corresponding pages.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For demonstration, just do a minor change in the Details.aspx as follows (Append the text in Red border):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-R2m616vVGTo/TYNZcKzi2TI/AAAAAAAAAPM/yhin_9b3cEo/s1600/CustomizePageTemplate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-R2m616vVGTo/TYNZcKzi2TI/AAAAAAAAAPM/yhin_9b3cEo/s1600/CustomizePageTemplate.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customize Details.aspx PageTemplate&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Run the application and as you expected, when the details page is viewd for a particular data in a Table, the output would be now changed as follows :&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-KEg73hHPwpk/TYNaP7xomHI/AAAAAAAAAPQ/A9iO_TjzxFc/s1600/CustomizePageTemplateOutput.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-KEg73hHPwpk/TYNaP7xomHI/AAAAAAAAAPQ/A9iO_TjzxFc/s1600/CustomizePageTemplateOutput.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Change in output after customizing Details.aspx&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Like the FieldTemplates and EntityTemplates, doing any change in the PageTemplates also results in a global change for all tables in the application.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Using a customized page for a particular table&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The aspx files in the PageTemplates folder are globally used by all tables. For example, the PageTemplates\Details.aspx is used to show the details page for a particular data for all of the tables. So, any customization done in these aspx files result in the corresponding change getting effected for all tables. This might not be desirable in case we need to have a specialized page for a particular table.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Fortunately, it is very easy to create a specific customized page for any particular table in Dynamic Data application. All you need is to create a folder within the "CustomPages" folder and name the folder same as the target Table name.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For example, if we want to create a customized details page for Address data, we would need to create the Details.aspx within the "Addresses" folder inside "CustomPages" folder as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-bZzRKYQqo9M/TYOJMk-uxkI/AAAAAAAAAPY/MzJoBLYtBs8/s1600/CustomPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-bZzRKYQqo9M/TYOJMk-uxkI/AAAAAAAAAPY/MzJoBLYtBs8/s1600/CustomPage.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customized details page for Addresses table&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For simplicy, lets copy the contents of aspx markup and codes from code behind class from PageTemplates\Details.aspx and paste onto CustomPages\Addresses\details.aspx and customize the markup of CustomPages\Addresses\details.aspx as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-fN56yqRRGE4/TYOK2tpuglI/AAAAAAAAAPc/s5HWXB898LE/s1600/CustomizedForAddressTable.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-fN56yqRRGE4/TYOK2tpuglI/AAAAAAAAAPc/s5HWXB898LE/s1600/CustomizedForAddressTable.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customize Details.aspx for Addresses table&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Build and run the application and go to the details page of a data in Addresses table. You would see an output like the following:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-ORqtEYp5gGg/TYOL1WstuEI/AAAAAAAAAPg/HgyiT5cg_JA/s1600/CustomizedForAddressTableOutput.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-ORqtEYp5gGg/TYOL1WstuEI/AAAAAAAAAPg/HgyiT5cg_JA/s1600/CustomizedForAddressTableOutput.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Custmized details page output for a specific table&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Similarly, you can customize the other pages also for a particular table (Say, Insert.aspx, List.aspx, Edit.aspx etc) using the same approach.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Using a customized EntityTemplate (Details view) for a specific table&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Like the custom pages, it is possible to define customized EntityTemplates for a particular table to display column values for a particular table. For this, you need to create templates (In the form of user controls) within the EntityTemplates folder as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-qXWQ5kHJru8/TYOQg3fKO8I/AAAAAAAAAPk/RwxE44l9BGE/s1600/CustomizedEntityTemplateFiles.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-qXWQ5kHJru8/TYOQg3fKO8I/AAAAAAAAAPk/RwxE44l9BGE/s1600/CustomizedEntityTemplateFiles.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customized EntityTemplate files for Addresses table&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;That is, you need to copy the existing EntityTemplate files and replace the word "Default" with the corresponding table name (In this cases, Addresses). Once done, customize the files as you like and see the outputs in Details/Edit and Insert views.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Using a customized field output for a particular table&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Most of the cases, you would want to have the same look &amp;amp; feel and functionality for particular data types in your application. But, in some particular case, you might want to have customized look &amp;amp; feel or functionality for a particular data type for a particular table. For example, you may want to display textual field values with a border when the data in Addresses table is viewed. You need to perform the following steps to do this:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. Copy the Text.ascx and create a new user control (Say, Address.ascx) and customize the User Control's markup as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;%@ Control Language="C#" AutoEventWireup="true"&lt;br /&gt;CodeBehind="Address.ascx.cs" Inherits="WebApplication2.DynamicData.FieldTemplates.Address" %&amp;gt;&lt;br /&gt;&amp;lt;asp:Label runat="server" ID="Literal1" Text="&amp;lt;%# FieldValueString %&amp;gt;"&lt;br /&gt;style="border:1px solid black" /&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. Create a partial class for Addresses table (If it is not there already) with a MetaData class and specify the UIHint attribute as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;[ScaffoldTable(true)]&lt;br /&gt;[MetadataType(typeof(AddressMetadata))]&lt;br /&gt;public partial class Address&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public partial class AddressMetadata&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [UIHint("Address")] //UIHint(User Control's name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string AddressName;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;After doing the above, build the application and you will see a border around the Address data as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-ERXGhdC_FrQ/TYOWUsNW6aI/AAAAAAAAAPo/tE2vMAW2kx0/s1600/CustomizedFieldOutputForTable.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-ERXGhdC_FrQ/TYOWUsNW6aI/AAAAAAAAAPo/tE2vMAW2kx0/s1600/CustomizedFieldOutputForTable.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Customize field output for table&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Notice that, the borders are displayed only when the "Addresses" pages are being viewed. for any other tables, no border is going to be displayed.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, these are the basic customizations you might want to know about a Dynamic Data application. While building a real world application, you might learn and discover newer customzation needs and once you are used to the basic stuffs, it won't be hard for you to do those customizations. Feel free to explore the customizations and enjoy Dynamic Data.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-6532612260082357167?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/customizing-dynamic-data-application.html' title='Dynamic Data in Asp.net 4.0. Part3 : Customizing Dynamic Data application'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/6532612260082357167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/customizing-dynamic-data-application.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/6532612260082357167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/6532612260082357167'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/customizing-dynamic-data-application.html' title='Dynamic Data in Asp.net 4.0. Part3 : Customizing Dynamic Data application'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-c_wu-YaG4PA/TYM-MQTFmvI/AAAAAAAAAOw/sT-sw9tnnTs/s72-c/EntityModel.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-7381653918384017033</id><published>2011-03-16T18:53:00.000-07:00</published><updated>2011-03-18T19:09:44.794-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Data'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Dynamic Data in Asp.net 4.0. Part2 :Understanding the Application project and its internal building blocks</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.shubho.net/2011/03/introducing-dynamic-data-aspnet-40.html"&gt;In the previous post&lt;/a&gt;&lt;/b&gt;, we learned how to create an Asp.net Dynamic Data web application project using Visual Studio 2010 and utilize it's power to generate a CRUD application for all tables in a database. In this post we would try to understand the Dynamic Data application project structure and its internal building blocks, which would help us to customize the application later, to suit the requirement of a real world application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;When a Dynamic Data application porject is being opened in the Visual Studio 2010, it will be shown as follows in the solution explorer:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-Xi9F-9vVFdY/TYDaH_5FcWI/AAAAAAAAAOE/H2Bt24FtdsQ/s1600/DynamicDataSolution.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-Xi9F-9vVFdY/TYDaH_5FcWI/AAAAAAAAAOE/H2Bt24FtdsQ/s1600/DynamicDataSolution.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Dynamic Data application project in Solution Explorer&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Except the Model1.edmx (Which has been added later as Entity data model), all other files and folders are initially created by the Visual Studio. Let's try to understand the project structure and the files/folders in this solution.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Global.asax&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Global.asax file contains the initialization codes for the Dynamic Data application and the codes are executed when the Application starts. Basically, it initializes the Data model for the application (The Entity data model in this case) using the following piece of code:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;DefaultModel.RegisterContext(typeof(YourDataContextType), &lt;br /&gt;new ContextConfiguration() { ScaffoldAllTables &lt;b&gt;= &lt;/b&gt;false });&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Entity context class name is to be provided in place of &lt;b&gt;YourDataContextType &lt;/b&gt;(In our example, which would be &lt;b&gt;DynamicDataEntities&lt;/b&gt;) and the &lt;b&gt;ScaffoldAllTables = true&lt;/b&gt; has to be set in order to make sure that the Dynamic Data engine generates CRUD functionality for all tables in the Entity context. It is however possible to specify not to sfaffold all tables by keeping &lt;b&gt;ScaffoldAlltables = false&lt;/b&gt; and doing customization so that sfaffolding applies on individual table levels only. But, for now, let's keept it simple as the customization options will be discussed in the next part of the posts.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Along with Scaffolding, the routing rule is configured in Global.asax as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;routes.Add(new DynamicDataRoute("{table}/{action}.aspx")&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert"}),&lt;br /&gt;&amp;nbsp;&amp;nbsp; Model = DefaultModel&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The above code specifies that, the URL patterns for the Dynamic Data application would be of the form &lt;b&gt;"{table}/{action}.aspx"&lt;/b&gt; (Say, Department/Edit.aspx, or, Department/Details.aspx), and, the corresponding actions would be either "List"or "Details" or "Edit" or "Insert" for the URLs. It also sets the current Data model (&lt;b&gt;Model = DefaultModel&lt;/b&gt;) to which the routing would be applied.&lt;/span&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Default.aspx&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It is the default page which lists the tables using a GridView and renders each Table using a Hyperlink. &lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-UelYXJCgdyo/TYDjOuAq3iI/AAAAAAAAAOI/xGJ4gqozuwE/s1600/DynamicDataSite.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-UelYXJCgdyo/TYDjOuAq3iI/AAAAAAAAAOI/xGJ4gqozuwE/s1600/DynamicDataSite.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Table listing in Default page&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open the Default.aspx and you would see the following code:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-n23C5cQrjTk/TYDp2LOx9nI/AAAAAAAAAOM/X20CytDDJyM/s1600/DynamicHyperLink.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="122" src="https://lh6.googleusercontent.com/-n23C5cQrjTk/TYDp2LOx9nI/AAAAAAAAAOM/X20CytDDJyM/s640/DynamicHyperLink.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; DynamicHyperLink&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you probably figured out, in the Default.aspx, the Tables are bound to the GridView's DataSource, and, that results in displaying table names using hyperlinks, which are generated by the &lt;b&gt;&amp;lt;asp:DynamicHyperLink/&amp;gt;&lt;/b&gt; control inside the &amp;lt;ItemTemplate&amp;gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;&amp;lt;asp:DynamicHyperLink/&amp;gt; &lt;/b&gt;is a Server control which is used in Dynamic Data application to display links for different actions such as edit, delete, and insert. The &lt;b&gt;&amp;lt;asp:DynamicHyperLink/&amp;gt; &lt;/b&gt;has a "&lt;b&gt;Action&lt;/b&gt;" property which could be set either of the values "Details" or "Edit" or "Insert" or "List" and if this property value is not set, by default, "List" is assumed. So, the following URLs are rendered by the DynamicHyperLink control for the above codes in Default.aspx (Using the format {table}/{action}.aspx):&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;/Addresses/List.aspx&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;/Departments/List.aspx&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;/Employees/List.aspx&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Just to understand a bit more, had we set Action = "Details", then the Table names would have been rendered using the following hyperlinks (Which is of course, not applicable here):&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;/Addresses/Details.aspx&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;/Departments/Details.aspx&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;/Employees/Details.aspx&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;DynamicData\&lt;/b&gt;&lt;b&gt;PageTemplates&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The "PageTemplates" folder contains the templates for the pages for the following actions:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Details (Details.aspx) : For showing details for a particular row in a table&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Edit (Edit.aspx) : For showing a particular row in a table in edit mode &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Insert (Insert.aspx) : For inserting a row for a table&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;List (List.aspx) : For listing a table data&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;ListDetails (ListDetails.aspx) : For listing a table data along with displaying detailed data for a particular row&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-88JSFCKdS8E/TYFfEoJ7PdI/AAAAAAAAAOc/GCh0_090Nt4/s1600/PageTemplates.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-88JSFCKdS8E/TYFfEoJ7PdI/AAAAAAAAAOc/GCh0_090Nt4/s1600/PageTemplates.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; PageTemplates in Dynamic Data application&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open Details.aspx and you will see that the aspx markup mainly contains following code:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-m5Wp_jwmpCk/TYDwhnawccI/AAAAAAAAAOQ/uolC3LPBbeU/s1600/DynamicEntity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://lh3.googleusercontent.com/-m5Wp_jwmpCk/TYDwhnawccI/AAAAAAAAAOQ/uolC3LPBbeU/s640/DynamicEntity.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Codes in Details.aspx&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Notice the &lt;b&gt;DynamicEntity &lt;/b&gt;server control. This control is a place holder control used to load a particular control from the &lt;b&gt;DynamicData\EntityTemplates&lt;/b&gt;&lt;/span&gt; folder.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, the &lt;b&gt;DynamicData\EntityTemplates&lt;/b&gt; folder contains the following three user controls:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Default.ascx&lt;/b&gt;&amp;nbsp; : Displays the columns values for a particular row in current table &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Default_Edit.ascx&lt;/b&gt; : Displays the columns values for a particular row in current table in Edit mode. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Default_Insert.ascx&lt;/b&gt; : Displays input fields for a particular row in current table.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;When &amp;lt;asp:DynamicEntity runat="server" /&amp;gt; is used in the Details.aspx, it is replaced by the user control \EntityTemplates\Default.ascx at run time. Similarly, when &amp;lt;asp:DynamicEntity runat="server" Mode="Edit" /&amp;gt; is used in Edit.aspx, it is replaced by the \EntityTemplates\Default_Edit.ascx and when &amp;lt;asp:DynamicEntity runat="server" Mode="Edit" /&amp;gt; is used in  Edit.aspx, it is replaced by the \EntityTemplates\Default_Insert.ascx.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, when a particular Page template is executed, in place of the &amp;lt;asp:DynamicEntity/&amp;gt; controls, a particular EntityTemplate controls gets executed for each of the row in the current Table.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;DynamicData\&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;EntityTemplates&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As said already, this folder contains three user controls to display column values for a row in a Table in three different modes : Display, Edit and Insert.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-YNTeTJ-doyI/TYFfpVyUPHI/AAAAAAAAAOg/m4NaGHVDYFU/s1600/EntityTemplates.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-YNTeTJ-doyI/TYFfpVyUPHI/AAAAAAAAAOg/m4NaGHVDYFU/s1600/EntityTemplates.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; EntityTemplates in Dynamic Data application&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;At runtime, either of these three user control replaces the &lt;b&gt;&amp;lt;asp:DynamicEntity/&amp;gt;&lt;/b&gt; control in the Page template depending upon the Mode property value.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open the &lt;b&gt;Default.ascx&lt;/b&gt; and you will see the following markup&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-ZkLV8FDCEBQ/TYD-M6bg7EI/AAAAAAAAAOU/gmLcDH7GjP8/s1600/EntityTemplate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="198" src="https://lh4.googleusercontent.com/-ZkLV8FDCEBQ/TYD-M6bg7EI/AAAAAAAAAOU/gmLcDH7GjP8/s640/EntityTemplate.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; EntityTemplate Markup&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The CodeBehind of this user control populates the column values for a particular row in the current table using the following code:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;protected override void OnLoad(EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (MetaColumn column in Table.GetScaffoldColumns(Mode, ContainerType))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentColumn = column;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Control item = new _NamingContainer();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityTemplate1.ItemTemplate.InstantiateIn(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityTemplate1.Controls.Add(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, while populating the column values for a particular row, it needs to render an appropriate control based upon the type of the column value (Say, if the column value is of a Boolean type, it should be rendered using a CheckBox, or, if the column value is of a Text type, it should be rendered using a TextBox). The EntityTemplate uses a specialized control &amp;lt;asp:DynamicControl/&amp;gt; (Mark in red above) to dynamically render an appropriate control based upon the column type of the table.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &amp;lt;asp:DynamicControl/&amp;gt; control has a property "Mode" which could have either of the three values "Edit" "Insert" and "ReadOnly". In the Default.ascx, the "Mode" property value is not specified. On the other hand, in the Default_Edit.ascx, the "Mode" property value is set to "Edit" and in the Default_Insert.ascx, the "Mode" property value is set to "Insert" to insertuct the Dynamic Data runtime that the corresponding controls should be rendered in appropriate mode depending upon the Page (In Details.aspx, a text data should be displayed using a Label, and, in Edit.aspx, a text data should be displayed using a TextBox.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The good news is, you can decide what exact control to render for each particular column type in "Insert" "Edit" and "ReadOnly" mode. The user controls inside the FieldTemplates folder let you do this.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;DynamicData\&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;FieldTemplates&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This folder contains some tiny user controls as templates to configure what specific control to render for each specific data type in "Insert" "Edit" and "ReadOnly" mode.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-senALR8mh6E/TYFeXIzHH1I/AAAAAAAAAOY/fotPGhm-XlU/s1600/FieldTamplates.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-senALR8mh6E/TYFeXIzHH1I/AAAAAAAAAOY/fotPGhm-XlU/s1600/FieldTamplates.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; FieldTemplates in Dynamic Data application &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;At runtime, the &lt;b&gt;&amp;lt;asp:DynamicControl/&amp;gt;&lt;/b&gt; controls are replaced by one of the user controls within the FieldTemplates folder and the specific user control is chosen based upon the data type of the column and the Mode property value of the &amp;lt;asp:DynamicControl/&amp;gt; control. For example:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Text.ascx : This user control template is used to replace the DynamicControl for columns of type varchar/text for readonly mode. It has the following markup:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:Literal runat="server" ID="Literal1" Text="&amp;lt;%# FieldValueString %&amp;gt;" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Text_Edit.ascx&lt;/b&gt; : This user control template is used to replace the DynamicControl for columns of type varchar/text for edit mode. It has the following markup:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:RequiredFieldValidator runat="server"  ID="RequiredFieldValidator1" CssClass="DDControl DDValidator"  &lt;br /&gt;ControlToValidate="TextBox1" Display="Static" Enabled="false" /&amp;gt;&lt;br /&gt;&amp;lt;asp:RegularExpressionValidator runat="server"  ID="RegularExpressionValidator1" CssClass="DDControl DDValidator"  &lt;br /&gt;ControlToValidate="TextBox1" Display="Static" Enabled="false" /&amp;gt;&lt;br /&gt;&amp;lt;asp:DynamicValidator runat="server" ID="DynamicValidator1"  CssClass="DDControl DDValidator" &lt;br /&gt;ControlToValidate="TextBox1"  Display="Static" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;DynamicData\&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Filters&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There is a &lt;b&gt;Filters &lt;/b&gt;folder which contains three user controls (Templates) for displaying filter options for each individual rows in the listing page.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-1qU2whfuoaE/TYFhrYl9yXI/AAAAAAAAAOk/NInTOw1E5s4/s1600/Filters.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-1qU2whfuoaE/TYFhrYl9yXI/AAAAAAAAAOk/NInTOw1E5s4/s1600/Filters.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure &lt;/b&gt;: Filters&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you open the List.aspx page template you would see an &lt;b&gt;&amp;lt;asp:DynamicFilter&amp;gt;&lt;/b&gt; controls is being used there as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-wfco3WU9HA8/TYFjQr8GHvI/AAAAAAAAAOo/Cc6jGF2wCJA/s1600/DynamicFilter.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="80" src="https://lh6.googleusercontent.com/-wfco3WU9HA8/TYFjQr8GHvI/AAAAAAAAAOo/Cc6jGF2wCJA/s640/DynamicFilter.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; DynamicFilter control&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;&lt;span class="selflink"&gt;&amp;lt;asp:DynamicFilter&lt;/span&gt;/&amp;gt;&lt;/b&gt; control is  used in the page markup to generate the UI for filtering table rows.  Dynamic Data creates the UI by using the default filter templates that  are in the \DynamicData\Filters folder. These templates support  foreign-key, Boolean, and enumeration column types.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;When the List.aspx page is viewed for a particular table, the Filter user controls are executed to render to filter the listing data as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-5d7zJdfVLZs/TYFkSpzFXZI/AAAAAAAAAOs/2yAKMsFNyyE/s1600/FilteringInUI.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-5d7zJdfVLZs/TYFkSpzFXZI/AAAAAAAAAOs/2yAKMsFNyyE/s1600/FilteringInUI.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Filtering data in List.aspx&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Others&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;DynamicData\Content&lt;/b&gt; folder contains the resources and contents that are to be used by the tamplates. Initially this folder contains a Pager template (GridViewPager.ascx) to be used as the pagination template for the GridViews in the List.aspx, and, an "image" folder containing some images.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The &lt;b&gt;CustomPages&lt;/b&gt; folder is initially empty. This folder would contain any custom page template that we might need to create for a particular table if we want.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Hope, this post was helpful to understand the building blocks of a Dynamic Data application project, and also to learn how the application works. The next post is going to cover the customizations options that you might need to do when you would want to use Dynamic Data for your next Asp.net application project.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.shubho.net/2011/03/customizing-dynamic-data-application.html"&gt;Click here&lt;/a&gt;&lt;/b&gt; to learn how to customize a Dynamic Data application.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-7381653918384017033?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/understanding-dynamic-data-application.html' title='Dynamic Data in Asp.net 4.0. Part2 :Understanding the Application project and its internal building blocks'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/7381653918384017033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/understanding-dynamic-data-application.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/7381653918384017033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/7381653918384017033'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/understanding-dynamic-data-application.html' title='Dynamic Data in Asp.net 4.0. Part2 :Understanding the Application project and its internal building blocks'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-Xi9F-9vVFdY/TYDaH_5FcWI/AAAAAAAAAOE/H2Bt24FtdsQ/s72-c/DynamicDataSolution.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-289209584562136481</id><published>2011-03-15T08:25:00.000-07:00</published><updated>2011-03-16T19:05:02.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Data'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Dynamic Data in Asp.net 4.0. Part1 : Introduction</title><content type='html'>&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Dynamic Data in Asp.net was first introduced in .NET 3.5 SP1, and later was improved in Asp.net 4.0. For those who were longing for a RAD (Rapid Application Development) platform in Asp.net, Dynamic Data was a real good news for them. It provides a framework to quickly develop a Data Driven Asp.net application by generating CRUD functionality for the database tables. But, if you want to consider Dynamic Data as just another Code Generator tool, you are completely wrong. Generation of codes is just a part of the Dynamic Data framework. What makes it different? Well, unlike most other code generation frameworks, the framework allowes you to utilize the powerful Dynamic Data features without using the code generation based on database tables (scaffolding) at all! Most importantly, the Dynamic Data framework is so elegantly designed that its really easy for you to customize the framework generated codes at each granular level and this makes it really valuable and effective to be considered as a RAD framework to build your next Asp.net application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In this Part1 of the article on Dynamic Data in Asp.net, I'll cover the basics and then will eventually cover the customizations which you might need to know when developing real applications.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Here we go.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Creating a Dynamic Data Application project&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Assuming you are using Visual Studio 2010, go to &lt;b&gt;File-&amp;gt;New project-&amp;gt;Asp.net Dynamic Data Entities Web Application&lt;/b&gt; (If you want to develop a Dynamic Data application based on Entity framework) or &lt;b&gt;File-&amp;gt;New project-&amp;gt;Asp.net Dynamic Data Linq to SQL Web Application&lt;/b&gt; (If you want to develop a Dynamic Data application based on Linq to SQL) and click "OK" to let Visual Studio create the project.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-8MiLOaqnYik/TX9x35eIxeI/AAAAAAAAANM/aR46Q26eoNI/s1600/NewDynamicDataProject.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-8MiLOaqnYik/TX9x35eIxeI/AAAAAAAAANM/aR46Q26eoNI/s1600/NewDynamicDataProject.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Add new dynamic data project&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once the project is created, it will be shown in the solution explorer as below:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-7vvcWa5o6Bs/TX9z0ilBl3I/AAAAAAAAANU/cu7GOIKCrQM/s1600/DynamicDataSolution.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-7vvcWa5o6Bs/TX9z0ilBl3I/AAAAAAAAANU/cu7GOIKCrQM/s1600/DynamicDataSolution.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Dynamic Data project in Solution Explorer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Running a Dynamic Data Project&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;As Dynamic Data is a Data driven Asp.net application, it cannot be run unless we configure the data source for the application project.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Follow these steps to execute a "Hello world" run of the Dynamic Data application.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Right click on the project and Add an "ADO.NET Entity Data Model" to launch the wizerd to configure the Entity data model and specify inputs in each step until Finish.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-F9YgYW45-Qo/TX92zbhHIAI/AAAAAAAAANY/oNsDrsNgcII/s1600/AddEntityModel.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-F9YgYW45-Qo/TX92zbhHIAI/AAAAAAAAANY/oNsDrsNgcII/s1600/AddEntityModel.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Add ADO.NET Entity Data Model&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-6x4eD-L_mY8/TX93QoQ4YzI/AAAAAAAAANc/c6XqkSiP7Dk/s1600/ChooseModelcontents.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-6x4eD-L_mY8/TX93QoQ4YzI/AAAAAAAAANc/c6XqkSiP7Dk/s1600/ChooseModelcontents.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Choose Data Model&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-YaJYxTcSRnc/TX94JRGKKlI/AAAAAAAAANg/CjDHlb306Us/s1600/ChooseDatabase.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-YaJYxTcSRnc/TX94JRGKKlI/AAAAAAAAANg/CjDHlb306Us/s1600/ChooseDatabase.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Choose Database&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-tgrxmhoh9u0/TX95JcErj9I/AAAAAAAAANk/qH_FWkrmQME/s1600/ChooseDatabaseOjects.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-tgrxmhoh9u0/TX95JcErj9I/AAAAAAAAANk/qH_FWkrmQME/s1600/ChooseDatabaseOjects.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Choose Database objects (Tables)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once done, the Entity Model will be added in the solution and it will be displayed in the designer view and in the solution explorer.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-AhAMfQjoFu4/TX96ONXnKfI/AAAAAAAAANo/uTrO4IjHq80/s1600/EntifyModel.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-AhAMfQjoFu4/TX96ONXnKfI/AAAAAAAAANo/uTrO4IjHq80/s1600/EntifyModel.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; An Entity data model&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-1-Z0BkihuDs/TX97KlD-AlI/AAAAAAAAANs/D5C42TxTKac/s1600/EntityModelCodeFile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-1-Z0BkihuDs/TX97KlD-AlI/AAAAAAAAANs/D5C42TxTKac/s1600/EntityModelCodeFile.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Entity Model in Solution Explorer&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Double click on the Designer.cs file of the Entity Model (edmx) to open the corresponding Code file and expand the region "Context" to find the Entity context class name.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-ldk9gkQPU_U/TX98Kk6U5KI/AAAAAAAAANw/CTAWSBji_7o/s1600/CodeFileClassName.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-ldk9gkQPU_U/TX98Kk6U5KI/AAAAAAAAANw/CTAWSBji_7o/s1600/CodeFileClassName.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; EntityContext class&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Copy the class name (The class which inherits the ObjectContext class) for the Entity context and open the Global.asax in the Visual Studio editor to register and configure the Dynamic Data with the Entity context class.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To configure, uncomment the following line in the Global.asax (Which is commented out by default , and paste the Entity context class name (&lt;b&gt;DynamicDataEntities &lt;/b&gt;in this example) within the typeof() operation (The first red box)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-UPCe14hvhJA/TX9_KRM22oI/AAAAAAAAAN4/xk-n8RaiDwg/s1600/ScaffoldAllTables.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-UPCe14hvhJA/TX9_KRM22oI/AAAAAAAAAN4/xk-n8RaiDwg/s1600/ScaffoldAllTables.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Configure the Entity Context with Dynamic Data&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Also, specify &lt;/span&gt;&lt;b style="font-family: Verdana,sans-serif;"&gt;ScaffoldAllTables = true&lt;/b&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt; (Which is by default &lt;/span&gt;&lt;b style="font-family: Verdana,sans-serif;"&gt;false&lt;/b&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;) to specify that the Dynamic Data engine should generate codes to perform CRUD operations for all tables in the database (Ideally, this may not be desired, but, for understanding and running the very first Dynamic Data application, lets keep this simple).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Build the Application and once build is successful, Run or Debug the application. It will launch the application which should be something like as follows:&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-zCBLKrvazAA/TX-Bn6K8-VI/AAAAAAAAAN8/GIQpXlvVmn4/s1600/DynamicDataSite.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-zCBLKrvazAA/TX-Bn6K8-VI/AAAAAAAAAN8/GIQpXlvVmn4/s1600/DynamicDataSite.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Dynamic Data web site&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;Click on a particular Table name in the listing and it will show a listing page including all filtering options (For all the foreign keys)&lt;b&gt; &lt;/b&gt;with Insert/Update/Delete links for each data&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-K5_1KYFh_mY/TX-CmgcN12I/AAAAAAAAAOA/i83vspsN4uU/s1600/EmployeeList.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-K5_1KYFh_mY/TX-CmgcN12I/AAAAAAAAAOA/i83vspsN4uU/s1600/EmployeeList.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Listing page for a particular table&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Using the Filter options you can filter the listing page by selecting particular filter data. The filter data are retrieved from the database using the foreign key values. Also, clicking on the "Insert new item" link below allows you to enter a new item in the system and the Edit and Delete links let you Edit a particular item and Delete one respectively.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Creating a Dynamic Data web application project and running it by configuring an Entity or Linq to SQL Data source requires 5 minutes of works at best and the end result is a powerful bug free CRUD application for the entire database generated right way.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In the next part of this article we would try to understand the building blocks of the Dynamic Data Application project, which would eventually help us customize the application when we would implement a real application using this framework.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.shubho.net/2011/03/understanding-dynamic-data-application.html"&gt;Click Here&lt;/a&gt;&lt;/b&gt; for the next article.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-289209584562136481?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/introducing-dynamic-data-aspnet-40.html' title='Dynamic Data in Asp.net 4.0. Part1 : Introduction'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/289209584562136481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/introducing-dynamic-data-aspnet-40.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/289209584562136481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/289209584562136481'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/introducing-dynamic-data-aspnet-40.html' title='Dynamic Data in Asp.net 4.0. Part1 : Introduction'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-8MiLOaqnYik/TX9x35eIxeI/AAAAAAAAANM/aR46Q26eoNI/s72-c/NewDynamicDataProject.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-5862637653381399789</id><published>2011-03-10T21:04:00.000-08:00</published><updated>2011-03-10T21:05:51.118-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Server Controls Path'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Remove wrapping table element'/><category scheme='http://www.blogger.com/atom/ns#' term='Wrapping table element'/><title type='text'>Removing outer table elements from Server Control's generated HTML in Asp.net 4.0</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Before Asp.net 4.0, a number of Asp.net server controls used to render their corresponding HTML output within a tabular structure by surrounding the data within &amp;lt;table&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; elements, and there was no way you could get rid of those tables and customize the rendered HTML. The following controls were among them:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;RadioButtonList&lt;br /&gt;CheckBoxList&lt;br /&gt;FormView&lt;br /&gt;Login&lt;br /&gt;PasswordRecovery&lt;br /&gt;ChangePassword&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you do a little experiment with a few of the above controls, you would see the &lt;b&gt;CheckBoxList  &lt;/b&gt;and &lt;b&gt;RadioButtonList &lt;/b&gt;would render the following kind of HTMLs:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;table id="MainContent_CheckBoxList1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input id="MainContent_CheckBoxList1_0" type="checkbox" name="ctl00$MainContent$CheckBoxList1$0"&lt;br /&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; value="1" /&amp;gt;&amp;lt;label for="MainContent_CheckBoxList1_0"&amp;gt;Shubho&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;And,&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;table id="MainContent_RadioButtonList1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input id="MainContent_RadioButtonList1_0" type="radio" name="ctl00$MainContent$RadioButtonList1"&lt;br /&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; value="1" /&amp;gt;&amp;lt;label for="MainContent_RadioButtonList1_0"&amp;gt;Shubho&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;And, the &lt;b&gt;FormView &lt;/b&gt;would render the following HTML:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;table cellspacing="0" id="MainContent_FormView1" style="border-collapse: collapse;"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan="2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Employee Name : &amp;lt;span id="MainContent_FormView1_Label1"&amp;gt;Shubho&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Guess what, these tabular HTMLs are not easy to manage using javascript and css and these also increase the overall page size because of the additional HTML elements are used to render the actual data in tabular structure.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Good news is, Asp.net 4.0 lets you get rid of these &amp;lt;table&amp;gt; elements from their rendered HTML by using some simple properties.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;RepeatLayout property&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For RadioButtonList and DropDownList, there is a RepeatLayout property which lets you specify an option for the HTML output. See the following options:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-dwZgDvKWJbY/TXmgMB1-oVI/AAAAAAAAANE/p75i7wQEIIU/s1600/RepeatLayoutProperty.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-dwZgDvKWJbY/TXmgMB1-oVI/AAAAAAAAANE/p75i7wQEIIU/s1600/RepeatLayoutProperty.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; RepeatLayout property of RadioButtonList&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you specify "Flow", the RadioButtonList would render the following kind of HTML:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;span id="MainContent_CheckBoxList1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input id="MainContent_CheckBoxList1_0" type="checkbox" name="ctl00$MainContent$CheckBoxList1$0"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="1" /&amp;gt;&amp;lt;label for="MainContent_CheckBoxList1_0"&amp;gt;Shubho&amp;lt;/label&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, no &amp;lt;table&amp;gt; element is there two wrap the above rendered HTML&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Specifying &lt;b&gt;OrderedList &lt;/b&gt;would render the HTML using &amp;lt;ol&amp;gt;&amp;lt;li&amp;gt; elements and specifying &lt;b&gt;UnOrderedList&lt;/b&gt; would render the HTML using &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;. Not to mention what will happen if &lt;b&gt;Table&lt;/b&gt; is specified :)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;RenderOuterTable property&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This property is available for the following Asp.net server controls to specify whether or not to render a wrapping &amp;lt;table&amp;gt; structure for the rendered HTML output. The property is applicable for the following server controls:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;FormView&lt;br /&gt;Login&lt;br /&gt;PasswordRecovery&lt;br /&gt;ChangePassword&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Specifying &lt;b&gt;RenderOuterTable ="false"&lt;/b&gt; for a FormView control results in the following HTML output:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;Name&lt;br /&gt;&amp;lt;span id="MainContent_FormView1_Label1"&amp;gt;Shubho&amp;lt;/span&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;An issue with &amp;lt;asp:Login&amp;gt; control &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Surprisingly, if you specify RenderOuterTable="false" for an &amp;lt;asp:Login&amp;gt; control, you would still see tons of &amp;lt;table&amp;gt; based HTMLs in the output. For example:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;table cellpadding="0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align="center" colspan="2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log In&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align="right"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="MainContent_Login1_UserName"&amp;gt;&lt;br /&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; User Name:&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input name="ctl00$MainContent$Login1$UserName" type="text" id="MainContent_Login1_UserName" /&amp;gt;&amp;lt;span&lt;br /&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; id="MainContent_Login1_UserNameRequired" title="User Name is required." style="visibility: hidden;"&amp;gt;*&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align="right"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="MainContent_Login1_Password"&amp;gt;&lt;br /&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; Password:&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input name="ctl00$MainContent$Login1$Password" type="password" id="MainContent_Login1_Password" /&amp;gt;&amp;lt;span&lt;br /&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; id="MainContent_Login1_PasswordRequired" title="Password is required." style="visibility: hidden;"&amp;gt;*&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan="2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input id="MainContent_Login1_RememberMe" type="checkbox" name="ctl00$MainContent$Login1$RememberMe" /&amp;gt;&amp;lt;label&lt;br /&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; for="MainContent_Login1_RememberMe"&amp;gt;Remember me next time.&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td align="right" colspan="2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="submit" name="ctl00$MainContent$Login1$LoginButton" value="Log In" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&amp;amp;quot;ctl00$MainContent$Login1$LoginButton&amp;amp;quot;, &amp;amp;quot;&amp;amp;quot;, true, &amp;amp;quot;ctl00$MainContent$Login1&amp;amp;quot;, &amp;amp;quot;&amp;amp;quot;, false, false))"&lt;br /&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; id="MainContent_Login1_LoginButton" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;At first this may seem confusing that even after specifying &lt;b&gt;RenderOuterTable="false"&lt;/b&gt;, why the HTML output is being rendered using &amp;lt;table&amp;gt; structure.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The answer is, specifying &lt;b&gt;RenderOuterTable="false"&lt;/b&gt; only eliminates the outer table (If there is any) which wraps the original HTML control that is rendered by the corresponding server control. So, in case of &amp;lt;asp:Login&amp;gt; control, specifying &lt;b&gt;RenderOuterTable="false"&lt;/b&gt; only eliminates the outer &amp;lt;table&amp;gt;, and, not the &amp;lt;table&amp;gt; from it's original rendered HTML (Which is above). To verify this, if you specify &lt;b&gt;RenderOuterTable="true"&lt;/b&gt;, you would see and extra &amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; is being used to wrap the original &amp;lt;table&amp;gt; based HTML output.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;However, if you really want to get rid of the &amp;lt;table&amp;gt; based HTML output for the &amp;lt;asp:Login&amp;gt; control, you may do this by converting the control to a template control and specify the HTML that it should render. You can do this by going to design view and right click on the Login control and selecting "Convert to Template".&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-LhHgZQvTuD0/TXmn9_R5byI/AAAAAAAAANI/ktjeRh1Co3I/s1600/ConvertToTemplate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-LhHgZQvTuD0/TXmn9_R5byI/AAAAAAAAANI/ktjeRh1Co3I/s1600/ConvertToTemplate.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Converting a Login control to Template&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Doing so would generate the template based complete HTML for the Login control which you can customize as you like.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The above is also true for the &lt;b&gt;PasswordRecovery &lt;/b&gt;and &lt;b&gt;ChangePassword &lt;/b&gt;control.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Hope this helps :)&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-5862637653381399789?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/remove-tables-aspnet-40-controls-html.html' title='Removing outer table elements from Server Control&apos;s generated HTML in Asp.net 4.0'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/5862637653381399789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/remove-tables-aspnet-40-controls-html.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/5862637653381399789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/5862637653381399789'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/remove-tables-aspnet-40-controls-html.html' title='Removing outer table elements from Server Control&apos;s generated HTML in Asp.net 4.0'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-dwZgDvKWJbY/TXmgMB1-oVI/AAAAAAAAANE/p75i7wQEIIU/s72-c/RepeatLayoutProperty.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-3426520430991015086</id><published>2011-03-06T19:35:00.000-08:00</published><updated>2011-03-06T19:58:25.655-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='Database change script'/><title type='text'>Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part 2</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is the 2nd part of an article, and if you haven't gone through the first part yet, you may want to read it first. Check out the following link:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.shubho.net/2011/03/database-deployment-visual-studio-part1.html"&gt;Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part1&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In Visual Studio 2010, it is possible to completely automate the deployment process of an Asp.net web application.&amp;nbsp; A deployment package in Visual Studio 2010 can include dependencies on SQL Server databases, and, it is possible to generate the full database schema and also add custom TSQL scripts to run on the target SQL Server database using the deployment package.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;But, this post is not going to cover the automation of deployment (Including Database Deployment) using Visual Studio. Rather, this post would demonstrate a step-by-step process to help improve the deployment process of a database driven (SQL Server) Asp.net web application by generating a TSQL change script between two different databases utilizing a Visual Studio Database project.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Here we go. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Visual Studio 2010 comes with a number of SQL Server database project template and it is possible to&amp;nbsp; compare two different databases (Source and Destination databases), find out the differences between the two and generate a TSQL script that contains all the change scripts to upgrade the source database to the destination one. Once you have that TSQL script, you can run this to a target database any time to conform it to the latest version. So, gone are the days when you had to manually write scripts for each and every database change and try to troubleshoot a BUG at a newly deployed site that was usually caused by some mistake done while deploying the database.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Follow these simple steps to carry out the overall task:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;Open Visual Studio 2010 and add an SQL Server 2005 Database project (Or, SQL Server 2008 Database project) by clicking File-&amp;gt;New-&amp;gt;Project, and expanding the Database node and selecting SQL Server.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-b6z3mK2XtDk/TXRC9yYaCXI/AAAAAAAAAMU/DqNeybTHxmY/s1600/SqlServer2005DatabaseProject.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-b6z3mK2XtDk/TXRC9yYaCXI/AAAAAAAAAMU/DqNeybTHxmY/s1600/SqlServer2005DatabaseProject.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Create SQL Server Database Project&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;Once the project is added in the solution, right click on the "Schema Comparisons" folder in the solution explorer and click on "Add-&amp;gt;Schema Comparison" to add a Schema Comparison item in the project.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-wUPpOvfYGNg/TXRDzK0YILI/AAAAAAAAAMY/YB0FJXlE2hE/s1600/AddSchemaComparison.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-wUPpOvfYGNg/TXRDzK0YILI/AAAAAAAAAMY/YB0FJXlE2hE/s1600/AddSchemaComparison.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-5vzwfD8kPPo/TXREV1S9t5I/AAAAAAAAAMc/issHcCpb8AI/s1600/SchemaComparison.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-5vzwfD8kPPo/TXREV1S9t5I/AAAAAAAAAMc/issHcCpb8AI/s1600/SchemaComparison.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Add a Schema Comparison in Database project&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Visual Studio will prompt you to specify the source and destination database using the following window. Check the radio button "Database" and specify the source and destination databases by clicking on the "New Connection" button.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Source database should be the latest database where all the database changes have been done.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Destination database should be the one which we want to be upgraded.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-xaLX1DcGmn8/TXREv-FpW3I/AAAAAAAAAMg/fiX6A6PSe1Q/s1600/SourceDestinationDB.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="305" src="https://lh5.googleusercontent.com/-xaLX1DcGmn8/TXREv-FpW3I/AAAAAAAAAMg/fiX6A6PSe1Q/s640/SourceDestinationDB.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Source and Destination database for schema comparison&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once the source and destination database have been specified, click on the "OK" button to let the Schema Comparison tool start comparing the two databases. It would take some time to compare all objects between the two databases and would provide a schema comparison report as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-8qSNBxELGFQ/TXRF9_I4O3I/AAAAAAAAAMk/-PWl2xvOqXY/s1600/SchemaComparisonReport.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-8qSNBxELGFQ/TXRF9_I4O3I/AAAAAAAAAMk/-PWl2xvOqXY/s1600/SchemaComparisonReport.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Schema comparison report in Visual Studio 2010&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, the report includes the list of objects in the source database (To the left of "Update Actions" column) and the list of objects in the destination database (To the right of "Update actions") column, and, it lets you specify your desired action for each particular object in the "Update Actions" column.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Click on the "Create" action (If there is anything such on the report) and you will see something like the following:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-_O9w9AUN-8I/TXRHoUg48UI/AAAAAAAAAMo/iBKZCV6ErJ8/s1600/Create.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-_O9w9AUN-8I/TXRHoUg48UI/AAAAAAAAAMo/iBKZCV6ErJ8/s1600/Create.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Create action on schema comparison report&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;A "Create" action indicates that, a database object is present in the source database, but, absent in the destination database. You can of course can specify "Skip" for a particular database object by clicking on the corresponding "Update Action":&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-WI7W0SKzEC4/TXRIiGFjAPI/AAAAAAAAAMs/Ftrypw34ikE/s1600/Skip.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-WI7W0SKzEC4/TXRIiGFjAPI/AAAAAAAAAMs/Ftrypw34ikE/s1600/Skip.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Skip action on schema comparison report&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Similarly, you can click on the "Update" action (If there is anything such in your report) to see what needs to be updated in the destination database and also you can specify skip if you want:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-0Hjml0qVkn0/TXRI50zFdrI/AAAAAAAAAMw/toEdHNfD32g/s1600/Update.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-0Hjml0qVkn0/TXRI50zFdrI/AAAAAAAAAMw/toEdHNfD32g/s1600/Update.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Update action on schema comparison report&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The schema comparison report includes the comparison report of each and every database object between the source and destination databases (Tables/Stored Procedures/Views/Constraints/Keys/Triggers/Functions etc). So, you can have a look at each of the object in the report (Where there is a difference) and specify what to do.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Finally, you can generate the TSQL script based upon the actions you specify in the schema comparison report by clicking on the "Refresh Update Script".&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-ozeKpBfAr7c/TXRJ4aI666I/AAAAAAAAAM0/6D4vmHCcGok/s1600/RefreshUpdateScript.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-ozeKpBfAr7c/TXRJ4aI666I/AAAAAAAAAM0/6D4vmHCcGok/s1600/RefreshUpdateScript.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Refresh Update Script&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The TSQL script will be generated and it would be shown in the bottom window:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-ByhPFmb-wSE/TXRKRsmK-6I/AAAAAAAAAM4/K19C1G8Z0YQ/s1600/SchemaUpdateScript.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-ByhPFmb-wSE/TXRKRsmK-6I/AAAAAAAAAM4/K19C1G8Z0YQ/s1600/SchemaUpdateScript.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Schema comparison script&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once generated, you can execute the TSQL script to the target database by clicking on the "Write Update" action:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-5nAruHGVrEw/TXRLFY4yEqI/AAAAAAAAAM8/T61rx_qBxF8/s1600/WriteUpdates.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-5nAruHGVrEw/TXRLFY4yEqI/AAAAAAAAAM8/T61rx_qBxF8/s1600/WriteUpdates.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Write Updates on target database&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Alternatively, you can export the TSQL script to an sql file, execute it later, and, possibly maintain it in the source control system by clicking on the "Export to File" action:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-gXckCQKaEGk/TXRLnW0qzoI/AAAAAAAAANA/55eFn3r0Gz0/s1600/ExportToFile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-gXckCQKaEGk/TXRLnW0qzoI/AAAAAAAAANA/55eFn3r0Gz0/s1600/ExportToFile.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Export generated TSQL to a file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You can run this generated TSQL script to upgrade the target database within a quick time, and this will help you ensure a smooth deployment of your Asp.net applications because you no longer have to maintain database change scripts manually which is error prone and tedious.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Visual Studio 2010 rocks!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-3426520430991015086?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/database-deployment-visual-studio-part2.html' title='Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part 2'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/3426520430991015086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/database-deployment-visual-studio-part2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/3426520430991015086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/3426520430991015086'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/database-deployment-visual-studio-part2.html' title='Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part 2'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-b6z3mK2XtDk/TXRC9yYaCXI/AAAAAAAAAMU/DqNeybTHxmY/s72-c/SqlServer2005DatabaseProject.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-931346000911819102</id><published>2011-03-06T01:42:00.000-08:00</published><updated>2011-03-06T19:57:46.850-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='Database change script'/><title type='text'>Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part1</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Database deployment is perhaps the most important part of any Asp.net application deployment, and, if the database deployment is smoothly done, there is a chance that the overall application deployment is done smoothly.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Most Asp.net application deployment is usually carried out in following process&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-rSQ0qiGfWQs/TXNIK4LmmBI/AAAAAAAAAMQ/CABKqvi6R7o/s1600/DeploymentCycle.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-rSQ0qiGfWQs/TXNIK4LmmBI/AAAAAAAAAMQ/CABKqvi6R7o/s1600/DeploymentCycle.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Deployment process of Asp.net applications&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Development Site&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is where the developers deploy their individual tasks for QA testing and fixing bugs. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Staging Site&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is where the overall application is deployed and the QA team performs production testing, once all individual tasks are passed on Development site.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Production Site&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is where the overall application is deployed once all testing on Staging site is passed.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;The deployment process&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Usually, source codes are maintained using a version control system (Say, SVN), and, when a deployment is required, the overall codes (From the corresponding branch) are checked out and built using a build management script (Say, NANT).&amp;nbsp; Once build is successful, the binaries and other files are deployed on target server.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The corresponding database changes are also usually maintained as individual database script files within the version control system, and the build management system executes those scripts to make necessary database changes on the target database, to make sure that the database conforms to the current version of the codebase. The database change scripts include the all database related changes such as Creation/Modification of Tables/Stored Procedures/Views/Functions/Triggers and other necessary database objects.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If everything goes right, the deployment proceeds very smoothly. However, experience shows that, even if all tasks are passed on Development site, once staging deployment is done, BUGs are found and reported from the staging site (Even if the same BUG doesn't exist in Development site). Most of the cases the reason is found to be a database deployment issue. For this reason, the staging deployment is often found to be time consuming and problematic.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Why this happens?&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Usually, in Development site, developers deploy their database and code related changes incrementally. That is, each developer deploys codes and the corresponding database change scripts individually. They also commit their corresponding database scripts within the source control. Now, when staging deployment is to be done, a copy of the production database is taken and copied at the Staging database server, and, the overall database change script is run there at once to conform it to the latest version of the codebase. That's where the main problem occurs.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Ideally, the database change scripts should be perfectly maintained within the source control so that whenever the scripts are run, the current version of the database at production is immediately be upgraded to the latest version, to conform it to the current source codes. But, unlike the application's source codes, the database scripts cannot be built and hence, it is hard to identify whether there is any missing database script or there is any script maintained wrongly in the source control, before the script is to be run at a target database.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, often there are situations where it takes hours or even days for a developer to fix all the database script issues and ensure a complete staging deployment.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;How to improve the situation?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There could be two possible ways to improve this situation&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Option1:&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Ensure a process to make sure that, no individual database change script is run on Development database. Like the staging deployment, the overall database scripts have to be run even if a single task has to be deployed there.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Pros :&lt;/b&gt; This will make sure that, before staging deployment, all corresponding database scripts are correctly maintained in the source control, and hence, staging deployment will likely be much quicker and smoother.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Cons :&lt;/b&gt; Individual task deployment at staging site would take more time than before (Because in order to deploy each little task, the overall build process has to be run).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Option2&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Use some intelligent tool to generate the overall database change scripts between the database at the development site and the production site, and, run the database change script into staging database to conform&amp;nbsp; it to the current codebase. Also, maintain the change script in source control.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Pros :&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This will not require running the overall build process to deploy a single task on development site. Developers will just need to run their individual database change scripts.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The database change scripts doesn't have to be maintained in source control, so, this will save some time at each task level.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The staging deployment will likely to be much more smooth.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Cons :&lt;/b&gt; No real cons :)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The next post is all about utilizing such an intelligent tool which is available right within your favorite Visual Studio 2010!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.shubho.net/2011/03/database-deployment-visual-studio-part2.html"&gt;Click here&lt;/a&gt;&lt;/b&gt; for the next part of the article.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-931346000911819102?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/database-deployment-visual-studio-part1.html' title='Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part1'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/931346000911819102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/database-deployment-visual-studio-part1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/931346000911819102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/931346000911819102'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/database-deployment-visual-studio-part1.html' title='Improve deployment process of Asp.net applications by generating database change scripts using Visual Studio 2010-Part1'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-rSQ0qiGfWQs/TXNIK4LmmBI/AAAAAAAAAMQ/CABKqvi6R7o/s72-c/DeploymentCycle.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-2169020653138694552</id><published>2011-03-02T02:46:00.000-08:00</published><updated>2011-03-03T18:43:35.326-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Transformation Files'/><category scheme='http://www.blogger.com/atom/ns#' term='Transform Web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Using Transformation files to transform web.config files for different target deployments in Asp.net 4.0</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Managing different web.config files for different deployment environment could be a troublesome task and synchronization of these different web.config settings could be hard.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For example, you may have the following deployment environments for your Asp.net applications for different purpose:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Local :&lt;/b&gt; Your own development machine&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Development :&lt;/b&gt; Where you deploy your codes for QA testing&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Staging :&lt;/b&gt; Where you deploy your codes for Production testing&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Production :&lt;/b&gt; Where you deploy your codes for Production&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You need to maintain different web.config files for each of these environments, and, when you need to add/delete/modify a particular setting in the main web.config file, you need to do that in all web.config files.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Along with making sure that the web.config files cotains the same set of configuration elements, for some particular configuration elements you may need to put different values for the same settings (Say, each web.config would have different Connection String values).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, what we usually do is as follows: &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. We maintain different web config files for each different deployment environment which is something like as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: blue;"&gt;web.config&lt;/span&gt; (For local development environment)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: blue;"&gt;web.config.dev&lt;/span&gt; (For Development site)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: blue;"&gt;web.config.staging&lt;/span&gt; (For Staging site)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: blue;"&gt;web.config.release&lt;/span&gt; (For Production site)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Whenever we do any change (Add/remove/modify) for a configuration element in the web.config file, we do the same change manually in all three files.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. We put correct values for some particular configuration element (Say, Connection String) for each different web.config file.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;4. Before deployment, we rename the corresponding web.config.* file to web.config and deploy. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;That's not a huge amount of work we need to do, but, the problem is, there is a huge risk of getting into a situation where we might have different structure of web.config settings because we update all web.config elements manually.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Fortunately, Asp.net 4.0 has a cool solution to this problem, and, this post is all about it.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Transforming web.config files&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Since Asp.net 4.0, it is possible to maintain a single web.config file and different Transformation file to manage the different web.config files for different deployment environment. The Transformation files are used by the Visual Studio to copy the original web.config file and put correct values there for generatubg an web.config file automatically for the target deployment environment.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Let us see how this is possible by following these simple steps:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Create an Asp.net Application project in Visual Studio (2010)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-hRX7PRefYjY/TW4QKgiSSeI/AAAAAAAAALY/A7JX6-XbrsE/s1600/TransformationSolution.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-hRX7PRefYjY/TW4QKgiSSeI/AAAAAAAAALY/A7JX6-XbrsE/s1600/TransformationSolution.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; A sample Asp.net web application project&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Go to the Build-&amp;gt;Configuration Manager menu and add new Configuration settings Dev and Staging site&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-_73z2ldmhDE/TW4QiOeSeLI/AAAAAAAAALc/1lcDyUu6-SY/s1600/ConfigurationManager.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-_73z2ldmhDE/TW4QiOeSeLI/AAAAAAAAALc/1lcDyUu6-SY/s1600/ConfigurationManager.png" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-7R7LE-6GIro/TW4Qs8-AdqI/AAAAAAAAALg/2rPK9vH62Mg/s1600/NewConfigurationSetting.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="401" src="https://lh6.googleusercontent.com/-7R7LE-6GIro/TW4Qs8-AdqI/AAAAAAAAALg/2rPK9vH62Mg/s640/NewConfigurationSetting.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-MbJ06bbscno/TW4RL-c1X-I/AAAAAAAAALk/UHqKEBWB_c0/s1600/Dev.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-MbJ06bbscno/TW4RL-c1X-I/AAAAAAAAALk/UHqKEBWB_c0/s1600/Dev.png" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-Gi4M0lMbAnQ/TW4RQLLqedI/AAAAAAAAALo/c7SDVnZFaZw/s1600/Staging.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-Gi4M0lMbAnQ/TW4RQLLqedI/AAAAAAAAALo/c7SDVnZFaZw/s1600/Staging.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Adding new build settings for Asp.net application project&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once two new configuration settings are added (For Dev and Staging), Right click on the web.config in the solution explorer, and click on "Add Coding Transforms" to add the transformation file for each different settings.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-WsrpIUSzlWk/TW4RrfnWfRI/AAAAAAAAALs/Q6uehx_TVh4/s1600/AddCodingTransforms.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-WsrpIUSzlWk/TW4RrfnWfRI/AAAAAAAAALs/Q6uehx_TVh4/s1600/AddCodingTransforms.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Figure : Add transformation files&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Visual Studio will generate the transformation files and the corresponding files will be shown in the solution explorer accordingly&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-KWYy1Z5ADjc/TW4SDzcI--I/AAAAAAAAALw/o5CFph3wei4/s1600/TransformationFiles.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-KWYy1Z5ADjc/TW4SDzcI--I/AAAAAAAAALw/o5CFph3wei4/s1600/TransformationFiles.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Generated transformation files&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Double click on a transformation file and the transformation file will be shown as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh4.googleusercontent.com/-zPlWqRf9zUw/TW4SlgMTCZI/AAAAAAAAAL0/boid9q_qyT8/s1600/TransformationFile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-zPlWqRf9zUw/TW4SlgMTCZI/AAAAAAAAAL0/boid9q_qyT8/s1600/TransformationFile.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Generated transformation file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, let us see an example of using the Transformation files by setting a Connection String configuration element in the original web.config and managing it's values in one of the transformation files&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open the Transformation file for Dev site (Web.Dev.Config) in the Visual Studio Editor, and, configure it by uncommenting the &amp;lt;connectionString&amp;gt; setting and specifying an appropriate Connection String property value for the settings&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-veolnlvh0Tk/TW4WJOmcENI/AAAAAAAAAL4/f9_ug5aKQzA/s1600/ConnectionString.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-veolnlvh0Tk/TW4WJOmcENI/AAAAAAAAAL4/f9_ug5aKQzA/s1600/ConnectionString.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Specifying connection string property for Dev transformation file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Right click on the solution and click on "Build Deployment Package" to generate the web.config files based upon the Transformation file settings.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-m6OYB94GCb8/TW4WhSVFgGI/AAAAAAAAAL8/bJ6BPEtAgyc/s1600/BuildDeploymentPackage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-m6OYB94GCb8/TW4WhSVFgGI/AAAAAAAAAL8/bJ6BPEtAgyc/s1600/BuildDeploymentPackage.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Build Deployment Package to generate web.config files from transformation files&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Visual Studio will generate the transformation files within the "obj" directory. However, as is this directory is usually hidden in the solution explorer, you need to click on the "Show All Files" button to see the hidden "obj" folder in the solution explorer.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-tzJQ3zqXavA/TW4W_DLW39I/AAAAAAAAAMA/6rFUYsK6FQo/s1600/ShowAllFiles.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-tzJQ3zqXavA/TW4W_DLW39I/AAAAAAAAAMA/6rFUYsK6FQo/s1600/ShowAllFiles.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Show all files to see hidden files in solution explorer&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Expand the "obj" folder as follows to find the generated web.config file from it's transformation file&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh6.googleusercontent.com/-1XJzR76t3dM/TW4YGHgX85I/AAAAAAAAAME/FIzZqK724TE/s1600/TransformedWebConfig.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-1XJzR76t3dM/TW4YGHgX85I/AAAAAAAAAME/FIzZqK724TE/s1600/TransformedWebConfig.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Transformed web.config file generated from transformation file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open the generated Web.config file to verify whether it contains the correct settings specified within the transformation file&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh5.googleusercontent.com/-KlT_eSGDb3s/TW4Yrci9VvI/AAAAAAAAAMI/28BySAdJuro/s1600/TransformedSetting.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-KlT_eSGDb3s/TW4Yrci9VvI/AAAAAAAAAMI/28BySAdJuro/s1600/TransformedSetting.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Connection string value generated from transformation file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Where is the magic?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The magic is nothing but the two settings in the Transformation file, which is as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://lh3.googleusercontent.com/-XUvaHhC2imQ/TW4b_IfwwsI/AAAAAAAAAMM/Lz-raxXkH5I/s1600/TransformationSettings.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-XUvaHhC2imQ/TW4b_IfwwsI/AAAAAAAAAMM/Lz-raxXkH5I/s1600/TransformationSettings.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Transformation Settings&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The following two Transformation attribute are needed to be configured in the transformation file to generate the web.config files:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;xdt:Transform&lt;/b&gt; : This setting instructs the Transformation engine to either Replace/Insert/Delete/Remove or Set an attribute value. In our case, we instructed to Set an attribute values for the current element by specifying the value "SetAttributes".&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;xdt:Locator&lt;/b&gt; : This setting instructs the Transformation engine to find the target element which it needs to transform. In our case, we are instructing it to find an &amp;lt;add&amp;gt; element within the &amp;lt;connectionString&amp;gt; element which has a matching name "DbConnection" in the original Web.config file (And, thereby setting the corresponding connection string value as instructed by the xdt:Transform attribute).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There are many flexible options to transform Web.config files using the &lt;b&gt;xdt:Transform&lt;/b&gt; and &lt;b&gt;xdt:Locator&lt;/b&gt; element, and, you can learn more on this from &lt;a href="http://msdn.microsoft.com/en-us/library/dd465326%28VS.100%29.aspx"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I bet, this will make your life a little easier.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-2169020653138694552?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/03/transformation-webconfig-aspnet-40.html' title='Using Transformation files to transform web.config files for different target deployments in Asp.net 4.0'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/2169020653138694552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/03/transformation-webconfig-aspnet-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/2169020653138694552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/2169020653138694552'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/03/transformation-webconfig-aspnet-40.html' title='Using Transformation files to transform web.config files for different target deployments in Asp.net 4.0'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-hRX7PRefYjY/TW4QKgiSSeI/AAAAAAAAALY/A7JX6-XbrsE/s72-c/TransformationSolution.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-296408893761495465</id><published>2011-02-23T19:10:00.000-08:00</published><updated>2011-02-24T06:45:06.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance Monitor'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance Monitor individual application'/><title type='text'>Performance Monitoring of individual Asp.net Application in Asp.net 4.0</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you may know already, it is possible to monitor performance for Asp.net applications running within the Asp.net worker process (w3wp). It is as easy as adding some performance counters in the Performance Monitoring Administrative utility (Which ships with windows) and gathering some performance data for the running Asp.net applications.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;However, before Asp.net 4.0, it wasn't possible to gather performance data for each individual asp.net application. So, if there were multiple Asp.net applications deployed within the same Asp.net worker process, and, if we needed performance data for a particular Asp.net application, we had no luck as we could only get consolidated performance counter data for all Asp.net applications running within the same Asp.net worker process. So, it wasn't possible to know how much memory or CPU was being consumed by a particular Asp.net application running within an Asp.net worker process.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, Asp.net 4.0 makes this possible. In Asp.net 4.0, the performance counters can gather data at AppDomain level (You may have to specify the following settings in the &lt;b&gt;Aspnet.config&lt;/b&gt; file to enable this, in my case I edited the &lt;b&gt;C:\Windows\Microsoft.NET\Framework\v4.0.30319\Aspnet.config&lt;/b&gt; file)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt; &lt;br /&gt;&amp;lt;configuration&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;  &amp;lt;runtime&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;appDomainResourceMonitoring enabled="true"/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;  &amp;lt;/runtime&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Assuming you have an Asp.net 4.0 application hosted in IIS, all you have to do is to follow these steps to gather performance data for an individual Asp.net application:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. Browse or run the Asp.net application to make sure that the corresponding Application domain is loaded within the Asp.net worker process (This is required, otherwise, the corresponding Asp.net application won't show up in the performance counter selection window).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. In the Run command, type &lt;b&gt;perfmon &lt;/b&gt;and hit "OK" to launch the performance monitoring tool.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7FBrkFwjLh0/TWW97PVLKhI/AAAAAAAAAKs/iE_-OhC6nok/s1600/perfmon.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-7FBrkFwjLh0/TWW97PVLKhI/AAAAAAAAAKs/iE_-OhC6nok/s1600/perfmon.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure : &lt;/b&gt;Run command to launch performance monitoring tool&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. Once the Performance Monitor tool is launched, select the "Performance Monitor" node in the left panel and click on the plus sign to add a performance counter.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-w9o6FaOETco/TWW-6LIxEzI/AAAAAAAAAKw/GlBr27qIByQ/s1600/SelectPerformanceMonitor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-w9o6FaOETco/TWW-6LIxEzI/AAAAAAAAAKw/GlBr27qIByQ/s1600/SelectPerformanceMonitor.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Add Performance Counter&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;4. After the "Add Counter" window is launched, expand the "&lt;b&gt;ASP.NET Applications&lt;/b&gt;" counter and select the counter "&lt;b&gt;% Managed Processor Time (estimated)&lt;/b&gt;". Once selected, you will see the available list of Asp.net applications (And, a few other options) in the "&lt;b&gt;Instances of selected object&lt;/b&gt;" box from where you need to select an object which represents the Asp.net application you want to monitor. In my case, I selected the object "LM_W3SVC_2_ROOT". Once selected, click on the "Add&amp;gt;&amp;gt;" button to show up the selected counter in the right panel.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DCt-1V6mfNI/TWXAoN8WSaI/AAAAAAAAAK0/zhbHEkRiMRo/s1600/AddManagedProcessorCounter.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="472" src="http://3.bp.blogspot.com/-DCt-1V6mfNI/TWXAoN8WSaI/AAAAAAAAAK0/zhbHEkRiMRo/s640/AddManagedProcessorCounter.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Select Performance Counter and the corresponding Object&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Note :&lt;/b&gt; How to understand which object name represents what Asp.net application?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There could be many Asp.net applications running under the same Asp.net worker process. The corresponding object names is be shown in the format&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;LM_W3SVC_&lt;/span&gt;&lt;span style="background-color: #ffd966; font-size: small;"&gt;APPLICATION_ID_IN_IIS&lt;/span&gt;&lt;span style="font-size: small;"&gt;_&lt;/span&gt;&lt;span style="background-color: #ffd966; font-size: small;"&gt;APPLICATION_NAME&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The APPLICATION_ID_IN_IIS is the corresponding Application ID assigned by the IIS with some numeric values like 1, 2, 3 etc, and, the APPLICATION_NAME is usually set to "ROOT" in case the Asp.net application runs directly under a web site, or, the APPLIACTION_NAME is set to the corresponding application's name if the Asp.net application runs under a web site in IIS.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You can hit the following command to list the Asp.net application information in IIS and know the Application ID of your site:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;appcmd list sites&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It would show you an output like the following from where you can know the Site ID of your Asp.net application:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-l6rVDf6zpmg/TWXEU9HWlQI/AAAAAAAAALA/0ORAwarsiA4/s1600/appcmd_command.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-l6rVDf6zpmg/TWXEU9HWlQI/AAAAAAAAALA/0ORAwarsiA4/s1600/appcmd_command.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; appcmd command to list site information in IIS&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;5. Add another counter "&lt;b&gt;Managed Memory Used (estimated)&lt;/b&gt;"&amp;nbsp; for the same Asp.net application object, click on the "Add&amp;gt;&amp;gt;" button and then and, click on the "OK" button to confirm the counter selections. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-T6BqWEI0ESo/TWXFIdtbXQI/AAAAAAAAALE/X1jNskSUnOA/s1600/AddManagedMemoryUsedCounter.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="470" src="http://2.bp.blogspot.com/-T6BqWEI0ESo/TWXFIdtbXQI/AAAAAAAAALE/X1jNskSUnOA/s640/AddManagedMemoryUsedCounter.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure : &lt;/b&gt;Add Managed Memory Used (estimated) counter&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The performance counter will immediately start collecting performance data and the performance graph will be shown using two different colored lines.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RqtWbPaBetM/TWXHZLeYerI/AAAAAAAAALI/-2LrdNsCrMg/s1600/PerformanceCounterLine.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="476" src="http://1.bp.blogspot.com/-RqtWbPaBetM/TWXHZLeYerI/AAAAAAAAALI/-2LrdNsCrMg/s640/PerformanceCounterLine.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Performance Graph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;6. Browse the Asp.net application and execute the target functionality you want to monitor performance for. The counter will keep gathering performance data.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once you are convinced with gathering enough performance data by executing the specific functionality in your application, freeze the display by clicking on the "Freeze" button and then take a look at the graph to understand how much processing time (In terms of percentage) or Memory is being consumed by the Asp.net application.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-u4XAdnGQ07c/TWXI3lIBczI/AAAAAAAAALM/BXptbtp9nUI/s1600/FreezPerformanceData.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-u4XAdnGQ07c/TWXI3lIBczI/AAAAAAAAALM/BXptbtp9nUI/s1600/FreezPerformanceData.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure : &lt;/b&gt;Freeze performance counter display&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Alternatively, you can switch the performance counter output to a "Report view" for a better understandability.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--aAAB38mvNA/TWXJkp-DT9I/AAAAAAAAALQ/JjJo6KCbpRs/s1600/PerformanceReportSelection.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/--aAAB38mvNA/TWXJkp-DT9I/AAAAAAAAALQ/JjJo6KCbpRs/s1600/PerformanceReportSelection.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure : &lt;/b&gt;Switch to "Report" view to see performance data&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WoukdYTrlDM/TWXJwweqDlI/AAAAAAAAALU/z2rH4JOw8Ck/s1600/PerformanceReport.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-WoukdYTrlDM/TWXJwweqDlI/AAAAAAAAALU/z2rH4JOw8Ck/s1600/PerformanceReport.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; View Report for performance data&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Tracking the Memory and Processor usage at the application level gives you more granular look at resource consumption of each Asp.net application running within the same Asp.net worker process and this is really a cool feature offered by Asp.net 4.0. &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-296408893761495465?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/performance-monitoring-aspnet.html' title='Performance Monitoring of individual Asp.net Application in Asp.net 4.0'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/296408893761495465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/performance-monitoring-aspnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/296408893761495465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/296408893761495465'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/performance-monitoring-aspnet.html' title='Performance Monitoring of individual Asp.net Application in Asp.net 4.0'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-7FBrkFwjLh0/TWW97PVLKhI/AAAAAAAAAKs/iE_-OhC6nok/s72-c/perfmon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-5994646978052869206</id><published>2011-02-17T18:28:00.000-08:00</published><updated>2011-02-17T18:39:03.609-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Debugging Timeout'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Solving Debugging Timeout problem in Visual Studio and IIS7</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For those who wonders why debugging time out occurs in Visual Studio, and how to solve the timeout problem, this post is for them.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It was kind of irritating to see the debugging process killed automatically when debugging a web site/application in Visual Studio hosted in IIS 7, after installing Windows 7 in my PC. I wonder why that used to happen because it did never happen in case of Asp.net web site/application hosted in IIS 6.0. In first few days, I used to try to complete my debugging works in a hurry (Say, within 30-40 seconds), but, I couldn't continue this for long, and hence, decided to explore this issue a bit. Well, as it turned out, this was a matter of changing some settings in the corresponding Application pool in IIS.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Take a look at the following screen shot. This has been taken by &lt;b&gt;Right clicking on the Application pool&lt;/b&gt; of an Asp.net web site/application and selecting &lt;b&gt;"Advaced Settings"&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-family: Verdana,sans-serif; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/-mI0cunV665M/TV3WzgLJVxI/AAAAAAAAAKo/M_6I_KtbcSY/s1600/PingEnabled_Property_In_IIS7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Ping Enable property of Application pool in IIS" border="0" src="http://2.bp.blogspot.com/-mI0cunV665M/TV3WzgLJVxI/AAAAAAAAAKo/M_6I_KtbcSY/s1600/PingEnabled_Property_In_IIS7.png" title="Ping Enable property of Application pool in IIS" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Ping Enable property of Application pool in IIS&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There is a health monitoring system in IIS (Enabled if the property "&lt;b&gt;Ping Enabled=true&lt;/b&gt;" for the corresponding Application pool), which pings the Asp.net worker process periodically, to make sure that the process is responsive, healthy and alive. Now, when the Ping Enabled value is set to "true" (Which is by default), the debugging timeout occurs occurs in Visual Studio while debugging an Asp.net web site or application. The reason is, while debugging, the process is simply halted at the break point, and hence, it cannot response back to the health monitoring system's ping.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, when the health monitoring system doesn't get any response from the worker process, it immediately doesn't kill the process. It waits for the period of time specified in seconds (By the Application pool's property "&lt;b&gt;Ping Maximum Response Time In Seconds&lt;/b&gt;") and then kills the worker process. Hence, the debugging process gets killed in Visual Studio.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, to solve the debuggin timeout issue, either of the following two approaches could be followed:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Disable health monitoring&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The easiest solution is to disable health monitoring by setting the value &lt;b&gt;"Ping Enabled"=false&lt;/b&gt;. This would prevent the situation from happening which leads to kill the  debugging process when it is unable to give any response from the health monitoring ping. This allows to be able to debug and wait at a break point for an infinite amount of time without any problem.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;However, the pay off is, the health monitoring process is no longer enabled, and hence, there is no way for the administrator to get notified about any possible issues which could lead to make the web site/application down or perform sluggishly. Fortunately, in your development PC, this is probably not needed at all, and hence, disabling health monitoring could be an easy solution for you.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Increase Maximum Response Time&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As said already, while debugging, when the worker process gives no response to the health monitoring ping, it waits for a certain amount of time and then kills the debugging process (Worker process). So, another approach could be to increase the waiting time long enough (Say, 600 seconds or 10 minutes) to be able to debug a particular problem. A good thing with this approach is, the health monitoring process is still enabled, and, you can adjust the waiting time as much as you need, which is handy.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-5994646978052869206?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/debugging-timeout-visual-studio-iis7.html' title='Solving Debugging Timeout problem in Visual Studio and IIS7'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/5994646978052869206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/debugging-timeout-visual-studio-iis7.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/5994646978052869206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/5994646978052869206'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/debugging-timeout-visual-studio-iis7.html' title='Solving Debugging Timeout problem in Visual Studio and IIS7'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-mI0cunV665M/TV3WzgLJVxI/AAAAAAAAAKo/M_6I_KtbcSY/s72-c/PingEnabled_Property_In_IIS7.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-2374481339482612738</id><published>2011-02-13T22:12:00.000-08:00</published><updated>2011-02-13T22:25:30.291-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TSQL Recursive UDF'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Recursive Function'/><title type='text'>Recursive Function example in SQL Server</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In one of my project, I had to process some information by retrieving some data in an SQL Server database which were somewhat like as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There was a table &lt;b&gt;ItemNames&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-sJo2yf0QUY8/TVi1fUVKcnI/AAAAAAAAAKc/7kCxkLNkDSA/s1600/ItemNamesTable.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-sJo2yf0QUY8/TVi1fUVKcnI/AAAAAAAAAKc/7kCxkLNkDSA/s1600/ItemNamesTable.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;And, there was another table named &lt;b&gt;ItemNameMaps&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/-G1bEdAq9j4Y/TVi2GQcc6uI/AAAAAAAAAKg/thkb23NOr7Q/s1600/ItemNameMapsTable.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-G1bEdAq9j4Y/TVi2GQcc6uI/AAAAAAAAAKg/thkb23NOr7Q/s1600/ItemNameMapsTable.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, the ItemNames table contains the name of the items and a flag IsCurrent to denote which names are currently active, and, the ItemNameMaps table contains a mapping between the OldIds and the NewIds.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;When an item name is modified from the front-end, the name is not actually modified in the database. Rather, the following series of actions take place:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;A new entry is stored in the ItemNames table with the modified name, along with setting IsActive = true.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;A new entry is stored in the ItemNameMaps table with the newly inserted Id of the entry in ItemNames table (NewId) and the Id of the entry in ItemNames table containing the Existing name of the iteam (OldId).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;The IsActive is set to false for the row in ItemNames table containing the old Name for the same item.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, given the above data structure, the requirement was to retrieve all the old names of a given item's Id.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In the ItemMaps table, as you can see, for a given Item's Current Id (Say, 8),&amp;nbsp; it is possible to know what were the Id's of the past name of the items. That is:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt; 6--&amp;gt;8 (Item Id 6 was renamed to Item Id 8, A2 was renamed to A3)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;4--&amp;gt;6 (Item Id 4 was renamed to Item Id 6, A1 was renamed to A2)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1--&amp;gt;4 (Item Id 1 was renamed to Item Id 4, A&amp;nbsp;&amp;nbsp; was renamed to A1)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, for Item Name A3 (Id=8), we would like to retrieve the following Information:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/-SZ09uSzNLVs/TVi6xjo4SaI/AAAAAAAAAKk/KWgMSFweiBo/s1600/ItemOldNames.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-SZ09uSzNLVs/TVi6xjo4SaI/AAAAAAAAAKk/KWgMSFweiBo/s1600/ItemOldNames.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Guess what, I retrieved the data using a recursive User Defined Function (UDF) in SQL Server.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;The Recursive function&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Before diving into the Recursive Function, let me derive the base logic first. For a given Item's Id (Say, 8), the data is to be retrieved using the following logic:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;RetrieveOldNames(ItemId)&lt;br /&gt;Begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OldId = Get OldId for the given ItemId From ItemNameMaps &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select Name (OldId) From ItemNames + Select Name FROM RetrieveOldNames(OldId)&lt;br /&gt;End&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Fore example, for the given Item Id = 8, the logic will execute as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. It will retrieve the OldId = 6 for the given Item Id 8&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. It will retrieve the Name for OldId 6 (A2)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. It will call the recursive function for the OldId 6 (Go back to step 1).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Following is the actual UDF, which worked like a charm:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;CREATE FUNCTION [dbo].[GetOldNames] (@Id int)&amp;nbsp; &lt;br /&gt;RETURNS @OldNames TABLE (Name varchar(50))&lt;br /&gt;&amp;nbsp;AS&amp;nbsp; &lt;br /&gt;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @OldId bigint&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @OldId = (SELECT OldId FROM ItemNameMaps WHERE [NewId] = @Id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @OldId IS NULL or @OldId = 0 return &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO @OldNames(Name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT (SELECT Name FROM ItemNames WHERE Id = @OldId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FROM ItemNames&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; UNION&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT Name FROM GetOldNames(@OldId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;RETURN&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;I executed the function using the following TSQL:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;SELECT * from GetOldNames(8)&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;And, was happy to see the following result:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SZ09uSzNLVs/TVi6xjo4SaI/AAAAAAAAAKk/KWgMSFweiBo/s1600/ItemOldNames.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-SZ09uSzNLVs/TVi6xjo4SaI/AAAAAAAAAKk/KWgMSFweiBo/s1600/ItemOldNames.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-2374481339482612738?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/recursive-function-example-sql-server.html' title='Recursive Function example in SQL Server'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/2374481339482612738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/recursive-function-example-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/2374481339482612738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/2374481339482612738'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/recursive-function-example-sql-server.html' title='Recursive Function example in SQL Server'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sJo2yf0QUY8/TVi1fUVKcnI/AAAAAAAAAKc/7kCxkLNkDSA/s72-c/ItemNamesTable.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-9211788297085154031</id><published>2011-02-11T10:30:00.000-08:00</published><updated>2011-02-11T10:41:21.377-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C# 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic typing'/><category scheme='http://www.blogger.com/atom/ns#' term='Late Binding'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Binding'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Variable'/><title type='text'>Dynamic typing and late binding in C# 4.0</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Static binding in C#&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Back in C# 2.0 days, there was only static binding, or, static typing supported in the language.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;That is, unlike JavaScript, or, PHP, we had to specify the type of the variables at compile time. As long as compiler was unhappy with the variable type declarations, we had to make correction of the types in order to be able to compile and run the program.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Some examples of static typing is:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;int a = 5;&lt;br /&gt;string s = "Hello there!";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, C# 3.0 was released, and, a new beast arrived in town. Talking about the keyword "var".&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Initially, some people thought "var" wold allowed them to use dynamic typing. But it didn't take long to get to know the fact that, "var" was just another form of static typing, which infers it's actual type at compile time. That is,&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Once you compile the following lines of codes:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;var a = 5;&lt;br /&gt;var s = "Hello there!";&lt;br /&gt;&lt;/pre&gt;These actually becomes the following:&lt;br /&gt;&lt;pre class="brush:csharp"&gt;int a = 5;&lt;br /&gt;string s = "Hello there!";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The logic is pretty simple. The type is inferred from the value which is being assigned to the var variable. In fact, after you write the var statement correctly, Visual Studio Intellisence infers the actual type of the variable from the value. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It's obsious that, you can do the following with normal variables:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;int a = 5; //Initializing the int variable with a value 5&lt;br /&gt;&lt;/pre&gt;And,&lt;br /&gt;&lt;pre class="brush:csharp"&gt;int a; //declaring the variable first&lt;br /&gt;a = 5; //Assigning the variable later&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;But, you can't do the following with var:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;var a; //Will show compile time error&lt;br /&gt;a = 5;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Why? Because, as soon as compiler encounters the statement "var a", it tries to determine the actual type of "a" (Because there isn't actually type as "var", it's just a place holder type name) by analyzing the value. But, no value is being initialized while declaring the "var", and hence, error message is being shown (Doesn't matter even if you assign a value to the "var" variable later).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Dynamic binding in C# 4.0&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Another new beast arrived in town with C# 4.0, the "dynamic" type. Unlike the static bound types, variables declared as dynamic are completely bound at run time. Following is a simple example:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;dynamic s = "Hello there!";&lt;br /&gt;Console.WriteLine(s.Length);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Even if you compile the above statements, CLR doesn't know about the actual type of the variable before actual execution of the statements.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, Visual studio also is unable to show any Intellisense for dynamic variables. If you take the mouse on the "s.Length" on the above statement, you would see the following Intellisence:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2zoyQSK_MOY/TVVvbnPMMyI/AAAAAAAAAKY/w11nkAtfj_Q/s1600/Dynamic+Expression+C%2523.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Visual Studio Intellisence for Dynamic types" border="0" src="http://2.bp.blogspot.com/-2zoyQSK_MOY/TVVvbnPMMyI/AAAAAAAAAKY/w11nkAtfj_Q/s1600/Dynamic+Expression+C%2523.png" title="Visual Studio Intellisence for Dynamic types" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Visual Studio Intellisence for Dynamic types&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Unlike the "var", it is perfectly legal to declare a dynamic variable and then assign a value to it. That is, following statements are perfectly valid:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;dynamic s;&lt;br /&gt;s = "Hello world";&lt;br /&gt;Console.WriteLine(s.Length);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Why this is possible? Well, for the obvious fact that, dynamic types are resolved at run time, rather than compile time. So, the complier doesn't infer the actual type while compiling the above statements, and, it doesn't complain about any problem.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This gives us the opportunity to use the same variable for different types of data. For example:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;dynamic s;&lt;br /&gt;&lt;br /&gt;s = "Hello world";&lt;br /&gt;Console.WriteLine(s.Length);&lt;br /&gt;&lt;br /&gt;s = 1;&lt;br /&gt;//Console.WriteLine(s.Length); Not supported anymore. s is now an integer now&lt;br /&gt;Console.WriteLine(s); //Outputs 1&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;However, unlike PHP, or, JavaScript, dynamic variables in C# are "strongly bound", which means, it is not possible to put two different types of data inside the same dynamic variable at the same time (Probably, using an array). PHP or JavaScript both are "weekly bound" language because they support such flexibility.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;dynamic vs object&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;At first, these two appears to be the same, because, anything could be assigned to a variable of type object. That is, both of the followings are correct:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;object o = "Hello there!";&lt;br /&gt;dynamic d = "Hello there!";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;But, each of the following statements are not correct:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;Console.WriteLine(o.Length);//Compiler error. object class &lt;br /&gt;//doesn't have a Length property&lt;br /&gt;&lt;br /&gt;Console.WriteLine(d.Length);//This is correct, because, at run time&lt;br /&gt;//type of d is determined as string.&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Use of dynamic type give you extreme flexibility in managing the variables and data of your progams, but, these are handy especially in situations when you need to accept and parse data from external sources and you are not sure about the ype of the data. &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-9211788297085154031?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/dynamic-typing-late-binding-c-40.html' title='Dynamic typing and late binding in C# 4.0'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/9211788297085154031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/dynamic-typing-late-binding-c-40.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/9211788297085154031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/9211788297085154031'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/dynamic-typing-late-binding-c-40.html' title='Dynamic typing and late binding in C# 4.0'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-2zoyQSK_MOY/TVVvbnPMMyI/AAAAAAAAAKY/w11nkAtfj_Q/s72-c/Dynamic+Expression+C%2523.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-867352908678835788</id><published>2011-02-08T20:01:00.000-08:00</published><updated>2011-02-09T05:25:57.966-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net WebForm'/><category scheme='http://www.blogger.com/atom/ns#' term='URL Routing'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Asp.net MVP and URL Routing with WebForms. Part3 - Understanding URL Routing in Asp.net 4.0</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you have read &lt;a href="http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms.html"&gt;&lt;b&gt;Part1&lt;/b&gt;&lt;/a&gt; and &lt;a href="http://www.shubho.net/2011/02/aspnet-mvp-url-routing-with-webforms.html"&gt;&lt;b&gt;Part2&lt;/b&gt;&lt;/a&gt;&amp;nbsp;of this article, you already know about the fact that we've been exploring the basics of Asp.net Model View Presenter (MVP) and URL Routing in Asp.net WebForm. In this part of the article, we would learn the basics of URL Routing in Asp.net.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, before jumping into the details, lets ask a silly question, "What is URL Routing"?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If we are talking about a traditional Asp.net WebForm application, we already are well-aware of the fact that, if we have an aspx page at the following folder location:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;\Products.aspx?CategoryId=1&amp;amp;ProductId=1&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;We need to access the page using the following url:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;http://sitename/Products.aspx?CategoryId=1&amp;amp;ProductId=2&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There is no routing taking place here. The Requested file path "/Products.aspx" is simply being mapped to the physical file location "\Products.aspx" within the web root folder of the Asp.net application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, at some point some people started talking about implementing URLs which are cleaner, easy to remember, much SEO friendly and "hackable" (Parts of URL could be omitted to to get a different result). For example, instead of file extensions (Say, .aspx) and querystrings (say, CategoryId=1&amp;amp;ProductId=2) in the URLs they started suggesting the kind of URLs which are as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;http://sitename/Products/1/2&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;URLs as the above ones are :&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Easy to remember (For obvious reasons that it is smaller, simpler and more logical).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;More SEO friendly (Because it doesn't have ugly Query strings and extension which are never used in search queries in popular search engines like Google).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Hackable (Because if user hits&amp;nbsp;http://sitename/Products/1, the product listing page appears with listing items having category id=1).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, wait a minute. A web page in Asp.net WebForms has to be an .aspx page, no matter what is the URL. Its still the same even in Asp.net 4.0 (And perhaps will remain the same). So, the Product details page would still be the same one as we had earlier (http://sitename/Products.aspx), right? If that is so, how such SEO Friendly and &amp;nbsp;extension less URLs will be mapped to this actual aspx pages?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;That's where URL Routing comes. In Asp.net WebForm, URL Routing means mapping incoming URL Requests (Without extension and query string) to actual aspx file along with passing necessary parameters.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Asp.net framework (Since Asp.net 3.5 SP1 and in 4.0) has built-in support for custom URL routing which is easy enough to use and map extension less and SEO friendly hackable URLs to actual aspx pages.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What if there was no built-in URL Routing?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Pretty good question. If there was no built-in URL routing facility in Asp.net WebForm, and we still  require to implement it, we had to do something like the following:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Capture each and every request probably in Application_BeginRequest() in Global.asax to map each routing URL Request to a Rout Handler class, along with specifying the target page to execute.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Create a Rout Handler class, Parse URL to retrieve parameter values and to determine the target page to execute along with passing the parameter values via HttpContext.Items&amp;nbsp; and execute the target page.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Retrieve parameter values from HttpContext.Items and perform necessary executions in the Page.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The following figure depicts the basic idea: &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TVCy-tlLCYI/AAAAAAAAAKU/-BQTyqm82O0/s1600/URL+Routing+without+framework+support.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="URL Routing without Framework support in Asp.net" border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TVCy-tlLCYI/AAAAAAAAAKU/-BQTyqm82O0/s1600/URL+Routing+without+framework+support.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="font-family: Verdana,sans-serif;"&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Figure : URL Routing without Framework support in Asp.net&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Frankly speaking, the above model is not that easy to implement, specially, creating the RoutHandler. Lucky that we have URL Routing facility built in now with Asp.net WebForms which have built in Rout Handler. So, all we have to do is to define the URL Mappings in Application_BeginRequest() and develop the Pages. The framework does the rests.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;ABCs of URL Routing&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The newly added System.Web.Routing.RouteTable class has a static property "Routes", which is of type "RouteCollection" (Which is nothing but a Generic collection of type RouteBase). The "Routes" &amp;nbsp;property has two very important methods as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;RouterCollection routes = RouteTable.Routes;&lt;br /&gt;routes.MapRoute() //For mapping to MVC controller, used for MVC applications&lt;br /&gt;routes.MapPageRoute() For mapping to WebForm pages, used for MVP applications&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, in a WebForm application, the MapPageRoute() is needed to be used in the Global.asax as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;//Maps a URL http://mysite/Products/CategoryId/ProductId to http://mysite/Products.aspx along with&lt;br /&gt;//passing the parameter values for CategoryId and ProductId&lt;br /&gt;void RegisterRoutes(RouteCollection routes)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;routes.MapPageRoute(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"product-info", &amp;nbsp;//Just a friendly name which could be used to refer the route later&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"/Products/{CategoryId}/{ProductId}", // URL path with Query string parameters in {}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"~/Products.aspx"); // Actual Page which will handle and process the request&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void Application_Start()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;RegisterRoutes(RouteTable.Routes);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, guess what happens when a Request arrives at Application_Start for the following URL:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;http://mysite/Products/1/2&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;A Route entry is added to the RouteCollection for mapping the URL request to "/Products.aspx" and two parameter values are read from the URL CategoryId and ProductId. These are added to the Page.RouteData Hashtable as CategoryId=1 and ProductId=2.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The RouteHandler redirects to ~/Products.aspx and these two properties are available to retrieve in the Pages code behind as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int CategoryId = Convert.ToInt32(Page.RouteData["CategoryId"]);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int ProductId = Convert.ToInt32(Page.RouteData["ProductId:"]);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Or, the parameter values could also be retrieved in the Page markup as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:Label ID="Label1" runat="server" Text="&amp;lt;%$RouteValue:ProductId%&amp;gt;" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In reality, these parameter values are stored in Key/Value pairs in HttpContext.Current.Items (&lt;a href="http://www.shubho.net/2011/01/using-httpcontextcurrentitems-as-data.html"&gt;A cache storage that could be used as long as the current Request is being served.&lt;/a&gt;), which are internally being accessed by Page.RouteData or RouteValue expression in markup.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Different routing examples&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Routing with specifying default values and constraints&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;void RegisterRoutes(RouteCollection routes)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;routes.MapPageRoute(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"product-info", &amp;nbsp;//Just a friendly name which could be used to refer the route later&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"/Products/{CategoryId}/{ProductId}", // URL path with Query string parameters in {}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"~/Products.aspx", // Actual Page which will handle and process the request&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;true, // Check physical URL address&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;new RouteValueDictionary { //Default parameter values if not provided in URL&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ "CategoryId", 1 },&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ "ProductId", 1 } },&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;new RouteValueDictionary { // Constraints specified for parameters (Has to be 6 digit numeric value)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ "CategoryId", @"\d{6}" },&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{ "ProductId", @"\d{6}" } }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Capturing URL values with "Catch all"&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For capturing any other parameter value after the URL part "/Products/1/1", there is a way to specify the parameter patterns as {*parameterName}. For example, according to the following&amp;nbsp;RegisterRoutes() method, the "Details/En-US" will be captured by the "OtherParams" parameter for the following URL:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;/Products/1/1/Details/en-US&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;void RegisterRoutes(RouteCollection routes)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;routes.MapPageRoute(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"product-info", &amp;nbsp;//Just a friendly name which could be used to refer the route later&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"/Products/{CategoryId}/{ProductId}/{*OtherParams}", // {*OtherParams} will capture any value after&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// /Products/1/1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"~/Products.aspx", // Actual Page which will handle and process the request&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Retrieving actual URLs by route name&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;The friendly name (Which was provided while adding the Route) could be used to retrieve the actual URL from the RouteCollection to use the URL for redirection or some other stuff. Its as easy as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;string Url = Page.GetRouteUrl("product-info");&lt;br /&gt;Response.Redirect(Url);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Or, there is a short-cut:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;Response.RedirectToRoute("product-info");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Assigning NavigateUrl of Hyperlinks using Routes&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;There are a number ways to follow when a HyperLink's NavigateUrl property is to be assigned:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;One approach is to assign "Hard coded" URLs as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:HyperLink ID="HyperLink1" runat="server" &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;NavigateUrl="~/Products/1/1"&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;View Product Details &lt;br /&gt;&amp;lt;/asp:HyperLink&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;Or, another approach could be use Route expression as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:HyperLink ID="HyperLink1" runat="server" &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;NavigateUrl="&amp;lt;%$RouteUrl:CategoryId=1,ProductId=1%&amp;gt;"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;View Product Details&lt;br /&gt;&amp;lt;/asp:HyperLink&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The later approach is better because, if for any reason a route mapping is changed, you just need to modify the Route mapping in Global.asax and no where else. But, like the first case, if "Hard coded" URLs are implemented in application wide, you also need to change them in all places.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Enjoy URL Routing, its fun.&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-867352908678835788?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms-part3.html' title='Asp.net MVP and URL Routing with WebForms. Part3 - Understanding URL Routing in Asp.net 4.0'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/867352908678835788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms-part3.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/867352908678835788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/867352908678835788'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms-part3.html' title='Asp.net MVP and URL Routing with WebForms. Part3 - Understanding URL Routing in Asp.net 4.0'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_I631q7q9h40/TVCy-tlLCYI/AAAAAAAAAKU/-BQTyqm82O0/s72-c/URL+Routing+without+framework+support.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-5975628041756802018</id><published>2011-02-04T05:26:00.000-08:00</published><updated>2011-02-08T20:09:12.309-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Model View Presenter'/><category scheme='http://www.blogger.com/atom/ns#' term='URL Routing'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Asp.net MVP URL Routing with WebForms. Part2 - The Hello World MVP</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;In the &lt;b&gt;&lt;a href="http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms.html"&gt;previous post&lt;/a&gt;&lt;/b&gt;&amp;nbsp;we've discussed the background of Asp.net MVP and how it evolved. In this post we would try to understand the basics of MVP via a "Hello World" MVP example in Asp.net.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Just to recall, MVP stands for Model-View-Presenter, and, following is what they actually are:&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&lt;b&gt;Model&lt;/b&gt; is the domain or business object which encapsulates data and behavior. Model knows nothing about the two other components View and Presenter.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&lt;b&gt;View&lt;/b&gt; is the Aspx and CodeBehind which knows about the Models, and, which doesn't contain any application logic, except displaying data from Models.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&lt;b&gt;Presenter &lt;/b&gt;is the glue between the Model and the View, with very loose coupling. It accepts user inputs from the View, determines which business logic to execute and finally sets model to the View so that View can do the rests.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;So, if we like to see a figure to demonstrate the idea, it would be something like the following:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TUut4ELTbxI/AAAAAAAAAKM/HD4xyKH4tH8/s1600/MVP.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Interactions between Model - View - Controller in MVP" border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TUut4ELTbxI/AAAAAAAAAKM/HD4xyKH4tH8/s1600/MVP.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;Figure : Interactions between Model - View - Presenter in MVP&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;The picture is pretty self-explanatory, and, I am not describing the sequence of interactions between the different conceptual components in MVP.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Perhaps the most important thing about MVP is, Model, View and Presenter all are VERY loosely coupled. The Presenter is usually a concrete implementation, but, it doesn't directly know about the concreteView and the Model, because, it simply interacts with these two via their interfaces. This allows to change the View and the Model if required without much effect.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;The "Hello World" Model View Presenter example&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Following are the steps required to develop a very basic MVP example. In this example, we would implement an Asp.net WebForm application which allows user to view a User's detailed information in the output (May be by selecting a User Name from a DropDownList in a page)&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Step1 : Define the Model&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;As has been mentioned already, Presenter is very loosely coupled with the Model via Models Interfaces. So, an interface has to be defined for the Model.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;In our case, our Model is User. So, here goes the Interface:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public interface IUserModel&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;User GetUserById(long Id);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;And then, a concrete Model would implement this Model as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public class UserModel&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public User GetUserById(long Id)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return db.GetUserById(Id);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Step2 : Define the View&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Like the Model, Presenter is also loosely coupled with the View, and hence, there will be an interface for the View also.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Now, an important question is, what this interface should contain?&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Ideally, a View shouldn't contain any functionality or business logic. A View should only capable to get &lt;b&gt;Inputs &lt;/b&gt;from user and show &lt;b&gt;Outputs&lt;/b&gt;.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;So, an Interface for a View should only contain properties for the Inputs and Outputs it needs to care about.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;In our case, the View needs to get the User ID from user input (It gets it somehow when user selects a user in the DropDownList), and, show user's detailed information using the User object. So, the Interface should only contain the following two properties:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public interface IUserView&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;long UserId; //For Input&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;User UserDetails; //For Output&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Who will implement this View? The codebehind class ofcourse, right?&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Yes. In Asp.net WebForm application, either a Page or a User Control is a View element. So, their corresponding CodeBehind classes should implement the IUserView.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;In our case, we will have a simple aspx page to display user's detailed information. So, the CodeBehind class would be something like as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public class UserDetails : System.Web.UI.Page, IUserView&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public long UserId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Presenter will Get UserId via this property&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Convert.ToInt64(ddlUser.SelectedItem.Value);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public User UserDetails;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Presenter will set User Object via this property&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PopulateUserInfo(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Page_Load and other methods&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void PopulateUserInfo(User userDetails)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Display user info in GUI&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Note that, the UserId property has only the "get" method which returns the DropDownList's selected value (After converting to long). On the other hand, the&amp;nbsp;UserDetails property has only the "set" method, which is used by the Presenter to set result and thus displays user detail via the&amp;nbsp;PopulateUserInfo() method.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Step3 : Define the Presenter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Before jumping into creating the Presenter class, let us ask ourselves, what should the Presenter class needs to know about?&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Should the Presenter class have any property/method for setting Model(s)?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;From the figure above, it is obvious that, a Presenter should know about the Models, simply because it needs to execute business logic method on those. In our case, it should know about the IUserModel, but, in reality a Presenter may need to know about multiple Models to carry out a desired operation from user inputs.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;So, the Presenter should be able to access any number of Models (Well, it should access only the models it is logically related), and hence, it wouldn't be correct if the Presenter exposes some properties for setting Models (Because, it would limit the Models it can interact with). Rather, it should simply be able to instantiate any desired Model object and invoke business logic on it.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Should the Presenter class have any property/method for setting View?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Yes it should! Why? Simply because, the result has to be displayed via one single View component only, be it a User Control or an aspx page. If the Presenter knows about the View it needs to interact with, it can gather user input from it's corresponding property, and, set the resultant output to the corresponding property.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;So, there will be a Constructor inside the presenter class to accept a View. The Presenter will have a method to execute business method on the Model to get the result and set it to Views result property as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public class UserPresenter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IUserView view;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public UserPresenter(IUserView view)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.view = view;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void ObtainUserDetails()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Get input from User&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long userId = view.UserId;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Execute business method on Model to obtain result and set to View's property&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IUserModel model = new UserModel();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;view.User = model.GetUserById(userId&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif;"&gt;Step4 : Let the play begin!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana,sans-serif; font-size: small;"&gt;Once you carried out the above steps, you are ready for the show. In our case, we would ask the Presenter to carry out what it should do when user wants to see the detailed information of a User by selecting the target user's Name inside a DropDownList. Following is the modified CodeBehind code:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px;"&gt;&lt;pre class="brush:csharp"&gt;public class UserDetails : System.Web.UI.Page, IUserView&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public long UserId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Presenter will Get UserId via this property&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Convert.ToInt64(ddlUser.SelectedItem.Value);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public User UserDetails;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Presenter will set User Object via this property&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PopulateUserInfo(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Page_Load and other methods&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void PopulateUserInfo(User userDetails)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Display user info in GUI&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;void ddlUser_SelectedIndexChanged(Object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Instantiate Presenter object with setting this Page as it's view&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UserPresenter presenter = new UserPresenter(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Ask the Presenter to do what it should do&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;presenter.ObtainUserDetails();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;That's it! You just learned the simplest Model View Presenter Pattern implementation in Asp.net WebForm.&lt;/span&gt;&lt;br style="font-family: Verdana,sans-serif;" /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms-part3.html"&gt;In the next part of this article&lt;/a&gt;&lt;/b&gt;, we would learn the basics of URL Routing with Asp.net WebForm with some routing examples and other related things.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Stay tuned.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-5975628041756802018?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-with-webforms.html' title='Asp.net MVP URL Routing with WebForms. Part2 - The Hello World MVP'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/5975628041756802018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-with-webforms.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/5975628041756802018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/5975628041756802018'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-with-webforms.html' title='Asp.net MVP URL Routing with WebForms. Part2 - The Hello World MVP'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_I631q7q9h40/TUut4ELTbxI/AAAAAAAAAKM/HD4xyKH4tH8/s72-c/MVP.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-4156299974804766181</id><published>2011-02-03T03:13:00.000-08:00</published><updated>2011-02-04T05:43:55.008-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net WebForm'/><category scheme='http://www.blogger.com/atom/ns#' term='Model View Presenter'/><category scheme='http://www.blogger.com/atom/ns#' term='URL Routing'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Asp.net MVP and URL Routing with WebForms. Part1 - The Background</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Lets get back to Asp.net 2.0 days.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;One of your clients wants to implement SEO friendly URLs in his/her application. That is, instead of the URLs containing messy query string parameters:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: small;"&gt;http://www.mysite.com/products.aspx?category=book&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;He/she wants to see the URLs which look a lot cleaner and more SEO friendly:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;http://www.mysite.com/products/book.aspx&lt;/span&gt; (No Request parameter)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Or, he/she would be even happier with the following kinds of URLs&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;http://www.mysite.com/products/book&lt;/span&gt; (No Request parameter and no Extension)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Back in Asp.net 2.0 days, How did you implement such a requirement?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Let me answer this for you.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Those days IIS didn't support extension less URLs (IIS 6.0) and Asp.net MVC didn't born yet. So, we had to use the following widely used trick:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;URL Rewriting&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;This trick is usually applied to convert the URLs with Query String parameters to the following types of URLs (Which ends with an extension) in Asp.net applications.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: blue; font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.mysite.com/products/book.aspx&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The trick is to intercept each and every Request and use &lt;b&gt;HttpContext.RewritePath()&lt;/b&gt;, which does nothing but re-writing (Overwriting) the URL of the current HttpRequest with the original page URL within the current HttpContext, resulting in execution of the original page, instead of the incoming request. The client remains un-aware of this fact because he/she doesn't see and URL change in the browser address bar.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The operation is carried out in following steps:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;User hits&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue; font-size: small;"&gt;http://www.mysite.com/products/book.aspx&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; in the browser&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The request is intercepted at Asp.net and the URL is re-written in the HttpContext pointing to the original page&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: blue;"&gt;http://www.mysite.com/products.aspx?category=book&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The original page gets executed and response is being sent to browser, the current URL&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana,sans-serif; font-size: small;"&gt;&lt;span style="color: blue;"&gt;http://www.mysite.com/products/book.aspx&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; at the browser remains unchanged. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;At the very basic level, the following approach is usually being followed:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;void Application_BeginRequest(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;  string fullOrigionalpath = Request.Url.ToString();&lt;br /&gt;  if (fullOrigionalpath.Contains("/Products/Books.aspx"))&lt;br /&gt;  {&lt;br /&gt;    Context.RewritePath("/Products.aspx?Category=Books");&lt;br /&gt;  }&lt;br /&gt;  else if (fullOrigionalpath.Contains("/Products/DVDs.aspx"))&lt;br /&gt;  {&lt;br /&gt;    Context.RewritePath("/Products.aspx?Category=DVDs");&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; Some pluggable HTTP Modules are available to implement such URL re-writing in a cleaner and manageable approach, which allows to configure the mappings of incoming URLs to actual URLs using patterns/regular expressions, which is very handy.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; Now, what about URLs without any extensions, like the following?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;http://www.mysite.com/products/book&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Back in Asp.net 2.0 days, IIS 6 didn't support mapping extension less URLs to Asp.net execution engine. So, this had to be done with some tricks to map any incoming Request in IIS (With any extension) to Asp.net by using WildCard setting in IIS.&lt;br /&gt;&lt;br /&gt;So, a carefully engineered WildCard mapping with URL re-writing (Along with managing some other issues, such as handling PostBacks, Handling static requests for static resources etc) , it was possible to get the job done, despite the fact that, it wasn't a very easy thing to do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Asp.net MVC and IIS 7&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Well, MVC was totally new. The Model View Control concept was seen to be released as a framework, which allows to de-couple the user interfaces, control application flow with URL Routing and separate data, presentation and business logic using some built-in libraries available in Asp.net, perform unit-tests on the Controller, View and Models, which wasn't easy (Or, wasn't possible) to do so in WebForms. But perhaps the biggest different between the Asp.net WebForm and MVC from end-user's perspective is the extension less URLs which are much SEO friendly, makes more sense to the end-user and which are much cleaner (No URL parameters and no extension if IIS 7 or heigher is used).&lt;br /&gt;&lt;br /&gt;Well, the BAD news was, it was no longer possible to use the rich Data bound and other server controls that we used to love so much in Asp.net WebForms. In MVC, there is no Page life cycle, ViewState or server side controls. Just plain basic HTML stuff. Stunning, right?&lt;br /&gt;&lt;br /&gt;Yes it was. Despite the fact that Visual Studio does provide a quick start Asp.net MVC application structure with some pre-built Model-View-Controllers (And, some framework classes to do some common stuff easily), being not able to use the server controls any more was seemed to be a real BIG loss. It was kind of sacrificing the productivity and richness of Asp.net WebForms to get URL routing with support of separation of concerns (Model-View-Controller). To lot of people (Specially people like us, the developers), this wasn't really very encouraging.&lt;br /&gt;&lt;br /&gt;So, some people thought "How about doing something that allows to get the bests of both world. To be more specific, how about combining the power of URL routing and Separation of concerns (Provided by the MVC concept) with Asp.net WebForm?".&lt;br /&gt;&lt;br /&gt;This simple thought gave birth to the concept of Asp.net MVP.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is Asp.net MVP?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Asp.net MVP stands for Model View Presenter. Its roughly has the same concept that MVC has, with some minor differences (A bit more loose coupling). But, the biggest issue is, unlike the Asp.net MVC, Asp.net MVP is not a framework. Rather, it is nothing but the classic Asp.net WebForm with a conceptual change of working with the components which we are used to work with. In this concept, there will be Models, Views and Presenter where:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Model &lt;/b&gt;is the domain or business object which encapsulates data and behavior. Model knows nothing about the two other components View and Presenter.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;View &lt;/b&gt;is the Aspx and CodeBehind which knows about the Models, and, which doesn't contain any application logic, except displaying data from Models.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Presenter &lt;/b&gt;is the glue between the Model and the View, with very loose coupling. It accepts user inputs from the View, determines which business logic to execute and finally sets model to the View so that View can do the rests.&lt;br /&gt;&lt;br /&gt;Using the Model View Presenter approach in Asp.net WebForm allows to separate the concerns where the CodeBehinds doesn't contain any business logic, the application flow is controlled by the Presenter and the data is encapsulated by the Models, along with the great advantage of being able to use Asp.net server controls and their immense power to build rich functionality.&lt;br /&gt;&lt;br /&gt;So, Asp.net MVP concept allows to build Asp.net applications by using the concept of separating the concerns using the traditional Asp.net WebForms, which is definitely good. But perhaps the most important highlight of Asp.net 3.5 SP1 and onwards is the addition of URL routing facility which allows to map the incoming URL requests to (With the advantage of extension less URL in IIS7 and onwards) any aspx or Controller class, which gives the flexibility of working fully in MVC way with utilizing the full power of Asp.net Web Forms. The URL Routing allows to customize and route the incoming URLs in the same way Asp.net MVC allows to do so, and, the MVP concept allows to implement the application functionality using separation of concerns approach and utilize the full power of Asp.net server controls to build rich user interfaces rapidly.&lt;br /&gt;&lt;br /&gt;In the &lt;b&gt;&lt;a href="http://www.shubho.net/2011/02/aspnet-mvp-url-routing-with-webforms.html"&gt;next parts&lt;/a&gt;&lt;/b&gt; of this article we would explore the URL Routing facility of Asp.net Web Form and utilizing this to develop a simple application in MVP approach. Stay tuned for that.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-4156299974804766181?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms.html' title='Asp.net MVP and URL Routing with WebForms. Part1 - The Background'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/4156299974804766181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/4156299974804766181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/4156299974804766181'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/02/aspnet-mvp-url-routing-webforms.html' title='Asp.net MVP and URL Routing with WebForms. Part1 - The Background'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-7860905522126599274</id><published>2011-01-26T01:22:00.000-08:00</published><updated>2011-01-31T21:35:19.487-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Current Request Storage'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Per Request cache'/><category scheme='http://www.blogger.com/atom/ns#' term='HttpContext.Current.Items'/><title type='text'>Using HttpContext.Current.Items as a data storage for current HttpRequest</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Did you ever use HttpContext.Current.Items?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Chances are there you didn't. Why? Because this is a least known thing which people talks about, but, this could be a good friend of you "in need". Let's see what this is and how this could be used effectively to carry out our works in better approach.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;When an HttpRequest arrives at an Asp.net application, the Request is processed and the result is usually served back to the browser (Or, client application) as HTML output. Since Asp.net receives the Request, it goes though lots of steps. For example, it could go though the following steps:&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Application_BeginRequest in Global.asax (If defined)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Init event in custom HttpModules (If defined)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Page_Load other life cycle events events in a Page&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Page_Load other life cycle events events in a Master Page&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Page_Load and other life cycle events in User controls &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Method invocation on Dlls&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;While the Request is traversing through these steps, what if at step1 we have some data that we need to make available when the Request is traversing step2?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Lets see some examples where we may need to implement such requirement:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example1&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Suppose, we have an Application_BeginRequest() event handler at Global.asax which is executed for each Request, and, we retrieve some data from somewhere within this method:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;void Application_BeginRequest(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Retrieve some data from somewhere for each Request&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, we need to make sure that this data is available to the target Page which will get executed, to avoid to load the same data again in the Page. How would we pass the data to the Page?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example2&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Suppose, we have a user control which retrieves data from the database using an expensive operation. Once the user control finishes executing, the data is to be served to another user control which does some other stuff with the same data. How could we pass the data from this user control to another user control?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example3&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Perhaps we have some data at the Page_Load event (Say, current user object), which we need to make available to each and every method that get executed on the Business and Data access layers and we don't really want to modify each and every method to accept a new parameter just because we need to make the data commonly available to all methods. What do we do?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I know, there are alternatives. We may use different approaches while we deal with each above examples. The easiest and most general approach which is being used in such cases is as follows:&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Store the data in Session in Step1&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Retrieve the data from Session in Step2&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Clear the data from Session in Step2 (Clear it because this Session data is not required for any other Request)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Unfortunately, the Session state is being misused in such approach. Session should be used to store data which are required for the current Session, not for the current Request, and hence, this is not obviously a best practice to use in such cases. Also, if someone forgets to clear the data from the Session at Step2, a BUG is given birth to the system.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, the good news is, HttpContext.Current.Items is the perfect solution for such scenario. This is a simple HashTable which lets you store and retrieve data as long as the HttpRequest is alive and traversing through different steps in its life cycle.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, you could use HttpContext.Current.Items to store data in one step and retrieve later in other step as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;//Store data in Step1:&lt;br /&gt;HttpContext.Current.Items.Add("Key", "Value");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;//Retrieve data in Step2:&lt;br /&gt;object value = HttpContext.Current.Items["Key"];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This HashTable could be considered as your Cache storage as long as the Request is being processed. This is a good friend indeed and be friend it with, and get benefited.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-7860905522126599274?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/01/using-httpcontextcurrentitems-as-data.html' title='Using HttpContext.Current.Items as a data storage for current HttpRequest'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/7860905522126599274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/01/using-httpcontextcurrentitems-as-data.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/7860905522126599274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/7860905522126599274'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/01/using-httpcontextcurrentitems-as-data.html' title='Using HttpContext.Current.Items as a data storage for current HttpRequest'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-3742715320640028806</id><published>2011-01-24T10:52:00.000-08:00</published><updated>2011-01-31T21:46:57.618-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><category scheme='http://www.blogger.com/atom/ns#' term='Predictable'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ClientIDMode'/><title type='text'>Understanding ClientIDMode="Predictable" in Asp.net 4.0 with Examples</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you are an Asp.net developer, you may already be well-aware of the fact that, Asp.net 4.0 lets you control how the ID property value of the server controls gets generated in the HTML markup. Before version 4.0, this wasn't possible, and, the ID property value of all server controls used to be generated using the nesting structure of the control hierarchy using some complex syntax which was not so readable and usable.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It was very common to see a server control's ID property value to be generated as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;input name="ctl00$MainContent$GridView1$ctl04$TextBox1" type="text" &lt;br /&gt;value="Matin" id="ctl00_MainContent_GridView1_ctl04_TextBox1" /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Frankly speaking, we, the developers used to not to bother too much about these generated ID's in the HTML markups. Why? well, we somehow got used to the fact that the generated ID's were not really usable and if we ever needed to access any element on client side, we either used to add some custom properties to the server controls, or, used JQuery with using some searching pattern to find out the element we need and do the rest. Well, it wasn't a "very hard thing to do", but, it was something we had to do each time we need to access elements on client side, and, this used to require some more time to finish our works.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Let us see an example. suppose we are in need of showing some Employee information using a GridView as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TT2J_TEufzI/AAAAAAAAAJ8/SyfWuuQnjF8/s1600/GridViewListing.jpg"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TT2J_TEufzI/AAAAAAAAAJ8/SyfWuuQnjF8/s1600/GridViewListing.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; A simple GridView showing some listing data&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Lets assume the requirement is to show the user's name (Or, may be to show user profile) when user clicks the "View" button.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Let's look at the XHTML Markup of the GridView:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" ShowHeader="false"&amp;gt;&lt;br /&gt;    &amp;lt;Columns&amp;gt;&lt;br /&gt;        &amp;lt;asp:TemplateField&amp;gt;&lt;br /&gt;            &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;                &amp;lt;asp:TextBox ID="TextBox1" Text='&amp;lt;%#Eval("Name") %&amp;gt;' runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;                &amp;lt;asp:Button ID="Button1" runat="server" Text="View" /&amp;gt;&lt;br /&gt;            &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;    &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you can see, the Name property value of each employee is being shown using a &amp;lt;asp:TextBox&amp;gt; server control, and, an &amp;lt;asp:Button&amp;gt; control is used to display the "View" button on the browser. Both these are inside the &amp;lt;ItemTemplate&amp;gt; element to ensure that, the TextBox and the Button is displayed in each row.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, according to the requirement, we need to display the employee profile (Only "Name" in this case) when the "View" button was clicked. For simplicity, let's assume that the "Name" is to be displayed via an "alert" message.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;We have a problem&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In order to show emplyee's Name using Javascript, we need to access the TextBox of the corresponding row. Question is, when a Button is clicked on a particular row, How do we access the Name of the Employee inside a TextBox on the same row using JavaScript?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;We need to know the TextBox client ID, right? Let's see how we manage this.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Here is the HTML that gets rendered in the browser for the GridView:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TT2RrzEKfBI/AAAAAAAAAKA/ZDmaDzGxrZI/s1600/RenderedHTML.jpg"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TT2RrzEKfBI/AAAAAAAAAKA/ZDmaDzGxrZI/s640/RenderedHTML.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Rendered HTML for GridView&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you can see, the ID of the TextBoxes and ID of the Buttons (Marked in red border) are generated by Asp.net, and, these ID's are not really "Predictable" for use while we are writing server side codes. It is obvious that, the generated ID value depends on the hierarchy of the server controls in which the are nested.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Naturally, it is hard and unreliable to write client side scripts (javascripts) to read the value of other element in the same row, in such situations. So, to avoid guessing client IDs of element in the same row, a common strategy was to "feed" the client ID of the elements in the server side code. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Not clear? Well, let's see how we used to manage the overall implementation for this example:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. Define an "OnRowDataBound" (or similar) event method to the data bound control, which gets fired when each data is bound to the data bound control.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In our case, we used to add the following event to the GridView:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" ShowHeader="false"&lt;br /&gt;onrowdatabound="GridView1_RowDataBound"&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. Find target controls inside this event method (Which gets fired for each row) and add an "onclick" javascript method as an attribute of the Button control along with passing the necessary values as method parameter:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)&lt;br /&gt;{&lt;br /&gt;    if (e.Row.RowType == DataControlRowType.DataRow)&lt;br /&gt;    {&lt;br /&gt;        Employee emp = e.Row.DataItem as Employee;&lt;br /&gt;        if (emp != null)&lt;br /&gt;        {&lt;br /&gt;            Button button = e.Row.FindControl("Button1") as Button;&lt;br /&gt;            if (button != null)&lt;br /&gt;            {&lt;br /&gt;                button.Attributes["onclick"] = string.Format("return ViewDetails('{0}')", emp.Name);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. Define a JavaScript method to display the necessary information (Employee name in this case)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush:javascript"&gt;function ViewDetails(Name) &lt;br /&gt;{&lt;br /&gt;    alert(Name);&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Not very elegant, right?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;ClientIDMode control property in Asp.net 4.0&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In Asp.net 4.0, a new property called "ClientIDMode" has been added the the Control class which lets you control the ID values for the Server controls the way you like. To be very specific, if you set the ClientIDMode="Predictable" (With some other minor settings), you know in advance what the exact client ID of the server controls will be (No matter what nesting structure the control is within, and, no matter which DataBound control uses them). This is really handy if you need to access those element using some client side scripts like JavaScript.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Before seeing a practical example of this property value, let us see the possible options of this property:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;u&gt;&lt;span style="font-size: small;"&gt;ClientIDMode="AutoID"&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The classic mode, which is default. ID's are generated by Asp.net run time using the existing logic.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;u&gt;&lt;span style="font-size: small;"&gt;ClientIDMode="Static" &lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Lets you specify a static ID for the server control, which remains unchanged no matter where the server control is used. Also makes sure that, any nested/child server controls doesn't use this contro's ID as a part of thier ID values. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;u&gt;&lt;span style="font-size: small;"&gt;ClientIDMode="Predictable"&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Lets you control the client ID values the way you like, with some other property settings. More on this later.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;u&gt;&lt;span style="font-size: small;"&gt;ClientIDMode="Inherit"&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Specifies that, the control should inherit the ClientIDMode from it's immediate parent server control&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The ClientIDMode could be configured in the Application level (in web.config), or, in the Page level, or, in the Control level. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, let us see how the ClientIDMode property could be used to control the client IDs for the nested server controls which are used inside a DataBound control (In our example, GridView).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The same GridView markup is now as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush:xml"&gt;&amp;lt;asp:GridView ID="GridView1" Visible="false" ClientIDMode="Static" ShowHeader="false" ClientIDRowSuffix="Id" AutoGenerateColumns="False" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;Columns&amp;gt;&lt;br /&gt;        &amp;lt;asp:TemplateField&amp;gt;&lt;br /&gt;            &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;                &amp;lt;asp:TextBox ID="TextBox1" ClientIDMode="Predictable" Text='&amp;lt;%#Eval("Name") %&amp;gt;' runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;                &amp;lt;asp:Button ID="Button1" runat="server" ClientIDMode="Predictable" OnClientClick='return ViewEmployeDetails(this.id)' Text="View" /&amp;gt;&lt;br /&gt;            &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;    &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Using the ClientIDMode property&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Lets try to understand the facts with this Markup:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The GridView has ClientIDMode = "Static". This implies that the GridView's ID will be "GridView1" and no child server control's Id will have "GridView1" as part of their ID values.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The TextBox1 has ClientIDMode = "Predictable". This implies that the TextBox's ID will be of TextBox_X format. Here the value of X depends on another property of the DataBoundControl (ClientIDRowSuffix). If ClientIDRowSuffix property is not configured, X is just a sequence of values starting from 0 (TextBox_0, TextBox_1 and TextBox_2 here). On the other hand, if ClientIDRowSuffix property is configured with a property name of the Entity with is being bound (ClientIDRowSuffix="Id" here), X is replaced by the value of the corresponding property (TextBox_ID in this case).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Button1 also has ClientIDMode = "Predictable". So, the same rule also applies here as above.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, if we have an Employee class as follows:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public class Employee&lt;br /&gt;{&lt;br /&gt;    public int Id&lt;br /&gt;    {&lt;br /&gt;        get;&lt;br /&gt;        set;&lt;br /&gt;    }&lt;br /&gt;    public string Name&lt;br /&gt;    {&lt;br /&gt;        get;&lt;br /&gt;        set;&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;And, if we initialize the GridView with some Employees as follows:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    var Employees =&lt;br /&gt;    new List&amp;lt;Employee&amp;gt; {&lt;br /&gt;        { new Employee { Id = 10, Name = "Shubho" } },&lt;br /&gt;        { new Employee { Id = 11, Name = "Titu" } },&lt;br /&gt;        { new Employee { Id = 12, Name = "Matin" } }&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    GridView1.DataSource = Employees;&lt;br /&gt;    GridView1.DataBind();&lt;br /&gt;}&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The HTML that gets generated now is as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TT2uH9ltF0I/AAAAAAAAAKE/csh247K94Fk/s1600/RenderedHTML2.jpg"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_I631q7q9h40/TT2uH9ltF0I/AAAAAAAAAKE/csh247K94Fk/s640/RenderedHTML2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; HTML markup that gets generated using ClientIDMode property&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, ID of the Text boxes are getting generated in the pattern "TextBox1_X" property (TextBox1_10, TextBox1_11 and TextBox1_12), and, ID of the buttons are getting generated in the same pattern(Button1_10, Button1_11 and Button1_12).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Also note that, because we used ClientIDRowSuffix="Id" for the GridView, the X values are replaced by the ID of the Employees. If we didn't use this property, the value of X would be replaced by a sequenece number starting from 0 and the generated Id's for the text boxes and the buttons would be (TextBox1_0, TextBox1_1 and TextBox1_2) and (Button1_0, Button1_1 and Button1_2) respectively.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, here is the benefit of having the control ID's having a predictable form:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As each Button has the form Button1_X and each TextBox has the form TextBox1_X, when user clicks a button, we can get the corresponding Employee ID by replacing the "Button1_" with a blank string "". Once we know an Employee's ID, we can construct the ID of each control in the same row which has ClientIDMode="Predictable". That is, we can construct the corresponding TextBox ID as "TextBox_" + ID.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To simplify this further, we can just replace "Button1" with "TextBox1" in the Button's ID to get the corresponding TextBox ID. Once we know the ID of the TextBox, accessing it's value is a matter of child's play.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, here is the JavaScript method definition that we used as an "OnClientClick" handler for the Buttons:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush:javascript"&gt;function ViewEmployeDetails(idOfButton) &lt;br /&gt;{&lt;br /&gt;    var idOfTextBox = idOfButton.replace("Button1", "TextBox1");&lt;br /&gt;    alert(document.getElementById(idOfTextBox).value);&lt;br /&gt;    return false;&lt;br /&gt;}&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you can see, no need of define any "OnRowDataBound" event method now just to attach JavaScript methods as attributes with necessary parameters, and, setting the ClientIDMode and related property values does the work. This lets us get rid of the extra works that we required to do earlier, adn thus save some of our valuable times and let us feel that we are now able to work smarter then earlier.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Smart work from Asp.net 4.0 team!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-3742715320640028806?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/01/understanding-clientidmodepredictable.html' title='Understanding ClientIDMode=&quot;Predictable&quot; in Asp.net 4.0 with Examples'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/3742715320640028806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/01/understanding-clientidmodepredictable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/3742715320640028806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/3742715320640028806'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/01/understanding-clientidmodepredictable.html' title='Understanding ClientIDMode=&quot;Predictable&quot; in Asp.net 4.0 with Examples'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_I631q7q9h40/TT2J_TEufzI/AAAAAAAAAJ8/SyfWuuQnjF8/s72-c/GridViewListing.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-8119383712473670621</id><published>2011-01-22T03:00:00.000-08:00</published><updated>2011-01-31T22:37:50.596-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>HTTP Error 404.13 - Not Found : The request filtering module is configured to deny a request that exceeds the request content length</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I was developing an application that allows user to upload files to the server using the &amp;lt;asp:FileUpload/&amp;gt; control. In order to make sure that users can upload large files, I configured the web.config as follows to allow larger files to be uploaded (The default setting is 4 MB):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;httpRuntime maxRequestLength="512000"/&amp;gt;&amp;lt;!--To allow up to 500MB--&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;While testing the file upload functionality from within the visual studio development server (Right clicking on the aspx file and selecting browse), I found it working quite fine. But surprisingly, after hosting the Asp.net web site onto IIS (IIS 7), I found the file uploading functionality was no longer working, and, it was broken while trying to upload large files (I was trying with a file over 40MB in size). Following is the screen shot of the error message that I got:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TTmYZa3TY8I/AAAAAAAAAJo/hEeEkXqjrFw/s1600/FileUploadException.png"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_I631q7q9h40/TTmYZa3TY8I/AAAAAAAAAJo/hEeEkXqjrFw/s640/FileUploadException.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; The error message from IIS while trying to upload a large file&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The error page also suggested me to do the followings:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #d9ead3; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;"Verify the configuration/system.webServer/security/requestFiltering/requestLimits@maxAllowedContentLength setting in the applicationhost.config or web.config file."&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, as suggested, I did the following configuration in the web.config of my Asp.net web site(By setting maxAllowedContentLength value in Bytes):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;system.webServer&amp;gt;&lt;br /&gt;  &amp;lt;modules runAllManagedModulesForAllRequests="true"/&amp;gt;&lt;br /&gt;  &amp;lt;security&amp;gt;&lt;br /&gt;    &amp;lt;requestFiltering&amp;gt;&lt;br /&gt;      &amp;lt;requestLimits maxAllowedContentLength="512000"&amp;gt;&amp;lt;/requestLimits&amp;gt;&lt;br /&gt;    &amp;lt;/requestFiltering&amp;gt;&lt;br /&gt;  &amp;lt;/security&amp;gt;&lt;br /&gt;&amp;lt;/system.webServer&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush:xml"&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Guess what, &lt;b&gt;it didn't work out!&lt;/b&gt; After modification when I tried to upload the file again, the same problem occured again. What happened?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;According to the error message, the web.config or applicationhost.config should be configured according to the above suggestion. Modifying web.config didn't work out. So, the applicationhost.config could be modified to see what happens.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Wait a minute! the applicationhost.config is the configuration file of IIS (IIS7.0 or heigher). Does that mean IIS has a Request size validation? &lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Yes it has. Until IIS 7.0 there was no Request size validation, but since IIS 7.0, the Request length is verified by IIS first, before deliverying the Request to Asp.net.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, to be true, it doesn't really make any sense to increase the maxAllowedContentLength value in web.config. The Request dies even before reaching the Asp.net. So, whatever is to be configured, it has to happen at IIS.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, as I figured out, there are two ways you can configure this value in IIS:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;1. Configuring the applicationhost.config&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open  the %WINDIR%\System32\inetsrv\config\applicationHist.config in editor and specify the following configuration within the security/requestFiltering  section(By setting maxAllowedContentLength value in Bytes):&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;requestFiltering&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;    &amp;lt;requestLimits maxAllowedContentLength="512000000"&amp;gt;&amp;lt;/requestLimits&amp;gt;&lt;br /&gt;&amp;lt;/requestFiltering&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Note:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Modifying the above configuration worked for me in one PC (Running Windows 7+IIS 7.0), but, didn't work on another one (Running Windows Vista + IIS 7.0). After configuring the applicationHost.config file, I tried to upload the large file and the same error message was appearing again. I don't know why, but, if you have the same experience, applying the following approach (Configuring via IISManager) would definitely work.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;2. Configuring via IISManager&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Open the IIS Manager and select the site or application you need to configure in the left panel&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Select "Features View" and double click on the "Request Filtering" icon.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTqzng_7anI/AAAAAAAAAJw/VdlmxZmwV6U/s1600/RequestFiltering.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTqzng_7anI/AAAAAAAAAJw/VdlmxZmwV6U/s1600/RequestFiltering.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Request Filtering&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Note :&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you can't find the "Request Filtering"icon, you need to install the IIS Administration Pack from this link : &lt;a href="http://www.iis.net/download/AdministrationPack"&gt;http://www.iis.net/download/AdministrationPack&lt;/a&gt;. This is a lightweight installation which shouldn't take too much time on a decent internet speed.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Double clicking on the "Request Filtering"icon will bring up the Request filtering configuration window. Right click on the window and select the "Edit Feature Settings" option:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_I631q7q9h40/TTq0gxkwogI/AAAAAAAAAJ0/VRkct9hQFYE/s1600/EditFeature.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_I631q7q9h40/TTq0gxkwogI/AAAAAAAAAJ0/VRkct9hQFYE/s1600/EditFeature.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Edit Feature Settings option in IIS&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Finally, specify the Maximum allowable content length (In Byte) in the following window and click "OK" to save:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTq1Hy9XJpI/AAAAAAAAAJ4/ojh9W_Chms0/s1600/MaxSize.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTq1Hy9XJpI/AAAAAAAAAJ4/ojh9W_Chms0/s1600/MaxSize.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Specifying Maximum allowable content length in Bytes&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This worked perfect for me and I was able to upload the large file now without any problem. Hope, this will work for you too :)&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-8119383712473670621?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/01/http-error-40413-not-found-request.html' title='HTTP Error 404.13 - Not Found : The request filtering module is configured to deny a request that exceeds the request content length'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/8119383712473670621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/01/http-error-40413-not-found-request.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/8119383712473670621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/8119383712473670621'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/01/http-error-40413-not-found-request.html' title='HTTP Error 404.13 - Not Found : The request filtering module is configured to deny a request that exceeds the request content length'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_I631q7q9h40/TTmYZa3TY8I/AAAAAAAAAJo/hEeEkXqjrFw/s72-c/FileUploadException.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-3650968807056721573</id><published>2011-01-19T02:27:00.000-08:00</published><updated>2011-01-31T23:00:49.813-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>Exception Handling best practices in N-Tier Asp.net applications</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;"How do you manage Exceptions in your Asp.net applications?"&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Pretty simple question, but not that much simple to answer. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;We are good at making things. But, may be, we are not equally good at designing systems which properly handles errors with gracefulness, provides user with a polite message about the error and doesn't leave him/her in a dead-end, and internally, notifies the system developers with enough details so that the poor developers don't feel like they need to learn some rocket science to fix those errors.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you ask me how do I define a good Exception management for an Asp.net application, I would tell you the followings:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Your system has a good exception management if:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;It doesn't show unnecessary technical error descriptions when an error occurs, rather, apologize to user with a screen that something went wrong and lets him/her go back to the system.&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;When an error occurs, it immediately notifies technical teams with detailed information for troubleshooting, along with logging error details.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;It has exception management done in a central and manageable manner without unnecessary try..catch...throw spread across the overall code base.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, if we want to ensure a good exception management in our Asp.net application, we need to meet these three high level objectives.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;The bare minimum thing you should do&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you are the laziest developer in the world (Like what I was a few years ago), you should at least take advantage of what Asp.net offers you to handle exceptions gracefully. All you need is to perform the following two simple steps:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Enable customError in web.config:&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;customerrors defaultredirect="Error.aspx" mode="On"&gt;&lt;br /&gt;&lt;/customerrors&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you might know already, this little configuration instructs the Asp.net run time to redirect to Error.aspx whenever an error occurs in your Asp.net application. Setting mode="On" instructs to redirect always, which may not be a good choice if you are developing your system. Setting mode="RemoteOnly" should be perfect choice for you as this results in redirection to the error page only when page is browsed from a remote machine. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Define an error page:&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You obviously need to create an error page, right? The Error.aspx page you may like to have is as follows:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_I631q7q9h40/TTWcD-31MKI/AAAAAAAAAJY/2oVnIWSFmik/s1600/ErrorPage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="274" src="http://3.bp.blogspot.com/_I631q7q9h40/TTWcD-31MKI/AAAAAAAAAJY/2oVnIWSFmik/s640/ErrorPage.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; The simplest error page &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, I created the Error.aspx as follows, in my Asp.net web site created using Visual Studio 2010:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Markup:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:xml"&gt;&amp;lt;@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeFile="Error.aspx.cs" Inherits="Error" &amp;gt;&lt;br /&gt;&lt;asp:content contentplaceholderid="HeadContent" id="HeaderContent" runat="server"&gt;&lt;br /&gt;&lt;/asp:content&gt;&lt;br /&gt;&lt;asp:content contentplaceholderid="MainContent" id="BodyContent" runat="server"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;asp:panel id="pnlError" runat="server" visible="false"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;asp:label id="lblError" runat="server" text="Oops! An error occurred while performing your request. Sorry for any convenience."&gt;&lt;/asp:label&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;asp:label id="lblGoBack" runat="server" text="You may want to get back to the previous page and perform other activities."&gt;&lt;/asp:label&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;asp:hyperlink id="hlinkPreviousPage" runat="server"&gt;Go back&lt;/asp:hyperlink&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/asp:panel&gt;&lt;br /&gt;&lt;/asp:content&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;CodeBehind:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public partial class Error : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.Title = "Error occurred";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string PreviousUri = Request["aspxerrorpath"];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!string.IsNullOrEmpty(PreviousUri))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pnlError.Visible = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hlinkPreviousPage.NavigateUrl = PreviousUri;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;After performing these two steps, whenever an unhandled exception occurs now, Asp.net run time will redirect the current request to the error page (In this case, Error.aspx) with a query string parameter "aspxerrorpath" with the value being set with the previous page URL. So, Error.aspx.cs is able to read the previous page URL from this request parameter and display a graceful error message with a "Go back" hyperlink to let the user go back to the previous page. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To test whether it works or not, I created an Exception scenario as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;User browses Default.aspx and clicks on "Do Something"button.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The Button click event handler method throws an Exception.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Asp.net run time catches this Exception and redirects the user to the Error page.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It works pretty fine as expected.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Who will fix the error?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Very important question. Its good that your system now gracefully handles exceptions. But this isn't enoug, right? We need a mechanism to catch the exceptions and notify our technical team or log the exception details somewhere so that they can analyze and fix the error as early as possible.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, we need a way to capture the Exceptions and do something of our own. Let's see how we can do that.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Page.OnError()event method on CodeBehind class&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Each Asp.net Page CodeBehind class inherits the System.Web.UI.Page class and can override the OnError() event of the base class. Doing this lets the page capture any unhandled exception using the following piece of code:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected override void OnError(EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(string.Format("Error.aspx?aspxerrorpath={0}",Request.Url.PathAndQuery));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As we typically have multiple pages in our Asp.net applications, it would be smarter if we define the OnError() inside a base class (Say, BasePage) for all CodeBehind pages as follows:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public class BasePage : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public BasePage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO: Add constructor logic here&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnError(EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Report Error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exception ex = Server.GetLastError();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorHandler.ReportError(ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server.ClearError();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(string.Format("Error.aspx?aspxerrorpath={0}",Request.Url.PathAndQuery));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This would allow us to get rid of implementing OnError event method on each and every CodeBehind pages.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Application_Error() event in Global.asax&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As you might know already, you can define Application level events inside the Global.asax file, which lets you define a global error handler event method Application_Error(). If you define an Application_Error() event method in this file, each and every unhandled exceptions will be captured by this event method and you can do whatever you want. In our case, primarily we would want to report the exception details inside this event method, along with redirecting user to the error page:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;void Application_Error(object sender, EventArgs e)&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code that runs when an unhandled error occurs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Report Error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exception ex = Server.GetLastError();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorHandler.ReportError(ex); //Notifies technical team about the error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server.ClearError();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(string.Format("Error.aspx?aspxerrorpath={0}",Request.Url.PathAndQuery));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you handle exceptions via the Application_Error event handler at Global.asax, you do not need to handle exceptions via the Page.OnError() event handler. So, life gets event easier.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Shouldn't the Exceptions be handled in CodeBehind classes?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is a good question. One can obviously suggest to handle Exceptions in the CodeBehind classes as follows:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Do some stuff&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; businessObject.SaveObject(object);&lt;br /&gt;}&lt;br /&gt;catch(Exception ex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; ErrorHandler.ReportError(ex); //Notifies technical team about the error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(string.Format("Error.aspx?aspxerrorpath={0}",Request.Url.PathAndQuery));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;But, the CodeBehind classes could have many codes which could invoke methods on some other tiers and, Exceptions could be thrown from those methods. Moreover, there will be many CodeBehind classes. So, in the above manner, the try..catch Exception handling codes has to be written in hundreds of places (Not to forget the fact that, if we need to change in Exception handling mechanism, we also would require to change the codes in hundreds of places). Does this really sound a smart thing to do when we can handle the Exceptions from within a central place (Application_Error())? Absolute no. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, DO NOT WRITE any try..catch block inside the CodeBehind classes and keep it absolutely free of any ugly error handling mechanism (Well, there may be an exception to this suggestion, will see shortly). Utilize the power of Asp.net and keep your Exception handling mechanism simple and manageable from a central place.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;I have an N-Tier Asp.net application. How should I handle exceptions?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is a classic question. Multi-tier applications are pretty common these days, and, what should be a proper exception handling policy to follow in such applications? Should we handle exception in each tier using try...catch blocks? Should we throw exceptions from a tier to an upper tier? Should we log exception inside each tier? &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I would try to simplify the answers as follows. You should do whatever is required to meet your high level objectives. That is, error reporting to the technical team and graceful exception handling to the end-user. You also need to make sure that you are not writing some repeating codes to handle the exceptions in multiple places.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, let us try to derive an exception handling policy for an N-tier Asp.net application by analyzing our high level objectives, and, using some common sense.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;We need to handle Exceptions gracefully&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It doesn't matter how many tiers we have in our Asp.net application. As long as we have an Application_Error event defined in Global.asax, nothing can escape it. So, no matter where an Exception occurs in our multi-tier application, the Exception will be captured in Global.asax and it would do whatever it has been instructed to do (Redirect user to an error page).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;We need to notify Exception details to technical team&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Yes, the Application_Error event method also reports exception details to the technical team via some mechanism. But, wait a minute! Should we really need to notify the technical team about each and every exception? may be not.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;What are the exceptions we need to report to the technical team?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Suppose, a Data Access Layer method is being invoked in the DAL layer (A separate dll) within our application, and, the DAL method may throw an exception from the database. Should we report such Exceptions from the Data Access Layer to the technical team? Obviously yes.Why? Because the error has to be fixed in the Database routines.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If any unhandled Exception (Say, a NullReferenceException) is being thrown from any part of the codes (Be it generated from within the CodeBehind classes, or, from any other tiers) should it be reported to the technical team? Obviously yes. Why? For the same very reason that the error has to be fixed in the codes with some good defensive programming.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Now, suppose we are taking an input from the user and invoking a business method with the input parameters. The business method expects a particular parameter value to be within a certain range. If it doesn't fall into that range, it throws an Exception with an appropriate message. Should we report this kind of exceptions to the technical team? Obviously not. Why? Because, this exception is usually thrown with an intention to let user know that he has done something wrong and the exception message is used to guide him/her to do the right thing.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Also, suppose a ThreadAbortException is being generated as a result of using Response.Redirect() in the CodeBehind classes. Should we notify the developers about this exception after capturing inside the Application_Error event handler? Obviously not. Why? Because, this particular exception is not being generated as a programmatic or system failure, and, there is nothing to fix. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, in a multi-tier application Exceptions could be generated from each tier, and, these exceptions could be of different general categories, and, based upon their category these Exceptions need to be handled in different approach. Some particular category of exceptions are needed to be reported to some particular technical teams, some particular category of exceptions need not to be reported to any technical team, rather, these are to be used to guide user to use the system correctly, and, some particular category of exceptions just needed to be ignored. So, this generates a need to develop an Exception hierarchy which could be used commonly across all different tiers within the application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Exceptions generated from each tier would be categorized according to their corresponding general type (When an Exception occurs, this would be done by wrapping an Exception with a particular type of Exception from the Exception hierarchy) and will be thrown to the upper tier so that, an exception management policy can determine the category of the exceptions and handles those judiciously.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;The custom exception hierarchy&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Following could be a very basic Exception hierarchy that could be used to wrap up the original exceptions and categorize them so that, these exceptions could be handled using a good exception management policy.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTaV-iE35YI/AAAAAAAAAJk/YyZnalCQKdw/s1600/ExceptionHierarchy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTaV-iE35YI/AAAAAAAAAJk/YyZnalCQKdw/s1600/ExceptionHierarchy.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TTaU8i0y7NI/AAAAAAAAAJg/xpVNlWVWAKw/s1600/ExceptionHierarchy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; A basic custom Exception hierarchy&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;The Exception class names are self-explanatory. They all inherits a base exception class BaseException which itself inherits the Exception class.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;So, this Exception hierarchy may be used as follows:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Inside DAL methods:&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;Catch any Exception that might get thrown by invoking database operations, wrap it inside a DALException, and throw to the upper tier.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public List&amp;lt;User&amp;gt; GetUsers()&lt;br /&gt;{&lt;br /&gt;    string SP = AppConstants.StoredProcedures.GET_ALL_USERS;&lt;br /&gt;&lt;br /&gt;    IDataReader reader = null;&lt;br /&gt;    List&amp;lt;User&amp;gt; users = new List&amp;lt;User&amp;gt;();&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;     using (DbCommand dbCommand = Database.GetStoredProcCommand(SP))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;     {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;   using (reader = Database.ExecuteReader(dbCommand))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  {&lt;br /&gt;                while (reader.Read())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&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; User user = User.CreateFromReader(reader);&lt;br /&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;     users.Add(user);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;     }&amp;nbsp;&amp;nbsp; &lt;br /&gt;    }&lt;br /&gt;    catch(Exception ex)&lt;br /&gt;    {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;     throw new DALException("Failed to retrieve User.", ex);&lt;br /&gt;    }&lt;br /&gt;    return users;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Inside business methods:&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Generally, we need not to handle Exception inside the business methods while calling this (Or any) DAL methods. Why? Because, the DAL methods are already handling exceptions. So, whenever any exception occurs while invoking a DAL method from the business methods, the exception will be propagated to the call hierarchy across the upper tiers, and will be caught by the global exception handler Application_Error().&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, you just invoke the DAL method as follows in one of your business methods:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public List&amp;lt;User&amp;gt; GetUsers()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; UserDAO userDAO = new UserDAO();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;User&amp;gt; users = userDAO.GetUsers();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(users != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Do other stuffs &lt;br /&gt;&amp;nbsp;&amp;nbsp;  }&lt;br /&gt;&amp;nbsp;&amp;nbsp;  //Do other stuffs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return users;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;But, as has been said already, we may need to throw some custom exceptions inside a few business methods as follows (To let the caller notify that a certain condition has to be met in order to proceed the operation):&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public void Add(User user)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(user.Age &amp;amp;lt; 18)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new BLLException("Not allowed for kids!"); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserDAO userDAO = new UserDAO();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; userDAO.Add(user);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Inside CodeBehind classes&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Only Exceptions of type BLLException are to be handled here. Why? because, BLLException actually represents a business logic validation error (With a validation error message, see above example) which is needed to be displayed to the end-user to guide him/her to provide correct input or carry out his/her operations correctly. If we do not handle BLLException in the CodeBehind classes, these exceptions will be propagated to the global error handler Application_Error and it will either ignore the exception, or, report the exception to the technical team, neither of which is desired.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, following is how we may handle the BLLExceptions in CodeBehind classes:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected bool AddUser()&lt;br /&gt;{&lt;br /&gt;    UserManager userManager = new UserManager();&lt;br /&gt;    User user = PopulateUserFromInput(); &lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;     userManager.Add(user);&lt;br /&gt;    }&lt;br /&gt;    catch(BLLException ex)&lt;br /&gt;    {&lt;br /&gt;&amp;nbsp; &amp;nbsp;     ShowErrorMessage(ex.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;     return false;&lt;br /&gt;    }&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;Inside Application_Error() event in Global.asax&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, when an Exception is bubbled up to this global exception handler method, it could either be a ThreadAbortException, or, a DALException, or, a BLLException or, an unhandled exception for which we didn't catch it using any try...catch block inside our Application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This Application_Error event handler method would be interested to handle only DALException and any unhandled exceptions. As we know already, it would report the exception details (Probably will send emails about the exception to some pre-configured email addresses, and, log the exception details somewhere). It would simply ignore the ThreadAbortExceptions (Because, nothing to be fixed) and BLLException (Because, this is actually a custom exception which should be handled inside the CodeBehind classes to show validation message to the user).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This is how the Application_Error event method could look like:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;void Application_Error(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    Exception ex = Server.GetLastError();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ex as System.Threading.ThreadAbortException != null &amp;amp;amp;&amp;amp;amp; ex as BLLException != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Do not handle any ThreadAbortException or BLLException here&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Only handle other custom exception (DALException in this example) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //and any other unhandled Exceptions here&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorHandler.ReportError(ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(string.Format("Error.aspx?aspxerrorpath={0}", Request.Url.PathAndQuery));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Asp.net and Microsoft Exception Handling Application Block&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You can use the Exception handling Application Block provided my Microsoft, which can suit your need perfectly. You can define exception policy for each kind of exception in declarative manner, and, you can configure the block to how to act to each kind of exception. Once installed, you can configure the Application Block using GUI tools right within the Visual Studio.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://weblogs.asp.net/sukumarraju/archive/2009/10/04/microsoft-enterprise-library-4-1-exception-handling-block.aspx"&gt;This link&lt;/a&gt; could help you configuring the Exception Handling Application Block in your Asp.net application. I found it handy.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Remember these simple rules while you design your Exception handling mechanism in your N-Tier Asp.net applications:&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Define a Global exception handler, report exception details to the  technical team via an exception reporting mechanism (Probably with  sending emails and logging the exception) and redirect the user to an Error page with a polite message and provide him/her link to get to the original page.&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Categorize the exceptions using an exception hierarchy which suits your need and define a well-thought out policy to deal with each category of Exception.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Let all exceptions be propagated to the global exception handler, except the custom exceptions (BLLException in this example) which are meant to be showing an error message to the user to guide him/her carrying out his/her works correctly.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: Verdana,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Once an exception is thrown (Be it thrown by you or by the  CLR) from any tier from within your N-tier application, catch it only at a single place (Be it at CodeBehind classes or global exception handler) and DO NOT re-throw it after you  catch. Throw once, Catch once.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Remember, plan before you do. Laying out a clean well thought-out Exception handling mechanism in your N-tier Asp.net application would let you run your system smooth, and let you know about any error that is to be fixed immediately when it happens. The end result is, your development team, management and the client, everybody is happy.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-3650968807056721573?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/01/exception-handling-best-practices-in-n.html' title='Exception Handling best practices in N-Tier Asp.net applications'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/3650968807056721573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/01/exception-handling-best-practices-in-n.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/3650968807056721573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/3650968807056721573'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/01/exception-handling-best-practices-in-n.html' title='Exception Handling best practices in N-Tier Asp.net applications'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_I631q7q9h40/TTWcD-31MKI/AAAAAAAAAJY/2oVnIWSFmik/s72-c/ErrorPage.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-9065243624113341177</id><published>2011-01-17T01:44:00.000-08:00</published><updated>2011-01-31T23:01:35.433-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance Profiling'/><title type='text'>Performance Profiling in Visual Studio</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Did you know you could get rich performance profile information from right inside your favorite Visual Studio?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You want to ensure your application runs as fast as possible, and one of the most important thing is you need to know which part of your application is taking most amount of time (Or, resources) to execute, so that, you can identify the areas where you need to optimize performance. Well, this wasn't easy, until Visual Studio introduced the "Analyze" menu in the top-right portion of the IDE.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_I631q7q9h40/TTP3sVXUi7I/AAAAAAAAAIM/sdpG1ewwY1I/s1600/ProfilerMenu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_I631q7q9h40/TTP3sVXUi7I/AAAAAAAAAIM/sdpG1ewwY1I/s1600/ProfilerMenu.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Performance profiler menu in Visual Studio 2010&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Assuming that you have opened your application on Visual Studio (In my case, I created a sample Asp.net application) clicking on the "Launch Performance Wizard" menu will launch the performance profiler wizard for you with the following window:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTP5J40LEkI/AAAAAAAAAIQ/o3V7B_PreB8/s1600/PerformanceProfilerVSStep1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="547" src="http://4.bp.blogspot.com/_I631q7q9h40/TTP5J40LEkI/AAAAAAAAAIQ/o3V7B_PreB8/s640/PerformanceProfilerVSStep1.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Select profiling method &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, there are 4 options. Visual Studio recommends the CPU sampling (Which periodically interrupts the target process and collects information from call stack to develop profiler information), but in our case we will most likely choose "Instrumentation" which injects some instrumentation codes within each method of the dlls (Of the target application which we are profiling) for collecting performance data in terms of method level execution time. This profiling method is very handy for identifying the performance issues for database based applications (For example, you can measure performance of your DAL methods and identify which stored procedures are taking what amount of time in which conditions).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Selecting the "Instrumentation" option and clicking on the "Next" button would bring up the following wizard step:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTP6sM_XV7I/AAAAAAAAAIU/qiWy24f8FV8/s1600/PerformanceProfilerVSStep2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="548" src="http://4.bp.blogspot.com/_I631q7q9h40/TTP6sM_XV7I/AAAAAAAAAIU/qiWy24f8FV8/s640/PerformanceProfilerVSStep2.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Select type of module to profile&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This wizard step asks to select a "module" for profiling. You can profile any exe, dll or an Asp.net web site/application and you need to provide the path to the exe or dll, or, you need to provide the URL of the Asp.net web site/application.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In our case we are profiling a sample Asp.net application which is currently opened in the visual studio. The sample Asp.net application has an About.aspx page containing the following simple CodeBehind:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public partial class About : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestMethod();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void TestMethod()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.Sleep(300);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that, our target is to profile the performance of the methods within the CodeBehind class (TestMethod() in this case). So, we would proceed with the default selection of the web site and click "Next", which would bring up the following wizard step:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_I631q7q9h40/TTP9yvMJ9jI/AAAAAAAAAIc/tD5UeqlZ1tA/s1600/PerformanceProfilerVSStep3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="548" src="http://3.bp.blogspot.com/_I631q7q9h40/TTP9yvMJ9jI/AAAAAAAAAIc/tD5UeqlZ1tA/s640/PerformanceProfilerVSStep3.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_I631q7q9h40/TTP9Pn0OGoI/AAAAAAAAAIY/tYYN1Uq_cU4/s1600/PerformanceProfilerVSStep3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Enable Tier Interaction Profiling&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This wizard step asks you to enable Tier Interaction Profiling (TIP) which lets you get the execution time the application spent on each Tier. We would like to check this check box and click "Next" to proceed the last wizard step:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_I631q7q9h40/TTP-lE6BU-I/AAAAAAAAAIg/A-iXEbxDn8o/s1600/PerformanceProfilerVSStep4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="548" src="http://3.bp.blogspot.com/_I631q7q9h40/TTP-lE6BU-I/AAAAAAAAAIg/A-iXEbxDn8o/s640/PerformanceProfilerVSStep4.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Final step to start profiling&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Click on "Finish" and Visual Studio will launch the application with hitting a URL of your application in the browser and will start profiling with showing the following activity in the screen:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TTP_8xa3_XI/AAAAAAAAAIk/RCofHqqzTYU/s1600/Profiling.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_I631q7q9h40/TTP_8xa3_XI/AAAAAAAAAIk/RCofHqqzTYU/s1600/Profiling.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Profiling application&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In order to profile the particular page functionality in About.aspx, I needed to hit the corresponding URL in the browser (Because, Visual Studio didn't hit this URL automatically):&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTQCEKRqUpI/AAAAAAAAAIs/F0b7HgsZwA4/s1600/BrowsePage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTQCEKRqUpI/AAAAAAAAAIs/F0b7HgsZwA4/s1600/BrowsePage.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Browse page to profile&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Visual studio will start profiling the page functionality and keep showing the following kind of information in the output window (Regarding the instrumentation codes it is injecting within the dlls of the web application):&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_I631q7q9h40/TTQAUkG7otI/AAAAAAAAAIo/4Nk6hL9TIFI/s1600/Instrumented.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_I631q7q9h40/TTQAUkG7otI/AAAAAAAAAIo/4Nk6hL9TIFI/s1600/Instrumented.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Visual Studio instrumenting application dlls&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You need to perform the desired functionality in your target page (Which you are profiling) so that Visual Studio can profile the related back-end methods. In my case, I just need to profile the methods which are executed when the page loads. So, as this is done, I need to close the page in the browser so that Visual Studio finishes gathering profile data and generates report. Alternatively, you can always stop or pause profiling and generate profile report if you want.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TTQD7EtiV-I/AAAAAAAAAIw/Oic9Jn7ht6U/s1600/ProfilerReportGenerated.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_I631q7q9h40/TTQD7EtiV-I/AAAAAAAAAIw/Oic9Jn7ht6U/s1600/ProfilerReportGenerated.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Performance Profile report&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The profile report will be generated and opened by Visual Studio and there will be three following sections being displayed in the Summary View of the report (Which is default selected).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TTQE6PTG1OI/AAAAAAAAAI0/LWGfbp48Smc/s1600/CPUUsageTimeLine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://1.bp.blogspot.com/_I631q7q9h40/TTQE6PTG1OI/AAAAAAAAAI0/LWGfbp48Smc/s640/CPUUsageTimeLine.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; CPU usage timeline&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The first section of the profile report shows CPU usage percentage in the timeline (The overall time taken by Visual Studio while profiling this page). This doesn't give necessary information we are seeking.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The second section of the profile report shows the "Hot Path" information. This means, it displays the most expensive call path of the method chain, and, elapsed time (Percentage) in terms of Inclusive and Exclusive. "Inclusive" means, the corresponding method execution time is being shown including the time taken by all child methods execution time. "Exclusive" means, the corresponding method executing time is being shown excluding the time taken by all child methods.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTQHuCZGRYI/AAAAAAAAAI4/2_KJIz0mhB4/s1600/HotPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/_I631q7q9h40/TTQHuCZGRYI/AAAAAAAAAI4/2_KJIz0mhB4/s640/HotPath.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Hot path&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The third portion of the performance report shows methods/functions invocation information which had consumed most execution times (In terms of percentage among the overall page execution time).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_I631q7q9h40/TTQI_ZuxxnI/AAAAAAAAAI8/mBKffsh6rkQ/s1600/MostIndividualWork.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="154" src="http://1.bp.blogspot.com/_I631q7q9h40/TTQI_ZuxxnI/AAAAAAAAAI8/mBKffsh6rkQ/s640/MostIndividualWork.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Function invocation with most execution time&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Switch to the "Functions" view in the drop-down list to see the method level absolute performance (In terms of ms) of the related methods:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_I631q7q9h40/TTQKHX_jPCI/AAAAAAAAAJA/quVfDTWMTOs/s1600/Functions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_I631q7q9h40/TTQKHX_jPCI/AAAAAAAAAJA/quVfDTWMTOs/s1600/Functions.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Switch to Functions view&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The following Grid will appear containing the execution time of each method which were involved in overall execution of the page:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTQKyjuEWSI/AAAAAAAAAJE/7qmo8eR0_Ww/s1600/FunctionPerformance.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTQKyjuEWSI/AAAAAAAAAJE/7qmo8eR0_Ww/s1600/FunctionPerformance.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Function execution time&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Note that you can sort the grid by the "Elapsed Inclusive Time" field to see which methods are consuming the most amount of execution time. You can also export the Grid in some format to analyze performance issues later.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Switch to "Tier Interactions" view from the drop-down list to see the execution time taken by the application in each different tier.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_I631q7q9h40/TTQL431HdfI/AAAAAAAAAJM/XCkWWKnW8F8/s1600/TierInteractionView.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_I631q7q9h40/TTQL431HdfI/AAAAAAAAAJM/XCkWWKnW8F8/s1600/TierInteractionView.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Select "Tier Interactions" view&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_I631q7q9h40/TTQLryRbhhI/AAAAAAAAAJI/LmVjaQVcuLA/s1600/TierInteractionView.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The following Grid will display the execution time and the number of occurrence taken in each different tier:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTQMcgFWWzI/AAAAAAAAAJQ/y9iMk4F0pYw/s1600/TierInteractionReport.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTQMcgFWWzI/AAAAAAAAAJQ/y9iMk4F0pYw/s1600/TierInteractionReport.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Tier interaction report&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As this is a sample Asp.net application having minimal functionality, the performance report doesn't provide too much significant performance measurement information. But, I hope, this post was able to help you getting the idea of profiling your application from right inside your favorite IDE-the Visual Studio.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Happy profiling.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/894673367938301322-9065243624113341177?l=www.shubho.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.shubho.net/2011/01/performance-profiling-in-visual-studio.html' title='Performance Profiling in Visual Studio'/><link rel='replies' type='application/atom+xml' href='http://www.shubho.net/feeds/9065243624113341177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.shubho.net/2011/01/performance-profiling-in-visual-studio.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/9065243624113341177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/894673367938301322/posts/default/9065243624113341177'/><link rel='alternate' type='text/html' href='http://www.shubho.net/2011/01/performance-profiling-in-visual-studio.html' title='Performance Profiling in Visual Studio'/><author><name>Shubho</name><uri>http://www.blogger.com/profile/07222814089575892858</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://2.bp.blogspot.com/_I631q7q9h40/Sad_taIrM5I/AAAAAAAAACM/io1LifysoqM/S220/DSC02716_Small.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_I631q7q9h40/TTP3sVXUi7I/AAAAAAAAAIM/sdpG1ewwY1I/s72-c/ProfilerMenu.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-894673367938301322.post-3246565264924858387</id><published>2011-01-14T03:25:00.000-08:00</published><updated>2012-01-11T04:23:09.699-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ThreadAbortException'/><category scheme='http://www.blogger.com/atom/ns#' term='Best Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Response.Redirect'/><title type='text'>Handling ThreadAbortException with Response.Redirect() : Best possible approaches</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The story began very simply.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I got an error mail from one of our deployed Asp.net application in Production site. The error mail was something like the following:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;Timestamp: 7/2/2010 7:26:15 PM&lt;br /&gt;Message: HandlingInstanceID: 71393a92-8cd9-42f5-9572-ca172ae0ca03&lt;br /&gt;An exception of type 'System.Threading.ThreadAbortException' occurred &lt;br /&gt;and was caught.&lt;br /&gt;&lt;br /&gt;Type : System.Threading.ThreadAbortException, mscorlib, &lt;br /&gt;Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 &lt;br /&gt;Message : Thread was being aborted.&lt;br /&gt;Source : mscorlib&lt;br /&gt;Help link :&lt;br /&gt;ExceptionState : System.Web.HttpApplication+CancelModuleException&lt;br /&gt;Data : System.Collections.ListDictionaryInternal&lt;br /&gt;TargetSite : Void AbortInternal()&lt;br /&gt;Stack Trace : at System.Threading.Thread.AbortInternal()&lt;br /&gt;at System.Threading.Thread.Abort(Object stateInfo)&lt;br /&gt;at System.Web.HttpResponse.End()&lt;br /&gt;at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)&lt;br /&gt;at System.Web.HttpResponse.Redirect(String url)&lt;br /&gt;at MyDashboard.Page_Load(Object sender, EventArgs e)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Guess what, we have a simple exception reporting system at our Asp.net production sites. Whenever an un-handled exception occurs there, the exception information is captured and emailed to a pre-configured email address so that we can investigate and fix it.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To do this, we put a few lines of codes in the Global.asax, which catches any un-handled exception and emails the exception details to us. Here is the code:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;void Application_Error(object sender, EventArgs e)&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code that runs when an un-handled error occurs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exception ex = Server.GetLastError();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logger.LogException(ex);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, the above exception information was being emailed by this tiny little friendly code, which saves our life often.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Why this exception occurred?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There must be some un-handled exception behind this error report. While starting investigation,&amp;nbsp;&lt;b&gt; &lt;/b&gt;I noticed that, a Response.Redirect() statement is behind this exception. See the call stack information from top to bottom:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;at System.Threading.Thread.Abort(Object stateInfo)&lt;br /&gt;at System.Web.HttpResponse.End()&lt;br /&gt;at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)&lt;br /&gt;at System.Web.HttpResponse.Redirect(String url)&lt;br /&gt;at MyDashboard.Page_Load(Object sender, EventArgs e)&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Analyzing the MyDashboard.aspx.cs, I found that there is indeed a Response.Redirect() statement, which looks pretty harmless to me:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;if(!UserHasPermissionToViewThisPage())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect("Unauthorized.aspx");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Hm..seems interesting. It seems, the Response.Redirect() statement is causing something which is generating the ThreadAbortException.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The call stack gives some more information. Let's look at it. The Response.Redirect() internally executes some more methods in the following sequence:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;Response.Redirect(url,endResponse)--&amp;gt;Response.End()--&amp;gt;Thread.Abort()--&amp;gt;Boom! (ThreadAbortException)&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, it appears, the Response.Redirect() internally calls Resposne.End(), which calls Thread.Abort() and this last method invocation causes the ThreadAbortException to be thrown.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_I631q7q9h40/TTOvxt9dkcI/AAAAAAAAAH8/1neizUWKvz8/s1600/ThreadAbort.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_I631q7q9h40/TTOxG2P7gzI/AAAAAAAAAII/DLb_CDjKlzg/s1600/ThreadAbort.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Sequence of operations that causes ThreadAbortException&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Why ThreadAbortException is being thrown?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Well, a little research revealed me that, the Response.Redirect() is actually an instruction to the client browser to stop the execution of the current page and hit a different URL request. As each and every request is being assigned to a different Thread from the Thread pool, the current Thread (Which is taking care of the current Request) should be terminated (And, go back to the Thread pool) and the next redirected Request should be handled by a different Thread pool.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;MSDN Says :&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #b6d7a8; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;"Thread.Abort() Raises a ThreadAbortException in the thread on which it is invoked, to begin the process of terminating the thread. Calling this method usually terminates the thread."&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://2.bp.blogspot.com/_I631q7q9h40/TTOwFzrICZI/AAAAAAAAAIA/S0eZqigR2IA/s1600/ThreadAbortException.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_I631q7q9h40/TTOwb2f4qPI/AAAAAAAAAIE/HKtQKk3MlH4/s1600/ThreadAbortException.png" /&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;Figure :&lt;/b&gt; Child Thread raising ThreadAbortException to terminate itself&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;So, it turns out that, when Response.Redirect() is being invoked, the current Thread can't terminate itself, and hence, it needs a way to notify the parent Thread which created this Thread (The Asp.net worker process in this case) so that, the parent Thread can terminate this thread. Calling Thread().Abort() actually raises an Exception (ThreadAbortException) to the parent Thread to notify that "I can't terminate myself, you please do it" , and, the parent Thread terminates this Thread and returns it back to the Thread pool.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, this is the story behind the ThreadAbortException.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Can we avoid this ThreadAbortException?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Yes we can! It's pretty simple actually. The Response.Redirect() has an overloaded version which lets you specify whether or not to end the Response while redirecting the current Request. Following is the overloaded&amp;nbsp; version of the method:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;Response.Redirect(string url, string endResponse);&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, if we invoke the method with endResposne=false, the Response.Redirect() will not call the Response.End(), and, in turn, the Thread.Abort() method will not be called, and, no ThreadAbortException will occur. Problem solved. Bravo!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I tried it, and unfortunately found that, it stopped the ThreadAbortException, but, created a new problem. See the following piece of code (Not the best piece of code you would ever see, but, it demonstrates the problem):&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public partial class _Default : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!UserHasPermissionToViewThisPage())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect("Unauthorized.aspx",false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void DeleteFile()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string fileName = Server.MapPath("TextFile.txt");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Delete(fileName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool UserHasPermissionToViewThisPage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The code says, if the current user doesn't have permission to execute the functionality of this page,redirect him/her to the "Unauthorized.aspx". On the other hand, if he/she has permission, executes rest of the codes for the current user, and, ultimately, delete a file in the file system in this particular case.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Put a text file (TextFile.txt) at the web root folder of your Asp.net web site/application, copy/paste the above code in the CodeBehind file of a simple aspx page, browse it and see what happens.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As soon as you browse your page, you are being redirected to the Unauthorized.aspx page. Fine, this is expected. But, where is the TextFile.txt? OMG, it's gone!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It seems, even if the Response.Redirect() is being executed here (And, the browser is successfully being redirected to a new URL), the later part of the codes is getting executed here. That is, the following code is being executed:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;DeleteFile();&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I changed the following Response.Redirect() statement (removed the endResponse parameter) and ran the page in the browser to see what happens now (Also, restored a blank TextFile.txt file in the web root folder)&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;Response.Redirect("Unauthorized.aspx");&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Interestingly, the TextFile.txt is not deleted now, and obviously the DeleteFile(); statement is not being executed here after the Response.Redirect() statement.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I gave a thought and concluded that, whatever happening here with Response.Redirect(url, false) (Note, endResposne parameter is set to false) is logical. Why? because, when I send the endResponse parameter value as false, Response.Redirect() doesn't call Response.End(), and hence, the Thread.Abort() is not being invoked here, resulting in the current Thread (Which is taking care of the current Request) being live and executing the other parts of the statements, whatever it does! &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Dude, we have a problem here.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;How to prevent the current Thread executing the other codes?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Simple, we just need to add a return statement just after the Response.Redirect() statement, right?&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;Response.Redirect("Unauthorized.aspx",false);&lt;br /&gt;return;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Yes, this solves the problem. But, as I found that, there are still issues with PostBacks. The above code may return immediately after Redirecting to a different URL, but, if the current Request is a PostBack Rerquest, the PostBack event methods are getting executed without any interruption. I added a Button server control to the page, added an OnClick event method to it, and, explored the issue. Take a look at the following codes which demonstrates the problem:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public partial class _Default : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsPostBack)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!UserHasPermissionToViewThisPage())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&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; Response.Redirect("Unauthorized.aspx", false);&lt;br /&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; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //This no longer gets called now&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void DeleteFile()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string fileName = Server.MapPath("TextFile.txt");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Delete(fileName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool UserHasPermissionToViewThisPage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Button1_Click(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //But, this is getting called even if Response.Redirect() is being called!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Further exploration revealed me that, even if Response.Redirect(url, false) is supposed to hault the execution of the current page, the whole Asp.net page life cycle events gets executed here without any interruption. So, at the end of the life cycle, the Response is unnecessarily being written to the output stream even if the client browser is already redirected to a different URL. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, it seems, returning just after the Response.Redirect() is not good enough. We need to track the redirection information somehow and prevent the execution of codes within the PostBack event methods if the flag's value is true (Indicating that, Page alredy redirected). We can use a global flag variable as follows:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;bool Redirected = false;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;if (!UserHasPermissionToViewThisPage())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect("Unauthorized.aspx", false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Redirected = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void Button1_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Redirected) return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFile();&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As it turns out, we need to check this flag in each and every PostBack event method in our CodeBehind methods. Doesn't sound good to me.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;A smarter approach&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Asp.net Page life cycle is good. It gives you flexibility to override most of the life-cycle events, and, execute your own piece of code where you want in the specific part of the life cycle.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, I might try to get rid of the fact that, I need to check the flag inside each and every PostBack event method.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;As the Page Life cycle says, the RaisePostBackEvent event is fired before firing the specific PostBack event method which is tied to a server control's specific event (In this case, Button1_Click event method). So, we can override this method, and, check the flag within the overridden method, and, let Asp.net run time invoke the original ReaisePostBackEvent() method if the flag's value is false only.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Following is the code I wrote:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Redirected == false)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.RaisePostBackEvent(sourceControl, eventArgument);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Adding to this, we also need to override the Render() event method so that, the Response is not unnecessarily being written to the output stream when we call Response.Redirect(url, false):&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected override void Render(HtmlTextWriter writer)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Redirected == false)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.Render(writer);&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;It would be even smarter to define these two methods and a Redirect() method within a base page class, and, let all other CodeBehind classes inherit this class. This would let us write less codes and keep the original PostBack event methods clean. That is:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public class BasePage : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected bool Redirected = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public BasePage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Redirect(string url)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect(url, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Redirected = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Redirected == false)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.RaisePostBackEvent(sourceControl, eventArgument);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void Render(HtmlTextWriter writer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Redirected == false)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.Render(writer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public partial class _Default : BasePage&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsPostBack)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!UserHasPermissionToViewThisPage())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&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; Redirect("Unauhorized.aspx");&lt;br /&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; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //This no longer gets called now&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp; ....&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So, to summarize, following are the things you have to do:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. Create a BasePage and include the methods as as suggested above. Inherit the BasePage from all other CodeBehind pages.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. When you need to redirect, DO NOT CALL Response.Redirect(). Instead, call the following piece of code:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;base.Redirect(url);&lt;br /&gt;return;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Criticisms to this approach&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Despite the fact that the above approach gives you some cleaner approach of avoiding the ThreadAbortException from happening, there are a few unresolved issues. These are:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. The current Thread is not being aborted immediately. Rather, it stays alive which is unnecessary .&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To me, this is not a big problem, because, though the Thread isn't getting terminated immediately, it will execute and will be returned back to the ThreadPool as it completes the page life cycle (Without really doing anything else, because, the Redirected flag is true). So, Asp.net worker process will not fall in Thread starvation.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. It enforces a constraint to write a return statement just after the base.Redirect() method, which may not be easy to follow everywhere.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To me, this is a big problem. Specially, writing just a return statement may not be a straight-forward solution always, specially when you need to redirect from within a custom-written method which is not a page life cycle method. Take a look at the following piece of code:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!DenyIfUserDoesntHavePermissionToViewThisPage())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private bool DenyIfUserDoesntHavePermissionToViewThisPage()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool userHavePermission = false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!userHavePermission)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.Redirect("Unauthorized.aspx");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return userHavePermission;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;You see, we need to return false from within the custom method &lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;DenyIfUserDoesntHavePermissionToViewThisPage()&lt;/pre&gt;&lt;span style="font-size: small;"&gt;(Where we are redirecting to a different URL), and, we are also returning false from within this method to the caller. If the caller method is being called from another method, we need to return false to that method also (From within the calling method), and, we need to maintain this chain until we reach the page life cycle method which originally got called. This doesn't look comfortable.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. It opens a risk of not writing the return statement after the base.Redirect() method at times, and this will result in execution of all other codes which are written after the base.Redirect() statement. &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To me, this is the biggest problem.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If you forget to write the return statement after calling the base.Redirect() method (Which is a very easy mistake to do), disaster might happen. How would you deal with this risk? Unfortunately, I do not see any way!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Enough! Tell me what to do&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;OK, I know I danced around the original problem for long enough, and if you have patience to read up to this far, considering all the facts, let me tell you now how I think the Response.Redirect() should be handled in the best possible way:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;1. DO NOT WRITE any try..catch block in the CodeBehind. This will make sure you are not catching any ThreadAbortException there.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;2. Redirect using the classic Response.Redirect(url) statement as you love to do :)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;3. Simply ignore the ThreadAbortException in the Global.asax (Where you usually catch your un-handled exceptions and report), using the following code:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;void Application_Error(object sender, EventArgs e)&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code that runs when an un-handled error occurs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exception ex = Server.GetLastError();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Threading.ThreadAbortException exception = ex as System.Threading.ThreadAbortException;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (exception == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&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; //Log or report only if this is not ThreadAbortException&lt;br /&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; Logger.LogException(ex); &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Or, another approach may simply be to swallow the ThreadAbortException in the BasePages Redirect() method and use that method everywhere:&lt;/span&gt;&lt;/div&gt;&lt;pre class="brush:csharp"&gt;protected void Redirect(string url)&lt;br /&gt;{&lt;br /&gt;&amp;
