<?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-6405171659367901658</id><updated>2011-04-22T01:35:04.618+01:00</updated><category term='SQL SERVER - Fix : Error : 40 - could not open a connection to SQL server'/><category term='Observer pattern'/><category term='LINQ'/><category term='ActionTree'/><category term='Custom Authentication'/><category term='Ajax'/><category term='Active Directory Authentication'/><category term='FBA in SharePoint'/><category term='WCF Hello World'/><title type='text'>PURUSHOTAM RAMAKRISHNAPPA</title><subtitle type='html'>PROFESSIONAL + TECHNOLOGY BLOG</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-4186717605581892816</id><published>2008-04-08T15:28:00.010+01:00</published><updated>2008-11-13T09:47:48.926Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF Hello World'/><title type='text'>WCF Hello World Part -2</title><content type='html'>In my &lt;a href="http://purusworld.blogspot.com/2008/04/wcf-hello-world-part-1.html"&gt;previous&lt;/a&gt; post, I have created a WCF service. In this part, I will create a client to consume the WCF Service created. Since this is an hello world example, Let's create a web method in WCF service. Todo that, create a method first on interface and then implement it in the service as shown in code.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;[ServiceContract]&lt;br /&gt;    public interface IHelloWorldService&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        [OperationContract]&lt;br /&gt;        string GetData(int value);&lt;br /&gt;&lt;br /&gt;        [OperationContract]&lt;br /&gt;        CompositeType GetDataUsingDataContract(CompositeType composite);&lt;br /&gt;&lt;br /&gt;        // TODO: Add your service operations here&lt;br /&gt;        [OperationContract]&lt;br /&gt;        string GetGreetings(string name);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; public class HelloWorldService : IHelloWorldService&lt;br /&gt;    {&lt;br /&gt;        ...&lt;br /&gt;&lt;br /&gt;        public string GetGreetings(string name)&lt;br /&gt;        {&lt;br /&gt;            return string.Format("Hello {0}, Welcome to WCF World!", name);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    ....&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now, lets create a client to consume this service. I prefer to create a web client. In order to do this, one needs a service proxy, which will communicate to the service using Soap as transport mechanism. There are 2 ways to create a proxy.&lt;br /&gt;1. by using Visual Studio&lt;br /&gt;2. by using svcutil.exe utility by WCF framework.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for this example, i will simply use Visual Studio as we used to do earlier versions of .net. Add a new website by name WCFHelloWorld-Web and add a service reference and point to the WCF service created as show shown fig below.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QsDuG4K936c/R_uGSXOn5oI/AAAAAAAAGMs/WVdjMzXxH4g/s1600-h/WCFHelloWorld-Part2_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_QsDuG4K936c/R_uGSXOn5oI/AAAAAAAAGMs/WVdjMzXxH4g/s320/WCFHelloWorld-Part2_1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5186887045878376066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QsDuG4K936c/R_uHl3On5pI/AAAAAAAAGM0/kE4eEdwJpu0/s1600-h/WCFHelloWorld-Part2_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_QsDuG4K936c/R_uHl3On5pI/AAAAAAAAGM0/kE4eEdwJpu0/s320/WCFHelloWorld-Part2_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5186888480397452946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Add namespace of WCF Service to codebehind of aspx file, in this case ServiceReference1 is the namespace. using this namespace, create a proxy object as class variable in the aspx.cs file and in aspx file create some server controls in order to type some input and display as label. I have created UI as follows:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QsDuG4K936c/R_uJ_3On5qI/AAAAAAAAGM8/lvKL8fWc2nI/s1600-h/WCFHelloWorld-Part2_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_QsDuG4K936c/R_uJ_3On5qI/AAAAAAAAGM8/lvKL8fWc2nI/s320/WCFHelloWorld-Part2_3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5186891126097307298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and in button event handler, pass the textbox input to webservice's  GetGreetings method and display on UI with label as shown below:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;using ServiceReference1;&lt;br /&gt;&lt;br /&gt;public partial class _Default : System.Web.UI.Page &lt;br /&gt;{&lt;br /&gt;    HelloWorldServiceClient proxy = new HelloWorldServiceClient();&lt;br /&gt;&lt;br /&gt;    protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    protected void btnSumbit_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;               lblGreetings.Text = proxy.GetGreetings(txtName.Text);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Hit F5 to see the aspx page in browser. Input some name and hit Get Greetings button, you should be able to see display output as shown in fig below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QsDuG4K936c/R_uLU3On5rI/AAAAAAAAGNE/mzqHU42vJ9Y/s1600-h/WCFHelloWorld-Part2_4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_QsDuG4K936c/R_uLU3On5rI/AAAAAAAAGNE/mzqHU42vJ9Y/s320/WCFHelloWorld-Part2_4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5186892586386187954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;that's it.. simple to create a web cilent and consume a WCF service. I will take you in depth in next part of this series, until then bye.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-4186717605581892816?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/4186717605581892816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=4186717605581892816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/4186717605581892816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/4186717605581892816'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2008/04/wcf-hello-world-part-2.html' title='WCF Hello World Part -2'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QsDuG4K936c/R_uGSXOn5oI/AAAAAAAAGMs/WVdjMzXxH4g/s72-c/WCFHelloWorld-Part2_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-6250928071657690064</id><published>2008-04-03T21:05:00.029+01:00</published><updated>2008-11-13T09:47:49.301Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCF Hello World'/><title type='text'>WCF Hello World Part -1</title><content type='html'>This is my first posting on WCF, i thought I would start with Hello World on WCF and i dont know to what extent WCF will take me!. For a reader who finds this posting, this is would be a head start on WCF and am gonna discuss challenges and issues on WCF in part by part.&lt;br /&gt;&lt;br /&gt;so, here i am.&lt;br /&gt;&lt;br /&gt;first of all I would like to brief What tools i will be using at the moment.&lt;br /&gt;&lt;br /&gt;1. Visual Studio 2008 for this posting. &lt;br /&gt;&lt;br /&gt;I may wish to revisit this part again for my next posting.&lt;br /&gt;&lt;br /&gt;Ok then. Lets fire up Visual Studio 2008 and create WCF Service by name WCFHelloWorld as shown in fig below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QsDuG4K936c/R_U9LnOn5hI/AAAAAAAAGL0/pZcRtWkUGV4/s1600-h/WCFHelloWorld_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_QsDuG4K936c/R_U9LnOn5hI/AAAAAAAAGL0/pZcRtWkUGV4/s320/WCFHelloWorld_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5185117815705167378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So When i have created, Visual Studio creates some files for me. those are&lt;br /&gt;&lt;br /&gt;1. Service1.svc&lt;br /&gt;2. IService1.cs&lt;br /&gt;3. Web.Config&lt;br /&gt;4. App_Code folder with web project settings and references.&lt;br /&gt;&lt;br /&gt;What might interests is 2 files 1 and 2 from above. In eariler version of .Net, you would have created Web Services and seen asmx files instead.&lt;br /&gt;&lt;br /&gt;now, I am gonna rename those files to fit into my demonstration as WCFHelloWorld.&lt;br /&gt;&lt;br /&gt;So, I rename Service1.svc as WCFHelloWorld.svc and IService1.cs as IWCFHelloWorld.cs.&lt;br /&gt;&lt;br /&gt;I leave it with you, how you rename the files and organise and make it compilable at least for now. finally i get my compilable as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QsDuG4K936c/R_U_93On5iI/AAAAAAAAGL8/6ZMDlaV5mew/s1600-h/WCFHelloWorld_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_QsDuG4K936c/R_U_93On5iI/AAAAAAAAGL8/6ZMDlaV5mew/s320/WCFHelloWorld_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5185120878016849442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: #dadada 1px solid; PADDING-LEFT: 5px; BORDER-TOP: #dadada 1px solid;BORDER-LEFT: #dadada 1px solid;BORDER-BOTTOM: #dadada 1px solid;"&gt;&lt;br /&gt;Note: &lt;em&gt;Keep in mind that WCF is a runtime for Web Services. In earlier versions of .Net, Asp.Net was runtime for Web Services.  now WCF is runtime for Web Services and .Net remoting!. Those who have worked on .Net Remoting, here is a good news, now they can enjoy exploring separate runtime!.&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When you build is succeeded, press F5 and opens in browser as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QsDuG4K936c/R_aLyXOn5jI/AAAAAAAAGME/agwTCuoe4Pg/s1600-h/WCFHelloWorld_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_QsDuG4K936c/R_aLyXOn5jI/AAAAAAAAGME/agwTCuoe4Pg/s320/WCFHelloWorld_3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5185485718308775474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At this moment, I have created web service and launched it. In next part of this demo, will create a client and consume this web service.&lt;br /&gt;&lt;br /&gt;I have tried to make it simple, hence have not been able to delve in detail but taking this as an example, in some part later of this demo will go in depth,  until then bye...&lt;br /&gt;&lt;br /&gt;----------------end of part -1 ------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-6250928071657690064?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/6250928071657690064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=6250928071657690064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/6250928071657690064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/6250928071657690064'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2008/04/wcf-hello-world-part-1.html' title='WCF Hello World Part -1'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QsDuG4K936c/R_U9LnOn5hI/AAAAAAAAGL0/pZcRtWkUGV4/s72-c/WCFHelloWorld_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-8371460070670038384</id><published>2008-04-03T20:30:00.004+01:00</published><updated>2008-04-03T20:39:01.502+01:00</updated><title type='text'>Postings coming soon! on .Net 3.5 Framework concepts</title><content type='html'>Its been a while I haven't posted anything on my blog after started working at Cambridge Assessment. Though i had so many things in my mind, could not post even a post!. Today, i am making an effort to put as a start up and have decided to put some articles on 3.5 Framework's WCF, ASP.Net MVC, Linq and Sql Server 2008. I hope i can maintain a consistency in posting at least one everyday!.&lt;br /&gt;&lt;br /&gt;Wish me good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-8371460070670038384?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/8371460070670038384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=8371460070670038384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/8371460070670038384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/8371460070670038384'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2008/04/postings-coming-soon-on-net-35.html' title='Postings coming soon! on .Net 3.5 Framework concepts'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-5690237055047393047</id><published>2007-12-08T13:18:00.000Z</published><updated>2008-02-09T18:49:34.505Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL SERVER - Fix : Error : 40 - could not open a connection to SQL server'/><title type='text'>SQL SERVER - Fix : Error : 40 - could not open a connection to SQL server</title><content type='html'>Recently i was setting up development environment at home. When i had to connect SQL server remotely from another VPC, i could not connect it even after enabling allow remote connections on my Sql Server. the error messaage was...&lt;br /&gt;&lt;br /&gt;An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for some reason it did not work as suggested by many..&lt;br /&gt;&lt;br /&gt;but after banging my head to wall... cpu and then to lcd monitor, figured the solution.&lt;br /&gt;&lt;br /&gt;but dont worry, figured what was the problem at last………&lt;br /&gt;&lt;br /&gt;the probelm is the Instance name from the client is not resolved, to do that follow the below shown steps.&lt;br /&gt;&lt;br /&gt;1. Navigate to C:\Windows\System32\drivers\etc&lt;br /&gt;2. Open hosts file in notepad&lt;br /&gt;3. Add the entry at the end of line, as i did for example&lt;br /&gt;&lt;br /&gt;192.168.131.65 KSSQLSRVR&lt;br /&gt;192.168.131.65 KSSQLSRVR\SPDEV01&lt;br /&gt;&lt;br /&gt;those were my instances i am tried to connect remotely&lt;br /&gt;&lt;br /&gt;sweeeeet... it worked!&lt;br /&gt;&lt;br /&gt;should work for anyone who have this problem...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-5690237055047393047?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/5690237055047393047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=5690237055047393047' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/5690237055047393047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/5690237055047393047'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2007/12/sql-server-fix-error-40-could-not-open.html' title='SQL SERVER - Fix : Error : 40 - could not open a connection to SQL server'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-480493274851912220</id><published>2007-11-05T09:17:00.000Z</published><updated>2008-11-13T09:47:50.833Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='FBA in SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Authentication'/><category scheme='http://www.blogger.com/atom/ns#' term='Active Directory Authentication'/><title type='text'>Setting up different Authentication models in WSS 3.0 - Part 1</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_QsDuG4K936c/R0rqe0EXv3I/AAAAAAAAGHs/UYWXoAN_4Vo/s1600-h/b6.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_QsDuG4K936c/R0rqe0EXv3I/AAAAAAAAGHs/UYWXoAN_4Vo/s320/b6.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137176140063424370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Setting up different Authentication models in WSS3.0&lt;br /&gt;Currently WSS 3.0 supports following authentication models for intranet, extranet and Internet environments for their partner applications.&lt;br /&gt;&lt;br /&gt;1. Windows&lt;br /&gt;2. Forms&lt;br /&gt;&lt;br /&gt;Forms authentication is preferred over windows authentication for extranet environments. The WSS 3.0 supports following Authentication providers.&lt;br /&gt;&lt;br /&gt;1. Active Directory Membership Provider&lt;br /&gt;2. SQL Membership provider&lt;br /&gt;3. Single Sign On - SSO&lt;br /&gt;&lt;br /&gt;In this article I have made an attempt to depict Authentication using Active Directory membership provider. And another challenging functionality implemented is, if for some reason, user can not logon, the page would display the reason along with logon details like account locked, expiry date and disabled features as shown in screen shot below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QsDuG4K936c/R0rkkEEXvsI/AAAAAAAAGGU/W7qwpjzTsQc/s1600-h/b1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_QsDuG4K936c/R0rkkEEXvsI/AAAAAAAAGGU/W7qwpjzTsQc/s320/b1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137169633187970754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hence I have divided this article as 3 parts.&lt;br /&gt;Part 1: Develop and Implement Custom Login for Active Directory&lt;br /&gt;Part 2: Develop and Implement Custom Change Password for Active Directory&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;&lt;strong&gt;Part 1: Develop and Implement Custom Login for Active Directory&lt;/strong&gt;&lt;/h3&gt;&lt;br /&gt;In order to implement this part, firstly I would need to create a class library which would override Login page of sharepoint provided page.&lt;br /&gt;&lt;br /&gt;3. From Visual Studio, create a class library and name the project  as SharePoint.Authentication.Custom.ActiveDirectory.&lt;br /&gt;&lt;br /&gt;4. Since I need to deploy onto SharePoint, I have thought that, its better idea to put this dll into GAC. So, from the properties of the Project, under Signing tab, create a new snk and check delay sign.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QsDuG4K936c/R0rk7kEXvtI/AAAAAAAAGGc/5uP8qg16f24/s1600-h/b4.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_QsDuG4K936c/R0rk7kEXvtI/AAAAAAAAGGc/5uP8qg16f24/s320/b4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137170036914896594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Rename the class1.cs to CustomLoginPage.cs&lt;br /&gt;6. Add a reference from .Net  tab, select Windows SharePoint Services as shown below:&lt;br /&gt;  &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QsDuG4K936c/R0rlPUEXvuI/AAAAAAAAGGk/K619H8Ja-wQ/s1600-h/b5.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_QsDuG4K936c/R0rlPUEXvuI/AAAAAAAAGGk/K619H8Ja-wQ/s320/b5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137170376217312994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7. Add a reference from .Net  tab and browse to Microsoft.SharePoint.ApplicationPages.dll located in C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG\BIN\&lt;br /&gt; &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QsDuG4K936c/R0rliUEXvvI/AAAAAAAAGGs/Y9rtRzC9Dgc/s1600-h/b2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_QsDuG4K936c/R0rliUEXvvI/AAAAAAAAGGs/Y9rtRzC9Dgc/s320/b2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137170702634827506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;8. Add a reference  from COM tab, Active DS Library. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QsDuG4K936c/R0rluUEXvwI/AAAAAAAAGG0/tW7pIfkwSC4/s1600-h/b3.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_QsDuG4K936c/R0rluUEXvwI/AAAAAAAAGG0/tW7pIfkwSC4/s320/b3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137170908793257730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;9. Add a reference from .Net tab, System.Web, System.DirectoryServices&lt;br /&gt;&lt;br /&gt;10. In class CustomLoginPage.cs, add the following entries in the namespace section&lt;br /&gt;Using Microsoft.SharePoint;&lt;br /&gt;Using ActiveDs;&lt;br /&gt;11. Now, we are ready to start making some changes to the class file.&lt;br /&gt;12. Inherit the class from Microsoft.SharePoint.ApplicationPages.LoginPage class&lt;br /&gt;13. Since we are interested to know logon details on error, I am gonna override on error event of Login page.as shown below&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;protected override void OnLoad(EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            this.login.LoginError += new EventHandler(login_LoginError);&lt;br /&gt;            base.OnLoad(e);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;      void login_LoginError(object sender, EventArgs e)&lt;br /&gt;        { }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;14. In the above event handler, I would need to call login details if user can not logon. Hence for the simplicity, I have created a simple class and then populated data. Below show is the class.&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;public class ADResult&lt;br /&gt;    {&lt;br /&gt;        public ADResult() { }&lt;br /&gt;&lt;br /&gt;        private bool _locked;&lt;br /&gt;&lt;br /&gt;        public bool Locked&lt;br /&gt;        {&lt;br /&gt;            get { return _locked; }&lt;br /&gt;            set { _locked = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _disabled;&lt;br /&gt;&lt;br /&gt;        public bool Disabled&lt;br /&gt;        {&lt;br /&gt;            get { return _disabled; }&lt;br /&gt;            set { _disabled = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private string _lastLogon;&lt;br /&gt;&lt;br /&gt;        public string LastLogon&lt;br /&gt;        {&lt;br /&gt;            get { return _lastLogon; }&lt;br /&gt;            set { _lastLogon = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private int  _expiresIn;&lt;br /&gt;&lt;br /&gt;        public int  ExpiresIn&lt;br /&gt;        {&lt;br /&gt;            get { return _expiresIn; }&lt;br /&gt;            set { _expiresIn = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private string _errorMessage;&lt;br /&gt;&lt;br /&gt;        public string ErrorMessage&lt;br /&gt;        {&lt;br /&gt;            get { return _errorMessage; }&lt;br /&gt;            set { _errorMessage = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _valid;&lt;br /&gt;&lt;br /&gt;        public bool Valid&lt;br /&gt;        {&lt;br /&gt;            get { return _valid; }&lt;br /&gt;            set { _valid = value; }&lt;br /&gt;        }&lt;br /&gt; &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;15. Next step is create a method GetLoginDetails() which actually would query Active Directory and return the ADResult object as shown below:&lt;br /&gt;&lt;br /&gt;Also, You might wonder on one thing, why i have used SPSecurity.RunXXX(delegate()), this is because the code will not run until it is trusted in Sharepoint, hence it is required to elevate code security level.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;private ADResult GetLoginDetails(string username)&lt;br /&gt;        {&lt;br /&gt;            ADResult adResult = new ADResult();&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                string strLoginName = username;&lt;br /&gt;                int iPosition = strLoginName.IndexOf("\\") + 1;&lt;br /&gt;                strLoginName = strLoginName.Substring(iPosition);&lt;br /&gt;&lt;br /&gt;                DirectoryEntry entry = new DirectoryEntry(ADPATH); //ADPATH is path of Active dir&lt;br /&gt;                DirectorySearcher search = new DirectorySearcher(entry);&lt;br /&gt;                search.Filter = "(SAMAccountName=" + strLoginName + ")";&lt;br /&gt;               &lt;br /&gt;                Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br /&gt;                    {&lt;br /&gt;                        SearchResult result = search.FindOne();&lt;br /&gt;                        entry = result.GetDirectoryEntry();&lt;br /&gt;                    });&lt;br /&gt;               &lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(delegate()&lt;br /&gt;                    {&lt;br /&gt;                        object o = entry.InvokeGet("IsAccountLocked");&lt;br /&gt;&lt;br /&gt;                        if (o != null)&lt;br /&gt;                        {&lt;br /&gt;                            bool locked = (bool)o;&lt;br /&gt;                            adResult.Locked = locked;&lt;br /&gt;                        };&lt;br /&gt;&lt;br /&gt;                        bool isDisabled;&lt;br /&gt;                        isDisabled = ((int)entry.Properties["userAccountControl"].Value &amp; (int)ADS_USER_FLAG.ADS_UF_ACCOUNTDISABLE) != 0;&lt;br /&gt;                        adResult.Disabled = isDisabled;&lt;br /&gt;&lt;br /&gt;                        object lastlogon = entry.InvokeGet("LastLogin");&lt;br /&gt;                        if (lastlogon != null)&lt;br /&gt;                        {&lt;br /&gt;                            DateTime LastLogon = (DateTime)lastlogon;&lt;br /&gt;                            adResult.LastLogon = "Last Logon was at : " + LastLogon.ToLongDateString() + "  " + LastLogon.ToShortTimeString();&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                        LargeInteger liAcctPwdChange = entry.Properties["pwdLastSet"].Value as LargeInteger;&lt;br /&gt;&lt;br /&gt;                        // Convert the highorder/loworder parts of the property pulled to a long. &lt;br /&gt;                        long dateAcctPwdChange = (((long)(liAcctPwdChange.HighPart) &lt;&lt; 32) + (long)liAcctPwdChange.LowPart);&lt;br /&gt;&lt;br /&gt;                        // Convert FileTime to DateTime and get what today's date is. &lt;br /&gt;                        DateTime dtNow = DateTime.Now;&lt;br /&gt;                        DateTime dtAcctPwdChange = DateTime.FromFileTime(dateAcctPwdChange);&lt;br /&gt;                        string strAcctPwdChange = DateTime.FromFileTime(dateAcctPwdChange).ToString();&lt;br /&gt;                        string strAcctPwdExpires = DateTime.FromFileTime(dateAcctPwdChange).ToString();&lt;br /&gt;&lt;br /&gt;                        // Calculate the difference between the date the pasword was changed, and what day it is now and display the # of days. &lt;br /&gt;                        TimeSpan time;&lt;br /&gt;                        time = dtNow - dtAcctPwdChange;&lt;br /&gt;&lt;br /&gt;                        adResult.ExpiresIn = time.Days;&lt;br /&gt;                        adResult.Valid = true;&lt;br /&gt;                    }&lt;br /&gt;                    );&lt;br /&gt;                }&lt;br /&gt;                catch (Exception ex)&lt;br /&gt;                {&lt;br /&gt;                    adResult.ErrorMessage = ex.Message;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch (Exception e)&lt;br /&gt;            {&lt;br /&gt;                adResult.ErrorMessage = e.Message;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return adResult;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;16. That’s it, and finally I would need to build UI from the object returned. Hence I have created BuildLoginDetails(ADResult reault) method to build UI as shown below:&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;private string BuildLoginDetails(ADResult adResult)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            if (!adResult.Valid)&lt;br /&gt;            {&lt;br /&gt;                return string.Empty;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            StringBuilder sb = new StringBuilder();&lt;br /&gt;&lt;br /&gt;            if (adResult.Disabled)&lt;br /&gt;            {&lt;br /&gt;                sb.Append("&lt;strong&gt;&lt;span style='color: red'&gt;Account Disabled&lt;/span&gt;&lt;/strong&gt;");&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                if (adResult.Locked)&lt;br /&gt;                {&lt;br /&gt;                    sb.Append("&lt;strong&gt;&lt;span style='color: red'&gt;Account Locked&lt;/span&gt;&lt;/strong&gt;");&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                if (adResult.ExpiresIn == 0 &amp;&amp; !adResult.Locked)&lt;br /&gt;                {&lt;br /&gt;                    sb.Append("&lt;strong&gt;&lt;span style='color: red'&gt;Password Expired:&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;");&lt;br /&gt;                    sb.Append("&lt;a href='../_layouts/ChangePassword.aspx'&gt;Change Password&lt;/a&gt;");&lt;br /&gt;                }&lt;br /&gt;                else if (!adResult.Locked)&lt;br /&gt;                {&lt;br /&gt;                    sb.Append(String.Format("&lt;BR/&gt;Password expires in {0} days", adResult.ExpiresIn));&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                sb.Append("&lt;BR/&gt;&lt;em&gt;" + adResult.LastLogon + "&lt;/em&gt;");&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return sb.ToString();&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;17. From the string returned from the above method,  can be displayed on UI with a simple label in the event handler as shown below:&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;br /&gt;void login_LoginError(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            System.Web.UI.WebControls.Label lblDetails = new System.Web.UI.WebControls.Label();&lt;br /&gt;            lblDetails.Text = this.BuildLoginDetails(this.GetLoginDetails(this.login.UserName));&lt;br /&gt;            this.login.Controls.Add(lblDetails);&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;18. Now, build the class library, and drop into GAC.&lt;br /&gt;19. Finally, Login page should be created. Navigate to C:\Program files\Common files\Microsoft shared\web service extensions\12\layouts folder . Copy Login page and paste it as CustomLogin.aspx.. Couple of changes needed on the CustomLogin.aspx. &lt;br /&gt; No one is , The aspx page should inherit from CustomLoginPage.cs which we had created earlier.&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&amp;lt;%@ Page Language="C#" Inherits="SharePoint.Authentication.Custom.ActiveDirectory.CustomLoginPage" MasterPageFile="~masterUrl/default.master"      %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Second is, add an assembly entry to use the dll we had created. As&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ Assembly Name=" SharePoint.Authentication.Custom.ActiveDirectory, Version=1.0.0.0, Culture=neutral, PublicKeyToken=12bc1ebe5d50d609"%&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;in your case the PublicKeyToken will be different, make sure you copy right token from GAC or by using good old friend .Net Reflector&lt;br /&gt;&lt;br /&gt;Third is, Importing namespaces. Add below shown entries.&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ Import Namespace="ActiveDs" %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;20. We have now developed CustomLogin page. Next part is customising SharePoint Application to use the Custom Login page.&lt;br /&gt;21. The following steps provide modification needed to Web.config file for using ASP.NET forms authentication to use an Active Directory service membership provider.&lt;br /&gt;&lt;br /&gt;1.Open web.config file from the path: c:\Inetpub\wwwroot\web.config and add below shown entries under &lt;configuration&gt; section of web.config file&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;connectionStrings&gt;&lt;br /&gt;  &amp;lt;add name="ADConnectionString" &lt;br /&gt;   connectionString=&lt;br /&gt;    " LDAP://ptr.headquarters.com/DC=ptr,DC=headquarters,DC=com" /&amp;gt;&lt;br /&gt;&amp;lt;/connectionStrings&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;2. And add below shown membership provider under &lt;system.web&gt; section&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;membership defaultProvider="ADirectoryMembershipProvider"&amp;gt;&lt;br /&gt;      &amp;lt;providers&amp;gt;&lt;br /&gt;        &amp;lt;add connectionStringName="ADConnectionString" name="ADirectoryMembershipProvider"&lt;br /&gt;         type="System.Web.Security.ActiveDirectoryMembershipProvider,  System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"&lt;br /&gt;         enableSearchMethods="true" attributeMapUsername="sAMAccountName"&lt;br /&gt;     /&amp;gt;&lt;br /&gt;      &amp;lt;/providers&amp;gt;&lt;br /&gt;    &amp;lt;/membership&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;4. From the Central Administration page of WSS 3.0, navigate to Application management.&lt;br /&gt;5. Create New Intranet application from the link Create/Extend New Web Application as shown in fig below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QsDuG4K936c/R0rodEEXvxI/AAAAAAAAGG8/pFkJGovYM_8/s1600-h/c1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_QsDuG4K936c/R0rodEEXvxI/AAAAAAAAGG8/pFkJGovYM_8/s320/c1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137173910975397650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6. Now, Extend this Intranet application to external users by clicking on Application Management\Create new or extend web application link from the Central Administration Page.&lt;br /&gt;7. The details should be provided in order to extend the intranet application is shown fig below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QsDuG4K936c/R0ro4kEXvzI/AAAAAAAAGHM/3EyQggpleTw/s1600-h/c3.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_QsDuG4K936c/R0ro4kEXvzI/AAAAAAAAGHM/3EyQggpleTw/s320/c3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137174383421800242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_QsDuG4K936c/R0rozUEXvyI/AAAAAAAAGHE/Kt72fDQSyh0/s1600-h/c2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_QsDuG4K936c/R0rozUEXvyI/AAAAAAAAGHE/Kt72fDQSyh0/s320/c2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137174293227487010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;8. Click OK to continue to extend web application.&lt;br /&gt;9. Navigate to Application Management\Authentication Providers and select Extranet Zone and provide details as show in fig below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QsDuG4K936c/R0rp6EEXv1I/AAAAAAAAGHc/VgUac38xtqY/s1600-h/c4.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_QsDuG4K936c/R0rp6EEXv1I/AAAAAAAAGHc/VgUac38xtqY/s320/c4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137175508703231826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;10. Click Ok to continue.&lt;br /&gt;11. open IIS Manager, select the Web site choosen for authentication, go to properties by Right click. And then to ASP.Net tab. Click on Edit Configuration settings and move to Authentication tab.  On this screen, modify Login.aspx to CustomLogin.aspx as show in screen shot.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QsDuG4K936c/R0rqP0EXv2I/AAAAAAAAGHk/eXBXGeidY0E/s1600-h/b8.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_QsDuG4K936c/R0rqP0EXv2I/AAAAAAAAGHk/eXBXGeidY0E/s320/b8.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137175882365386594" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;by doing so, we are instructing the Membership provider to use CustomLogin.aspx. and the rest IIS.&lt;br /&gt;&lt;br /&gt;22. From the browser, enter the URL of extranet web application, which should display the login screen as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QsDuG4K936c/R0rqe0EXv3I/AAAAAAAAGHs/UYWXoAN_4Vo/s1600-h/b6.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_QsDuG4K936c/R0rqe0EXv3I/AAAAAAAAGHs/UYWXoAN_4Vo/s320/b6.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137176140063424370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;for some reasons, user can not logon, the following UI would be displayed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QsDuG4K936c/R0rrWkEXv5I/AAAAAAAAGH8/jnClnSqAsuw/s1600-h/b1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_QsDuG4K936c/R0rrWkEXv5I/AAAAAAAAGH8/jnClnSqAsuw/s320/b1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5137177097841131410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think this article make sense to implement and delve challenges.&lt;br /&gt;&lt;br /&gt;ufff.. thts it..!&lt;br /&gt;In next part, will explain how to implement change password, until then bye..&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-480493274851912220?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/480493274851912220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=480493274851912220' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/480493274851912220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/480493274851912220'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2007/11/setting-up-different-authentication.html' title='Setting up different Authentication models in WSS 3.0 - Part 1'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QsDuG4K936c/R0rqe0EXv3I/AAAAAAAAGHs/UYWXoAN_4Vo/s72-c/b6.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-6031162627729814499</id><published>2007-08-03T17:08:00.000+01:00</published><updated>2008-11-13T09:47:51.227Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Ajax style with a flavour of LINQ</title><content type='html'>&lt;style type="text/css"&gt;&lt;br /&gt;BODY {&lt;br /&gt; PADDING-RIGHT: 0px; MIN-WIDTH: 768px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 0.7em Verdana, Tahoma, Arial, Helvetica, sans-serif; PADDING-TOP: 0px&lt;br /&gt;}&lt;br /&gt;#header {&lt;br /&gt; PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px&lt;br /&gt;}&lt;br /&gt;#header A {&lt;br /&gt; TEXT-DECORATION: none&lt;br /&gt;}&lt;br /&gt;#main {&lt;br /&gt; BACKGROUND-COLOR: white&lt;br /&gt;}&lt;br /&gt;#content {&lt;br /&gt; MARGIN: 0px 2em 0px 27em; BACKGROUND-COLOR: white&lt;br /&gt;}&lt;br /&gt;.float-left {&lt;br /&gt; FLOAT: left&lt;br /&gt;}&lt;br /&gt;#footer {&lt;br /&gt; CLEAR: both; PADDING-RIGHT: 0px; BORDER-TOP: #555 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; COLOR: #aaa; PADDING-TOP: 5px; BACKGROUND-COLOR: white; TEXT-ALIGN: center&lt;br /&gt;}&lt;br /&gt;#header IMG {&lt;br /&gt; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none&lt;br /&gt;}&lt;br /&gt;#nav-bar {&lt;br /&gt; BORDER-TOP: white 1px solid; COLOR: white; BORDER-BOTTOM: white 1px solid; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #999&lt;br /&gt;}&lt;br /&gt;#nav-bar UL {&lt;br /&gt; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; MARGIN: 0px; PADDING-TOP: 5px&lt;br /&gt;}&lt;br /&gt;#nav-bar LI {&lt;br /&gt; BORDER-RIGHT: white 1px solid; PADDING-RIGHT: 10px; DISPLAY: inline; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none&lt;br /&gt;}&lt;br /&gt;#nav-bar A {&lt;br /&gt; COLOR: white; TEXT-DECORATION: none&lt;br /&gt;}&lt;br /&gt;.sample-lang {&lt;br /&gt; PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: 4px; PADDING-TOP: 4px&lt;br /&gt;}&lt;br /&gt;.sample-lang-drop-down {&lt;br /&gt; FONT: 0.8em Tahoma, Verdana, Arial, Helvetica, sans-serif&lt;br /&gt;}&lt;br /&gt;#breadcrumbs {&lt;br /&gt; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; COLOR: white; PADDING-TOP: 3px; BORDER-BOTTOM: white 3px solid; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #4c74c2&lt;br /&gt;}&lt;br /&gt;#breadcrumbs UL {&lt;br /&gt; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 1.2em; PADDING-BOTTOM: 5px; MARGIN: 0px; PADDING-TOP: 5px&lt;br /&gt;}&lt;br /&gt;#breadcrumbs LI {&lt;br /&gt; DISPLAY: inline; COLOR: white; LIST-STYLE-TYPE: none&lt;br /&gt;}&lt;br /&gt;#breadcrumbs LI.first {&lt;br /&gt; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&lt;br /&gt;}&lt;br /&gt;#breadcrumbs A {&lt;br /&gt; COLOR: white&lt;br /&gt;}&lt;br /&gt;DIV.see-also UL {&lt;br /&gt; LIST-STYLE-IMAGE: none; LIST-STYLE-TYPE: none&lt;br /&gt;}&lt;br /&gt;H1 {&lt;br /&gt; MARGIN: 0px; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; WORD-WRAP: break-word&lt;br /&gt;}&lt;br /&gt;H2 {&lt;br /&gt; MARGIN: 0px; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; WORD-WRAP: break-word&lt;br /&gt;}&lt;br /&gt;H3 {&lt;br /&gt; MARGIN: 0px; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; WORD-WRAP: break-word&lt;br /&gt;}&lt;br /&gt;H4 {&lt;br /&gt; MARGIN: 0px; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; WORD-WRAP: break-word&lt;br /&gt;}&lt;br /&gt;H1 {&lt;br /&gt; FONT-SIZE: 1.6em; MARGIN-BOTTOM: 1.2em; PADDING-TOP: 10px&lt;br /&gt;}&lt;br /&gt;H2 {&lt;br /&gt; MARGIN-TOP: 2.5em; FONT-SIZE: 1.25em; MARGIN-BOTTOM: 0.6em&lt;br /&gt;}&lt;br /&gt;H3 {&lt;br /&gt; MARGIN-TOP: 1.2em; FONT-SIZE: 1em; MARGIN-BOTTOM: 0.3em&lt;br /&gt;}&lt;br /&gt;P {&lt;br /&gt; MARGIN: 0px 0px 1.2em; LINE-HEIGHT: 140%&lt;br /&gt;}&lt;br /&gt;DL {&lt;br /&gt; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1.2em 0px 0px; PADDING-TOP: 0px&lt;br /&gt;}&lt;br /&gt;DT {&lt;br /&gt; MARGIN: 0px&lt;br /&gt;}&lt;br /&gt;.disclaimer {&lt;br /&gt; MARGIN-TOP: 3em; COLOR: red&lt;br /&gt;}&lt;br /&gt;.nolink {&lt;br /&gt; FONT-WEIGHT: bold&lt;br /&gt;}&lt;br /&gt;A {&lt;br /&gt; COLOR: #36c&lt;br /&gt;}&lt;br /&gt;A:hover {&lt;br /&gt; COLOR: #1d489e; TEXT-DECORATION: none&lt;br /&gt;}&lt;br /&gt;IMG {&lt;br /&gt; MARGIN: 0px 0px 1.2em; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none&lt;br /&gt;}&lt;br /&gt;#content IMG {&lt;br /&gt; MARGIN-RIGHT: -1000px&lt;br /&gt;}&lt;br /&gt;UL {&lt;br /&gt; LIST-STYLE-POSITION: outside; LIST-STYLE-IMAGE: url(SiteArt/bullet.gif)&lt;br /&gt;}&lt;br /&gt;TABLE {&lt;br /&gt; BORDER-RIGHT: #dadada 1px solid; BORDER-TOP: #dadada 1px solid; MARGIN: 1.2em 0px 0px; BORDER-LEFT: #dadada 1px solid; WIDTH: 95%; BORDER-BOTTOM: #dadada 1px solid&lt;br /&gt;}&lt;br /&gt;TH {&lt;br /&gt; BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; VERTICAL-ALIGN: top; BORDER-LEFT: #dadada 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #dadada 1px solid&lt;br /&gt;}&lt;br /&gt;TD {&lt;br /&gt; BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; VERTICAL-ALIGN: top; BORDER-LEFT: #dadada 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #dadada 1px solid&lt;br /&gt;}&lt;br /&gt;TH {&lt;br /&gt; PADDING-RIGHT: 0.1em; PADDING-LEFT: 0.1em; PADDING-BOTTOM: 0.3em; PADDING-TOP: 0.3em; BACKGROUND-COLOR: #eee; TEXT-ALIGN: left&lt;br /&gt;}&lt;br /&gt;TH P {&lt;br /&gt; MARGIN: 0px&lt;br /&gt;}&lt;br /&gt;TD P {&lt;br /&gt; MARGIN: 0.3em 0px&lt;br /&gt;}&lt;br /&gt;DIV.procedure {&lt;br /&gt; BORDER-RIGHT: #dadada 1px solid; BORDER-TOP: #dadada 1px solid; MARGIN-BOTTOM: 1.2em; BORDER-LEFT: #dadada 1px solid; BORDER-BOTTOM: #dadada 1px solid&lt;br /&gt;}&lt;br /&gt;.procedure H3 {&lt;br /&gt; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR: #eee&lt;br /&gt;}&lt;br /&gt;.procedure OL {&lt;br /&gt; MARGIN: 0.6em&lt;br /&gt;}&lt;br /&gt;OL {&lt;br /&gt; PADDING-LEFT: 3em; MARGIN: 0px&lt;br /&gt;}&lt;br /&gt;OL LI {&lt;br /&gt; LIST-STYLE-POSITION: outside&lt;br /&gt;}&lt;br /&gt;.code PRE {&lt;br /&gt; BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH: 95%; COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR: #f0f0f0&lt;br /&gt;}&lt;br /&gt;SPAN.ui {&lt;br /&gt; FONT: 100% 'Courier New', Monospace; COLOR: #693&lt;br /&gt;}&lt;br /&gt;SPAN.keyword {&lt;br /&gt; FONT: bold 100% 'Courier New', Monospace; COLOR: #693&lt;br /&gt;}&lt;br /&gt;SPAN.input {&lt;br /&gt; FONT: 100% 'Courier New', Monospace&lt;br /&gt;}&lt;br /&gt;SPAN.code {&lt;br /&gt; FONT: 100% 'Courier New', Monospace; COLOR: #693&lt;br /&gt;}&lt;br /&gt;.live-code {&lt;br /&gt; PADDING-RIGHT: 5px; PADDING-LEFT: 10px; PADDING-BOTTOM: 5px; MARGIN: 10px; BORDER-LEFT: #bbb 3px solid; PADDING-TOP: 5px&lt;br /&gt;}&lt;br /&gt;.error-message {&lt;br /&gt; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: 120%; PADDING-BOTTOM: 100px; COLOR: #f11; PADDING-TOP: 30px&lt;br /&gt;}&lt;br /&gt;.live-code A {&lt;br /&gt; TEXT-DECORATION: none&lt;br /&gt;}&lt;br /&gt;.live-code A SPAN {&lt;br /&gt; VISIBILITY: hidden&lt;br /&gt;}&lt;br /&gt;.run-button {&lt;br /&gt; DISPLAY: inline-block; BACKGROUND: url(SiteArt/button_run.gif) no-repeat; WIDTH: 52px; HEIGHT: 47px&lt;br /&gt;}&lt;br /&gt;.run-button:hover {&lt;br /&gt; BACKGROUND-IMAGE: url(SiteArt/button_run-over.gif)&lt;br /&gt;}&lt;br /&gt;.run-button:active {&lt;br /&gt; BACKGROUND-IMAGE: url(SiteArt/button_run-down.gif)&lt;br /&gt;}&lt;br /&gt;.view-button {&lt;br /&gt; DISPLAY: inline-block; BACKGROUND: url(SiteArt/button_view.gif) no-repeat; WIDTH: 92px; HEIGHT: 47px&lt;br /&gt;}&lt;br /&gt;.view-button:hover {&lt;br /&gt; BACKGROUND-IMAGE: url(SiteArt/button_view-over.gif)&lt;br /&gt;}&lt;br /&gt;.view-button:active {&lt;br /&gt; BACKGROUND-IMAGE: url(SiteArt/button_view-down.gif)&lt;br /&gt;}&lt;br /&gt;.clear {&lt;br /&gt; CLEAR: both; FONT-SIZE: 1px&lt;br /&gt;}&lt;br /&gt;.keyword {&lt;br /&gt; FONT: 100% 'Courier New', Monospace; COLOR: #693&lt;br /&gt;}&lt;br /&gt;DIV.alert {&lt;br /&gt; BORDER-RIGHT: #ea7 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ea7 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 1.2em 0px; BORDER-LEFT: #ea7 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #ea7 1px solid; BACKGROUND-COLOR: #ffd&lt;br /&gt;}&lt;br /&gt;.alert {&lt;br /&gt; COLOR: #633&lt;br /&gt;}&lt;br /&gt;#toc {&lt;br /&gt; BORDER-RIGHT: #d7d7d7 1px solid; PADDING-RIGHT: 0.5em; FLOAT: left; PADDING-BOTTOM: 1200px; OVERFLOW: hidden; WIDTH: 24.5em; COLOR: #36c; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #f0f0f0&lt;br /&gt;}&lt;br /&gt;#toc UL {&lt;br /&gt; PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; LIST-STYLE-IMAGE: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none&lt;br /&gt;}&lt;br /&gt;#toc LI {&lt;br /&gt; FONT-WEIGHT: bold; FONT-SIZE: 1.2em; MARGIN: 0.5em 0px 0.5em 0.5em&lt;br /&gt;}&lt;br /&gt;#toc LI LI {&lt;br /&gt; PADDING-LEFT: 11px; FONT-SIZE: 0.83em; BACKGROUND: url(SiteArt/bullet_nav_big.gif) no-repeat left 0.2em; MARGIN: 0.5em 0px 0px 1em&lt;br /&gt;}&lt;br /&gt;#toc LI LI LI {&lt;br /&gt; FONT-WEIGHT: normal; FONT-SIZE: 1em; BACKGROUND: url(SiteArt/bullet_nav_small.gif) no-repeat left 0.2em; MARGIN: 0.1em 0px 0px 1em&lt;br /&gt;}&lt;br /&gt;#toc A {&lt;br /&gt; TEXT-DECORATION: none&lt;br /&gt;}&lt;br /&gt;#source-tree {&lt;br /&gt; BORDER-RIGHT: #d7d7d7 1px solid; PADDING-RIGHT: 0.5em; FLOAT: left; PADDING-BOTTOM: 1200px; OVERFLOW: hidden; WIDTH: 24.5em; COLOR: #36c; FONT-FAMILY: Tahoma, Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #f0f0f0&lt;br /&gt;}&lt;br /&gt;#source-tree UL {&lt;br /&gt; PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0.5em; LIST-STYLE-IMAGE: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none&lt;br /&gt;}&lt;br /&gt;#source-tree LI.AspNet-TreeView-Parent {&lt;br /&gt; PADDING-LEFT: 22px; FONT-WEIGHT: bold; BACKGROUND: url(SiteArt/folder2.gif) no-repeat; MARGIN: 0.5em 0px&lt;br /&gt;}&lt;br /&gt;#source-tree LI.AspNet-TreeView-Root {&lt;br /&gt; PADDING-LEFT: 22px; FONT-WEIGHT: bold; BACKGROUND: url(SiteArt/folder2.gif) no-repeat; MARGIN: 0.5em 0px&lt;br /&gt;}&lt;br /&gt;#source-tree LI.AspNet-TreeView-Leaf {&lt;br /&gt; PADDING-LEFT: 22px; FONT-WEIGHT: normal; BACKGROUND: url(SiteArt/txt.gif) no-repeat; MARGIN: 0.5em 0px&lt;br /&gt;}&lt;br /&gt;#source-tree A {&lt;br /&gt; TEXT-DECORATION: none&lt;br /&gt;}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;In this article, I would be demonstrating an example using Ajax with latest and hottest feature of .net: LINQ (Language INtegrated Query framework). I assume you are familiar with basics of Microsoft’s ASP.Net Ajax and LINQ.&lt;br /&gt;&lt;br /&gt;First of all I would like to brief about requirements of the demo and then steps to implement the same.&lt;br /&gt;&lt;br /&gt;A client wishes to see list of customers choosing a country.&lt;br /&gt;&lt;br /&gt;For this requirement, I am gonna list countries in a dropdown and display customers in a DataGrid. Simple isn’t it?&lt;br /&gt;&lt;br /&gt;There are many ways to implement this, but I have chosen my own way using Ajax style with LINQ.&lt;br /&gt;&lt;br /&gt;In detail, I will be using UpdateProgress and client scripts for user interaction and LINQ for processing data in the codebehind.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are the few steps to go ahead.&lt;br /&gt;Step1: Create a Ajax enabled website either using Visual Studio 2005 Codename Orcas or Visual Web Developer 2005 Codename Orcas.&lt;br /&gt;&lt;br /&gt;This will create a web form Default.aspx. Lets make screen ready and then go into deep!.&lt;br /&gt;&lt;br /&gt;With a blank web form, you would have already had Scriptmanager control (don’t worry about that now) on top of it. Drop a dropdownlist and GridView from tool box onto the screen as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_7beP_xG_4IU/RpcxaCKaYkI/AAAAAAAAAA0/N_j8u7duVC4/s1600-h/Ajax+style+with+a+flavour+of+LINQ_fig_1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5086588627465167426" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_7beP_xG_4IU/RpcxaCKaYkI/AAAAAAAAAA0/N_j8u7duVC4/s320/Ajax+style+with+a+flavour+of+LINQ_fig_1.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So when user selects a country from Dropdown, list of Customers are displayed. Dropdown triggers the request and GridView displays the action.&lt;br /&gt;&lt;br /&gt;For this purpose, I have created 2 classes for a Country and Customers inline with Default.aspx.cs which will be a data source for me.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;public class CustomerList&lt;br /&gt;{&lt;br /&gt;private List&lt;customer&gt; _customers;&lt;br /&gt;&lt;br /&gt;public CustomerList()&lt;br /&gt;{&lt;br /&gt;_customers = new List&lt;customer&gt;();&lt;br /&gt;_countries = new List&lt;country&gt;();&lt;br /&gt;&lt;br /&gt;this._countries.Add(new Country("India", "IN"));&lt;br /&gt;this._countries.Add(new Country("United States of America", "US"));&lt;br /&gt;this._countries.Add(new Country("United Kingdom", "UK"));&lt;br /&gt;this._countries.Add(new Country("France", "FR"));&lt;br /&gt;this._countries.Add(new Country("Italy", "IT"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List&lt;customer&gt; Customers()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;this._customers.Add(new Customer("Puru", this._countries[2]));&lt;br /&gt;this._customers.Add(new Customer("Venu", this._countries[1]));&lt;br /&gt;this._customers.Add(new Customer("Arindam", this._countries[0]));&lt;br /&gt;this._customers.Add(new Customer("John", this._countries[3]));&lt;br /&gt;this._customers.Add(new Customer("Philips", this._countries[4]));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return _customers;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private List&lt;country&gt; _countries;&lt;br /&gt;public List&lt;country&gt; Countries()&lt;br /&gt;{&lt;br /&gt;return _countries;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Customer&lt;br /&gt;{&lt;br /&gt;private string name;&lt;br /&gt;&lt;br /&gt;public string Name&lt;br /&gt;{&lt;br /&gt;get { return name; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private Country country;&lt;br /&gt;&lt;br /&gt;public Country Country&lt;br /&gt;{&lt;br /&gt;get { return country; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Customer(string name, Country country)&lt;br /&gt;{&lt;br /&gt;this.name = name;&lt;br /&gt;this.country = country;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Country&lt;br /&gt;{&lt;br /&gt;private string name;&lt;br /&gt;&lt;br /&gt;public string Name&lt;br /&gt;{&lt;br /&gt;get { return name; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private string code;&lt;br /&gt;&lt;br /&gt;public string Code&lt;br /&gt;{&lt;br /&gt;get { return code; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Country(string name, string code)&lt;br /&gt;{&lt;br /&gt;this.name = name;&lt;br /&gt;this.code = code;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Next, Create an handler to handle postback for Dropdownlist in the codebehind. Which will be like this..&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;…&lt;br /&gt;protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;if (this.DropDownList1.SelectedIndex != -1)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;.. .&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is interesting handler to discuss.&lt;br /&gt;&lt;br /&gt;In the page load add the below shown code in order to display country list in dropdown.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;if (!this.IsPostBack)&lt;br /&gt;{&lt;br /&gt;//..&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a point of foucs now. Here in this Page load I am gonna query data from CustomerList using LINQ to assin the result to dropdownlist.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;if (!this.IsPostBack)&lt;br /&gt;{&lt;br /&gt;var countryList = from countries in customerList.Countries()&lt;br /&gt;select countries;&lt;br /&gt;this.DropDownList1.DataSource = countryList;&lt;br /&gt;this.DropDownList1.DataTextField = "Name";&lt;br /&gt;this.DropDownList1.DataValueField = "Code";&lt;br /&gt;this.DropDownList1.DataBind();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;Intially I do not want to display the GridView, so make its visible false in PageLoad.&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;this.GridView1.Visible = false;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;/PRE&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then move on to Dropwdown’s handler: SelectIndexChanged..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here I would need to take selected value from country dropdown and query customsers from the list.&lt;br /&gt;&lt;br /&gt;I assume that there will be delay in getting customers from data. Hence there will be a sleep of 5 seconds for this thread.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.. .&lt;br /&gt;protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;if (this.DropDownList1.SelectedIndex != -1)&lt;br /&gt;{&lt;br /&gt;System.Threading.Thread.Sleep(5000);&lt;br /&gt;&lt;br /&gt;var customers = from cust in this.customerList.Customers()&lt;br /&gt;select cust;&lt;br /&gt;&lt;br /&gt;var customer = from c in customers&lt;br /&gt;where c.Country.Code == this.DropDownList1.SelectedValue.ToString()&lt;br /&gt;select c;&lt;br /&gt;&lt;br /&gt;this.GridView1.Visible = true;&lt;br /&gt;this.GridView1.DataSource = customer;&lt;br /&gt;this.GridView1.DataBind();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;/PRE&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That’s it from the code behind point of view..&lt;br /&gt;And a lot more needs to be done on aspx page. At this moment if you run the project, when you select a country, there will be a postback for each selection.&lt;br /&gt;&lt;br /&gt;We need to implement Ajax for this page.&lt;br /&gt;&lt;br /&gt;Step 2: Implementation of Ajax&lt;br /&gt;This page needs partial render/refresh for every post back. So Ajax supplies a control called UpdatePanel and will add on to the page.&lt;br /&gt;&lt;br /&gt;UpdatePanel allows us to update a page partially without post backing whole page or re rendering the whole page, which is not desirable if page is has tonnes of data. Hence I have dropped GridView into the UpdatePanel which needs partial refresh.&lt;br /&gt;&lt;br /&gt;I am gonna take GridView and drop into the UpdatePanel. No if you run the application, you will not see any post backs at all.&lt;br /&gt;&lt;br /&gt;Setp 3: Implement User’s interaction for Cancel/Abort&lt;br /&gt;For this purpose I would need to create client side javascript. So in the head element of html script add below shown lines of code.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;. . . &lt;br /&gt;&amp;lt;html xmlns=http://www.w3.org/1999/xhtml&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; …&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/PRE&gt;/&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;For this purpose I will add UpdateProgress control from Ajax Extensions tab. This control is responsible for displaying Progress activities when you select a country and allows us to interact with those post backing activities.&lt;br /&gt;&lt;br /&gt;Ajax exposes Ajax Libraries thro Sys namespace. There are tonnes of classes available in this namespace; among them I will be using PageRequestManager from Sys.WebForms namespace.&lt;br /&gt;&lt;br /&gt;I had to find workaround to fix “Sys undefined” javascript error on my by browser, Hence I am initalising  intial javascript code on load of the html’s body.&lt;br /&gt;&lt;br /&gt;So, I have created following code snippet in script block.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var prm;&lt;br /&gt;&lt;br /&gt;function pageLoad() &lt;br /&gt;      {&lt;br /&gt;          if(prm == null)&lt;br /&gt;          {&lt;br /&gt;            prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br /&gt;          }    &lt;br /&gt;      }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;And called this method in OnLoad of body’s event&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt; . . &lt;br /&gt;&amp;lt;body onload="pageLoad()"&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;. . &lt;br /&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;Here I am creating an instance of PageRequestManager. It has several methods, but will be using which are applicable to my requirements.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.add_initializeRequest(..)&lt;br /&gt;.add_endRequest(..)&lt;br /&gt;.abortPostBack() are the methods which am interested in here.&lt;br /&gt;&lt;br /&gt;As name suggests they are delegates and consumes methods to initialise, end request.&lt;br /&gt;&lt;br /&gt;So I will be creating 2 more metohds to handle initialise and end request and abort/cancel postback/request.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;var postBackElement;&lt;br /&gt;    function InitializeRequest(sender, args) {&lt;br /&gt;        if (prm.get_isInAsyncPostBack()) {&lt;br /&gt;            args.set_cancel(true);&lt;br /&gt;        }&lt;br /&gt;        postBackElement = args.get_postBackElement();&lt;br /&gt;        if (postBackElement.id == 'DropDownList1') {&lt;br /&gt;            $get('UpdateProgress1').style.display = 'block';                &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    function EndRequest(sender, args) {&lt;br /&gt;        if (postBackElement.id == 'DropDownList1') {&lt;br /&gt;            $get('UpdateProgress1').style.display = 'none';&lt;br /&gt;        }&lt;br /&gt;. . . &lt;br /&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;In these methods, I have created postback element which triggers action and setting updatepanel’s propeties using dhtml.&lt;br /&gt;&lt;br /&gt;Finally, the overall script looks like this. &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;    var prm;&lt;br /&gt;    &lt;br /&gt;    var postBackElement;&lt;br /&gt;    function InitializeRequest(sender, args) {&lt;br /&gt;        if (prm.get_isInAsyncPostBack()) {&lt;br /&gt;            args.set_cancel(true);&lt;br /&gt;        }&lt;br /&gt;        postBackElement = args.get_postBackElement();&lt;br /&gt;        if (postBackElement.id == 'DropDownList1') {&lt;br /&gt;            $get('UpdateProgress1').style.display = 'block';                &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    function EndRequest(sender, args) {&lt;br /&gt;        if (postBackElement.id == 'DropDownList1') {&lt;br /&gt;            $get('UpdateProgress1').style.display = 'none';&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    function AbortRequest()&lt;br /&gt;    {&lt;br /&gt;        if(prm != null)  &lt;br /&gt;        {&lt;br /&gt;            prm.abortPostBack();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;      function pageLoad() &lt;br /&gt;      {&lt;br /&gt;          if(prm == null)&lt;br /&gt;          {&lt;br /&gt;            prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br /&gt;          }    &lt;br /&gt;            prm.add_initializeRequest(InitializeRequest);&lt;br /&gt;            prm.add_endRequest(EndRequest);&lt;br /&gt;      }&lt;br /&gt;    &lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;Along with this script, I also would like to add CSS capablities to this page in order to provide elegant look.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;    #UpdatePanel1 {&lt;br /&gt;      width:200px; height:250px; &lt;br /&gt;      border: 1px solid gray;&lt;br /&gt;    }&lt;br /&gt;    #UpdateProgress1 {&lt;br /&gt;      width:200px; background-color: #FFC0FF;&lt;br /&gt;      bottom: 0%; left: 0px; position: relative;&lt;br /&gt;    }&lt;br /&gt;    #GridView1 &lt;br /&gt;    {&lt;br /&gt;        width:200px; height:100px;&lt;br /&gt;    }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;The next step is, how to trigger action on the page.&lt;br /&gt;&lt;br /&gt;We now have, dropdownlist for Country, Gridview for Customer and UpdatePanel for partial rendering upon postback.&lt;br /&gt;&lt;br /&gt;I need to add UpdateProgress, a control from Ajax extension which provides status message of activites and abort feature as well.&lt;br /&gt;&lt;br /&gt;Please refer UpdateProgress control library for more details from Ajax website.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UpdateProgress provides a property called ProgressTemplate, where in you can add your own html code. Here I am adding a message and an html button and calling javscript’s AbortMethod() upon Abort button click which will cancel a postback which is under progress!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;asp:UpdateProgress ID="UpdateProgress1" runat="server" &lt;br /&gt;  AssociatedUpdatePanelID="UpdatePanel1"&amp;gt;&lt;br /&gt;        &amp;lt;ProgressTemplate&amp;gt;&lt;br /&gt;         Getting customers.. &lt;br /&gt;            &amp;lt;input id="btnCancel" type="button" value="Cancel" onclick="AbortRequest()" /&amp;gt;&lt;br /&gt;        &amp;lt;/ProgressTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/asp:UpdateProgress&amp;gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;One more thing I would like to mention is, you would need to associate Upadate panel which you are partially refreshing. Here in our case UpdatePanel1 is the candidate.&lt;br /&gt;&lt;br /&gt;I think we are done with this page I guess. So lets run and try how it works…&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_7beP_xG_4IU/Rpcx8iKaYlI/AAAAAAAAAA8/0x7h2Yf1L5A/s1600-h/Ajax+style+with+a+flavour+of+LINQ_fig_2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5086589220170654290" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_7beP_xG_4IU/Rpcx8iKaYlI/AAAAAAAAAA8/0x7h2Yf1L5A/s320/Ajax+style+with+a+flavour+of+LINQ_fig_2.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope you enjoyed the ride and please leave your comments..&lt;br /&gt;&lt;br /&gt;Take care,&lt;br /&gt;&lt;br /&gt;Here is the overall code.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;PRE style="BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #dadada 1px solid; PADDING-LEFT: 5px;PADDING-BOTTOM: 5px; FONT: 100% 'Courier New', Monospace; OVERFLOW: auto; BORDER-LEFT: #dadada 1px solid; WIDTH:95%;HEIGHT:300;COLOR: #693; PADDING-TOP: 5px; BORDER-BOTTOM: #dadada 1px solid; BACKGROUND-COLOR:#f0f0f0;overflow:scroll;&lt;br /&gt;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Defaault.aspx.cs&amp;gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Web.UI.HtmlControls;&lt;br /&gt;using System.Linq;&lt;br /&gt;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;public partial class _Default : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;    CustomerList customerList = new CustomerList();&lt;br /&gt;&lt;br /&gt;    protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        this.GridView1.Visible = false;&lt;br /&gt;        if (!this.IsPostBack)&lt;br /&gt;        {&lt;br /&gt;            var countryList = from countries in customerList.Countries()&lt;br /&gt;                            select countries;&lt;br /&gt;            this.DropDownList1.DataSource = countryList;&lt;br /&gt;            this.DropDownList1.DataTextField = "Name";&lt;br /&gt;            this.DropDownList1.DataValueField = "Code";&lt;br /&gt;            this.DropDownList1.DataBind();    &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        if (this.DropDownList1.SelectedIndex != -1)&lt;br /&gt;        {&lt;br /&gt;            System.Threading.Thread.Sleep(5000);&lt;br /&gt;&lt;br /&gt;            var customers = from cust in this.customerList.Customers()&lt;br /&gt;                            select cust;&lt;br /&gt;&lt;br /&gt;            var customer = from c in customers&lt;br /&gt;                           where c.Country.Code == this.DropDownList1.SelectedValue.ToString()&lt;br /&gt;                           select c;&lt;br /&gt;&lt;br /&gt;            this.GridView1.Visible = true;&lt;br /&gt;            this.GridView1.DataSource = customer;&lt;br /&gt;            this.GridView1.DataBind();&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class CustomerList&lt;br /&gt;{&lt;br /&gt;    private List&lt;Customer&gt; _customers;&lt;br /&gt;&lt;br /&gt;    public CustomerList()&lt;br /&gt;    {&lt;br /&gt;        _customers = new List&lt;Customer&gt;();&lt;br /&gt;        _countries = new List&lt;Country&gt;();&lt;br /&gt;&lt;br /&gt;        this._countries.Add(new Country("India", "IN"));&lt;br /&gt;        this._countries.Add(new Country("United States of America", "US"));&lt;br /&gt;        this._countries.Add(new Country("United Kingdom", "UK"));&lt;br /&gt;        this._countries.Add(new Country("France", "FR"));&lt;br /&gt;        this._countries.Add(new Country("Italy", "IT"));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public List&lt;Customer&gt; Customers()&lt;br /&gt;    {&lt;br /&gt;      &lt;br /&gt;&lt;br /&gt;        this._customers.Add(new Customer("Puru", this._countries[2]));&lt;br /&gt;        this._customers.Add(new Customer("Venu", this._countries[1]));&lt;br /&gt;        this._customers.Add(new Customer("Arindam", this._countries[0]));&lt;br /&gt;        this._customers.Add(new Customer("John", this._countries[3]));&lt;br /&gt;        this._customers.Add(new Customer("Philips", this._countries[4]));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        return _customers;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&lt;Country&gt; _countries;&lt;br /&gt;    public List&lt;Country&gt; Countries()&lt;br /&gt;    {&lt;br /&gt;        return _countries;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Customer&lt;br /&gt;{&lt;br /&gt;    private string name;&lt;br /&gt;&lt;br /&gt;    public string Name&lt;br /&gt;    {&lt;br /&gt;        get { return name; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private Country  country;&lt;br /&gt;&lt;br /&gt;    public Country Country&lt;br /&gt;    {&lt;br /&gt;        get { return country; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Customer(string name, Country country)&lt;br /&gt;    {&lt;br /&gt;        this.name = name;&lt;br /&gt;        this.country = country;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Country&lt;br /&gt;{&lt;br /&gt;    private string name;&lt;br /&gt;&lt;br /&gt;    public string Name&lt;br /&gt;    {&lt;br /&gt;        get { return name; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private string code;&lt;br /&gt;&lt;br /&gt;    public string Code&lt;br /&gt;    {&lt;br /&gt;        get { return code; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Country(string name, string code)&lt;br /&gt;    {&lt;br /&gt;        this.name = name;&lt;br /&gt;        this.code = code;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Default.aspx&amp;gt;&lt;br /&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;    #UpdatePanel1 {&lt;br /&gt;      width:200px; height:250px; &lt;br /&gt;      border: 1px solid gray;&lt;br /&gt;    }&lt;br /&gt;    #UpdateProgress1 {&lt;br /&gt;      width:200px; background-color: #FFC0FF;&lt;br /&gt;      bottom: 0%; left: 0px; position: relative;&lt;br /&gt;    }&lt;br /&gt;    #GridView1 &lt;br /&gt;    {&lt;br /&gt;        width:200px; height:100px;&lt;br /&gt;    }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;    &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;    var prm;&lt;br /&gt;    &lt;br /&gt;    var postBackElement;&lt;br /&gt;    function InitializeRequest(sender, args) {&lt;br /&gt;        if (prm.get_isInAsyncPostBack()) {&lt;br /&gt;            args.set_cancel(true);&lt;br /&gt;        }&lt;br /&gt;        postBackElement = args.get_postBackElement();&lt;br /&gt;        if (postBackElement.id == 'DropDownList1') {&lt;br /&gt;            $get('UpdateProgress1').style.display = 'block';                &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    function EndRequest(sender, args) {&lt;br /&gt;        if (postBackElement.id == 'DropDownList1') {&lt;br /&gt;            $get('UpdateProgress1').style.display = 'none';&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    function AbortRequest()&lt;br /&gt;    {&lt;br /&gt;        if(prm != null)  &lt;br /&gt;        {&lt;br /&gt;            prm.abortPostBack();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;      function pageLoad() &lt;br /&gt;      {&lt;br /&gt;          if(prm == null)&lt;br /&gt;          {&lt;br /&gt;            prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br /&gt;          }    &lt;br /&gt;            prm.add_initializeRequest(InitializeRequest);&lt;br /&gt;            prm.add_endRequest(EndRequest);&lt;br /&gt;      }&lt;br /&gt;    &lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body onload="pageLoad()"&amp;gt;&lt;br /&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:ScriptManager ID="ScriptManager1" runat="server" /&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;     &amp;lt;asp:DropDownList ID="DropDownList1" runat="server" Width="200px" &lt;br /&gt;  AutoPostBack="True" &lt;br /&gt;  onselectedindexchanged="DropDownList1_SelectedIndexChanged1"&amp;gt;&lt;br /&gt;  &amp;lt;/asp:DropDownList&amp;gt;&lt;br /&gt;    &amp;lt;asp:GridView ID="GridView1" runat="server"&amp;gt;&lt;br /&gt;    &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:UpdatePanel ID="UpdatePanel1" runat="server"&amp;gt;&lt;br /&gt;         &amp;lt;Triggers&amp;gt;&lt;br /&gt;          &amp;lt;asp:AsyncPostBackTrigger ControlID ="DropDownList1" /&amp;gt;&lt;br /&gt;         &amp;lt;/Triggers&amp;gt;&lt;br /&gt;        &amp;lt;/asp:UpdatePanel&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:UpdateProgress ID="UpdateProgress1" runat="server" &lt;br /&gt;  AssociatedUpdatePanelID="UpdatePanel1"&amp;gt;&lt;br /&gt;        &amp;lt;ProgressTemplate&amp;gt;&lt;br /&gt;         Getting customers.. &lt;br /&gt;            &amp;lt;input id="btnCancel" type="button" value="Cancel" onclick="AbortRequest()" /&amp;gt;&lt;br /&gt;        &amp;lt;/ProgressTemplate&amp;gt;&lt;br /&gt;        &amp;lt;/asp:UpdateProgress&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;   &lt;br /&gt;    &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;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-6031162627729814499?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/6031162627729814499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=6031162627729814499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/6031162627729814499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/6031162627729814499'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2007/08/ajax-style-with-flavour-of-linq.html' title='Ajax style with a flavour of LINQ'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7beP_xG_4IU/RpcxaCKaYkI/AAAAAAAAAA0/N_j8u7duVC4/s72-c/Ajax+style+with+a+flavour+of+LINQ_fig_1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6405171659367901658.post-6251881557163865352</id><published>2007-07-06T22:03:00.000+01:00</published><updated>2008-11-13T09:47:51.693Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Observer pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionTree'/><title type='text'>ActionTree</title><content type='html'>Well, i always wanted to create a control that is generic and should provide common functionalities used in our daily programming activities. Here, in this article i have made an attempt to express my thoughts and experience on creating and managing a control which provides basic functionalites.&lt;br /&gt;&lt;br /&gt;We know that we use activities CRUD's like Create, Save/Update, Delete in almost all UI's of applications. Also, we think that there should be a way to make these activites by using controls like buttons. We rather place buttons for each Create, Save/Update and Delete and handle their enablity and visiblity at various scenarios.&lt;br /&gt;ActionTree is named after a control which will have Action basic buttons like Create, Save, Delete and provides a an object in the form of Tree to these controls to control their enablity.&lt;br /&gt;&lt;br /&gt;Step 1:&lt;br /&gt;&lt;br /&gt;So, to get started i am gonna create a form (can be a windows or webform, doesnt matter!).&lt;br /&gt;&lt;br /&gt;Next, to control enabilty or visibility of these controls, i would need a class, which holds a property for each control.&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;public class ActionTree&lt;br /&gt;    {&lt;br /&gt;        private bool _create;&lt;br /&gt;&lt;br /&gt;        public bool Create&lt;br /&gt;        {&lt;br /&gt;            get { return _create; }&lt;br /&gt;            set { _create = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _save;&lt;br /&gt;&lt;br /&gt;        public bool Save&lt;br /&gt;        {&lt;br /&gt;            get { return _save; }&lt;br /&gt;            set { _save = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _delete;&lt;br /&gt;&lt;br /&gt;        public bool Delete&lt;br /&gt;        {&lt;br /&gt;            get { return _delete; }&lt;br /&gt;            set { _delete = value; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The propeties defined in above class can be corresponds to Properties of Control's Enabiltiy or Visuality. In my case i am choosing enability.&lt;br /&gt;&lt;br /&gt;Step 2:&lt;br /&gt;for the above class, i would create one more property called HasChanged and a method NotifyChange() which will notify that property has changed (One more thing i would like to mention here is i am using Observer pattern here) as follows:&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt; public bool Delete&lt;br /&gt;        {&lt;br /&gt;            get { return _delete; }&lt;br /&gt;            set &lt;br /&gt;            { &lt;br /&gt;                _delete = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _hasChanged;&lt;br /&gt;&lt;br /&gt;        public bool HasChanged&lt;br /&gt;        {&lt;br /&gt;            get { return _hasChanged; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void NotifyChange()&lt;br /&gt;        {&lt;br /&gt;            this._hasChanged = true;&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In NotifyChange() method, i would need to notify that property has changed. In order to do that, i am gonna create an event of type EventHandler delegate. But i also would need these properties to send out. So i am gonna create a class to hold that as well.&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt; public class ActionTreeEventArgs : EventArgs&lt;br /&gt;    {&lt;br /&gt;        private ActionTree _actions;&lt;br /&gt;&lt;br /&gt;        public ActionTreeEventArgs(ActionTree actions)&lt;br /&gt;        {&lt;br /&gt;            this._actions = actions;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public ActionTree ActionTree&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return _actions;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;then create a event property  of type EventHadnler delegate in class ActionTree which would look like as follows:&lt;br /&gt;&lt;br /&gt;ActionTree.cs&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;    private event EventHandler&lt;ActionTreeEventArgs&gt; _actionTreeChanged;&lt;br /&gt;        public event EventHandler&lt;ActionTreeEventArgs&gt; ActionTreeChanged&lt;br /&gt;        {&lt;br /&gt;            add&lt;br /&gt;            {&lt;br /&gt;                _actionTreeChanged += value;&lt;br /&gt;            }&lt;br /&gt;            remove&lt;br /&gt;            {&lt;br /&gt;                _actionTreeChanged -= value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;then finally i am gonna create a method in ActionTree class, to handle this event and notify.&lt;br /&gt;&lt;br /&gt;ActionTree.cs&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;..&lt;br /&gt;..&lt;br /&gt;   private void NotifyChange()&lt;br /&gt;   {&lt;br /&gt;      this._hasChanged = true;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt; private void OnActionTreeChanged()&lt;br /&gt; {&lt;br /&gt;   EventHandler&lt;ActionTreeEventArgs&gt; handler = this._actionTreeChanged;&lt;br /&gt;   if (handler != null)&lt;br /&gt;   {&lt;br /&gt;     handler.Invoke(this, new ActionTreeEventArgs(this));&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and call this OnActionTreeChanged() method in NotifyChange() method. So we are nearly complete. What i mean is, at this moment, we are able to notify. and the UI who is subscribing to these notification needs to be done. that is step 3!.&lt;br /&gt;so final ActionTree class looks like this!.&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;public class ActionTree&lt;br /&gt;    {&lt;br /&gt;        private bool _create;&lt;br /&gt;&lt;br /&gt;        public bool Create&lt;br /&gt;        {&lt;br /&gt;            get { return _create; }&lt;br /&gt;            set &lt;br /&gt;            {&lt;br /&gt;                _create = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _save;&lt;br /&gt;&lt;br /&gt;        public bool Save&lt;br /&gt;        {&lt;br /&gt;            get { return _save; }&lt;br /&gt;            set &lt;br /&gt;            { &lt;br /&gt;                _save = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _delete;&lt;br /&gt;&lt;br /&gt;        public bool Delete&lt;br /&gt;        {&lt;br /&gt;            get { return _delete; }&lt;br /&gt;            set &lt;br /&gt;            { &lt;br /&gt;                _delete = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _hasChanged;&lt;br /&gt;&lt;br /&gt;        public bool HasChanged&lt;br /&gt;        {&lt;br /&gt;            get { return _hasChanged; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void NotifyChange()&lt;br /&gt;        {&lt;br /&gt;            this._hasChanged = true;&lt;br /&gt;            this.OnActionTreeChanged();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void OnActionTreeChanged()&lt;br /&gt;        {&lt;br /&gt;            EventHandler&lt;ActionTreeEventArgs&gt; handler = this._actionTreeChanged;&lt;br /&gt;            if (handler != null)&lt;br /&gt;            {&lt;br /&gt;                handler.Invoke(this, new ActionTreeEventArgs(this));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private event EventHandler&lt;ActionTreeEventArgs&gt; _actionTreeChanged;&lt;br /&gt;        public event EventHandler&lt;ActionTreeEventArgs&gt; ActionTreeChanged&lt;br /&gt;        {&lt;br /&gt;            add&lt;br /&gt;            {&lt;br /&gt;                _actionTreeChanged += value;&lt;br /&gt;            }&lt;br /&gt;            remove&lt;br /&gt;            {&lt;br /&gt;                _actionTreeChanged -= value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Step 3:&lt;br /&gt;Now we are on UI. Lets create a Windows/Web form. I am gonna create Windows form and add few buttons as said earlier as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4fs3_oOsI/AAAAAAAAAAM/lW2l9QECrPc/s1600-h/ActionTreeDemo_fig2.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4fs3_oOsI/AAAAAAAAAAM/lW2l9QECrPc/s320/ActionTreeDemo_fig2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5084035885153401538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the form code for each button click, other buttons should be disable accorging to the funcationality requirements. So, i am gonna create handler for each button as follows:&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;  private void btnCreate_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnSave_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnDelete_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and declare ActionTree as class variable and initialise in Load event.&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;private ActionTree _actions;&lt;br /&gt;&lt;br /&gt;  private void Form1_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions = new ActionTree();&lt;br /&gt; _actions.ActionTreeChanged += new EventHandler&lt;ActionTreeEventArgs&gt;(_actions_ActionTreeChanged);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt; private void _actions_ActionTreeChanged(object sender, ActionTreeEventArgs args)&lt;br /&gt;        {&lt;br /&gt;            this.btnCreate.Enabled = args.ActionTree.Create;&lt;br /&gt;            this.btnSave.Enabled = args.ActionTree.Save;&lt;br /&gt;            this.btnDelete.Enabled = args.ActionTree.Delete;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, we can now actually control properties of buttons using ActionTree object.&lt;br /&gt;for each button's handler, i am gonna introduce the following snippet of code.&lt;br /&gt;&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt; private void btnCreate_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions.Create = false;&lt;br /&gt;            _actions.Save = true;&lt;br /&gt;            _actions.Delete = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnSave_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions.Create = true;&lt;br /&gt;            _actions.Save = false;&lt;br /&gt;            _actions.Delete = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnDelete_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions.Create = true;&lt;br /&gt;            _actions.Save = true;&lt;br /&gt;            _actions.Delete = false;&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and when i open form and click on any button, it looks like this!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4i_3_oOtI/AAAAAAAAAAU/uGxaZBfcVVY/s1600-h/ActionTreeDemo_fig3.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4i_3_oOtI/AAAAAAAAAAU/uGxaZBfcVVY/s320/ActionTreeDemo_fig3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5084039510105799378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4jy3_oOuI/AAAAAAAAAAc/WnCcrPB6Q1o/s1600-h/ActionTreeDemo_fig4.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4jy3_oOuI/AAAAAAAAAAc/WnCcrPB6Q1o/s320/ActionTreeDemo_fig4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5084040386279127778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4jy3_oOvI/AAAAAAAAAAk/cRFfmKO5l3A/s1600-h/ActionTreeDemo_fig5.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4jy3_oOvI/AAAAAAAAAAk/cRFfmKO5l3A/s320/ActionTreeDemo_fig5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5084040386279127794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nice isn't it!!&lt;br /&gt;&lt;br /&gt;Here is the complete code:&lt;br /&gt;&lt;code style="background:buttonface;border:2"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;namespace ActionTreeDemo&lt;br /&gt;{&lt;br /&gt;    public partial class Form1 : Form&lt;br /&gt;    {&lt;br /&gt;        public Form1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private ActionTree _actions;&lt;br /&gt;&lt;br /&gt;        private void btnCreate_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions.Create = false;&lt;br /&gt;            _actions.Save = true;&lt;br /&gt;            _actions.Delete = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnSave_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions.Create = true;&lt;br /&gt;            _actions.Save = false;&lt;br /&gt;            _actions.Delete = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void btnDelete_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions.Create = true;&lt;br /&gt;            _actions.Save = true;&lt;br /&gt;            _actions.Delete = false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void Form1_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _actions = new ActionTree();&lt;br /&gt;            _actions.ActionTreeChanged += new EventHandler&lt;ActionTreeEventArgs&gt;(_actions_ActionTreeChanged);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void _actions_ActionTreeChanged(object sender, ActionTreeEventArgs args)&lt;br /&gt;        {&lt;br /&gt;            this.btnCreate.Enabled = args.ActionTree.Create;&lt;br /&gt;            this.btnSave.Enabled = args.ActionTree.Save;&lt;br /&gt;            this.btnDelete.Enabled = args.ActionTree.Delete;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class ActionTree&lt;br /&gt;    {&lt;br /&gt;        private bool _create;&lt;br /&gt;&lt;br /&gt;        public bool Create&lt;br /&gt;        {&lt;br /&gt;            get { return _create; }&lt;br /&gt;            set &lt;br /&gt;            {&lt;br /&gt;                _create = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _save;&lt;br /&gt;&lt;br /&gt;        public bool Save&lt;br /&gt;        {&lt;br /&gt;            get { return _save; }&lt;br /&gt;            set &lt;br /&gt;            { &lt;br /&gt;                _save = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _delete;&lt;br /&gt;&lt;br /&gt;        public bool Delete&lt;br /&gt;        {&lt;br /&gt;            get { return _delete; }&lt;br /&gt;            set &lt;br /&gt;            { &lt;br /&gt;                _delete = value;&lt;br /&gt;                NotifyChange();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private bool _hasChanged;&lt;br /&gt;&lt;br /&gt;        public bool HasChanged&lt;br /&gt;        {&lt;br /&gt;            get { return _hasChanged; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void NotifyChange()&lt;br /&gt;        {&lt;br /&gt;            this._hasChanged = true;&lt;br /&gt;            this.OnActionTreeChanged();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void OnActionTreeChanged()&lt;br /&gt;        {&lt;br /&gt;            EventHandler&lt;ActionTreeEventArgs&gt; handler = this._actionTreeChanged;&lt;br /&gt;            if (handler != null)&lt;br /&gt;            {&lt;br /&gt;                handler.Invoke(this, new ActionTreeEventArgs(this));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private event EventHandler&lt;ActionTreeEventArgs&gt; _actionTreeChanged;&lt;br /&gt;        public event EventHandler&lt;ActionTreeEventArgs&gt; ActionTreeChanged&lt;br /&gt;        {&lt;br /&gt;            add&lt;br /&gt;            {&lt;br /&gt;                _actionTreeChanged += value;&lt;br /&gt;            }&lt;br /&gt;            remove&lt;br /&gt;            {&lt;br /&gt;                _actionTreeChanged -= value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class ActionTreeEventArgs : EventArgs&lt;br /&gt;    {&lt;br /&gt;        private ActionTree _actions;&lt;br /&gt;&lt;br /&gt;        public ActionTreeEventArgs(ActionTree actions)&lt;br /&gt;        {&lt;br /&gt;            this._actions = actions;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public ActionTree ActionTree&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return _actions;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finally, u might ask whts the use of using this!? .. confused?... let me make it clear now.&lt;br /&gt;&lt;br /&gt;1. ActionTree will have all button's propertes whcih you want to control&lt;br /&gt;2. UI update is completely thread safe!. (irrespective of anything doing in background or asynchronous)&lt;br /&gt;&lt;br /&gt;3. you need not have to search buttons on the screen everytime. you will always will see controls defined in ActionTree, thats why its called TREE!...&lt;br /&gt;&lt;br /&gt;hope you enjoyed the ride and please leave your critics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6405171659367901658-6251881557163865352?l=ptumkur.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptumkur.blogspot.com/feeds/6251881557163865352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6405171659367901658&amp;postID=6251881557163865352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/6251881557163865352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6405171659367901658/posts/default/6251881557163865352'/><link rel='alternate' type='text/html' href='http://ptumkur.blogspot.com/2007/07/actiontree_06.html' title='ActionTree'/><author><name>Purushotam Ramakrishnappa</name><uri>http://www.blogger.com/profile/02761215017668227501</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7beP_xG_4IU/Ro4fs3_oOsI/AAAAAAAAAAM/lW2l9QECrPc/s72-c/ActionTreeDemo_fig2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
