<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.infragistics.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jess Chadwick</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/default.aspx</link><description>Your Friendly Neighborhood Webinary</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Central New Jersey MS Certification Study Group</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2008/04/20/central-new-jersey-ms-certification-study-group.aspx</link><pubDate>Sun, 20 Apr 2008 06:31:18 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:14735</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/14735.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=14735</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=14735</wfw:comment><description>&lt;p&gt;We had our inaugural meeting of the &amp;quot;NJDOTNET Spring '08 MCTS Study Group&amp;quot; this past Thursday, and I thought it was a wild success!&amp;#160; I had just under 30 people register (express interest) over the past few weeks, about 5 email me before the meeting to let me know that they wouldn't be able to attend this first one (but, yes, they are very excited!), and an even 20 people actually show up.&amp;#160; I sure am happy with those numbers!&amp;#160; My favorite part about the whole thing is the positive energy and just raw desire to dive deep into .NET that all of the members are showing.&amp;#160; It really is a great thing to know that you'll be able to meet up with these people (and this energy) for at least a few hours &lt;em&gt;every&lt;/em&gt; week.&lt;/p&gt;  &lt;p&gt;For those of you who haven't heard through the various other channels, we can still squeeze a few more members in.&amp;#160; So, if you're interested in getting your MCTS certification in Windows Forms or ASP.NET, please feel free to let me know.&amp;#160; We meet &lt;strong&gt;every Thursday night at 6:30 PM&lt;/strong&gt; at the &lt;strong&gt;Infragistics headquarters &lt;/strong&gt;just outside of &lt;strong&gt;Princeton, NJ&lt;/strong&gt;.&amp;#160; Check the &lt;a href="http://njdotnet.net"&gt;NJDOTNET Website&lt;/a&gt; or &lt;a href="http://blog.jesschadwick.com"&gt;my personal site&lt;/a&gt; for more information.&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=14735" width="1" height="1"&gt;</description></item><item><title>ASP.NET MVC ViewData Extensions</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2008/03/26/asp-net-mvc-viewdata-extensions.aspx</link><pubDate>Wed, 26 Mar 2008 06:20:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:13941</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/13941.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=13941</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=13941</wfw:comment><description>&lt;p&gt;I've been playing a little bit with ASP.NET MVC on my own (outside of the CodeCampServer project that I'm involved with) and I'm starting to really find out the cool uses and limits of the new framework the ASP.NET team has released to us.&amp;nbsp; The most awkward thing IMHO is dealing with ViewData; specifically, having to jump through hoops to get typed data out in your view when all you want to do is just &lt;i&gt;use&lt;/i&gt; it and not really have to worry about it.&lt;/p&gt;  &lt;p&gt;Out of the box, there's System.Web.Mvc.ViewPage which is what all of the beginner samples say to use.&amp;nbsp; Then, once your needs evolve a bit (just a bit is all it takes - you grow out of that quite quickly!) you realize that you need a way to easily access typed data in the view.&amp;nbsp; The MVC framework's answer to that (at least in the Preview 2 bits) is the generic version of the aforementioned ViewPage class (appropriately System.Web.Mvc.ViewPage&amp;lt;T&amp;gt;) which allows you to pass in one type to use as your ViewData.&amp;nbsp; This is a step in the right direction, but it still falls short since you find yourself creating all of these new classes just to hold a bunch of different types of view data and it often ends up being one new, custom class per page/view...&amp;nbsp; hardly a reuse of code there, and very (uncomfortably) reminiscent of Web Forms style development.&lt;/p&gt;  &lt;p&gt;You need a middle-ground - a nice way to interact with the ViewData collection in a strongly-typed way, but without having to create new classes to go along with each of your new views.&amp;nbsp; Jeffrey Palermo came up with a nice way of handling this with his SmartBag (that he describes in this post and subsequently implemented in the CodeCampServer project).&amp;nbsp; I really liked the idea at first because it solved a problem and it did it pretty well... not to mention somebody else did the work of creating it for me so all I had to do was just use it. :)&amp;nbsp; However, when I tried to start using it in my projects, it became all too clear just how much work Jeffrey had to go through to introduce it.&amp;nbsp; After thinking for a bit I remembered a powerful new tool that .NET 3.0 has provided us with - Extension Methods!&amp;nbsp; With these, you can tack on functionality to pretty much any class - or even interface - you want, and so I started tinkering...&lt;/p&gt;  &lt;p&gt;What I came up with was a set of extension methods on top of the Controller.ViewData property's type (IDictionary&amp;lt;x,y&amp;gt;) to make adding the strongly-typed data a lot easier using generics...&amp;nbsp; very simple, but very powerful and very helpful.&amp;nbsp; Then, going back to the whole impetus for this mess - I made a matching set of extension methods on top of the ViewPage.ViewData property (which is of type ViewData, interestingly enough) to help get access to the values we so easily tucked away using the Controller.ViewData extension methods.&amp;nbsp; I've been using it for a few weeks now and it seems to be working like a charm!&lt;/p&gt;  &lt;p&gt;Without further ado, here's the code!&lt;/p&gt; The Add Extension Method (to get data IN)   &lt;pre&gt;                &lt;br&gt;        /// &amp;lt;summary&amp;gt;&lt;br&gt;        /// Add a value to a dictionary, using its type name as the key&lt;br&gt;        /// &amp;lt;/summary&amp;gt;&lt;br&gt;        /// &amp;lt;param name="dictionary" /&amp;gt;Dictionary to add to&amp;lt;/param&amp;gt;&lt;br&gt;        /// &amp;lt;param name="data" /&amp;gt;Data to be added&amp;lt;/param&amp;gt;&lt;br&gt;        public static void Add(this IDictionary&amp;lt;string,object&amp;gt; dictionary, object data)&lt;br&gt;        {&lt;br&gt;            // Get the object's type name to use as the key&lt;br&gt;            string typeName = data.GetType().FullName;&lt;br&gt;&lt;br&gt;            // Check to see if it already exists and if it does, throw an exception&lt;br&gt;            if (dictionary.ContainsKey(typeName))&lt;br&gt;                throw new System.Data.DuplicateNameException(typeName);&lt;br&gt;&lt;br&gt;            // Add the data to the dictionary using the type name as the key&lt;br&gt;            dictionary[typeName] = data;&lt;br&gt;        }&lt;/pre&gt;
And then, to pull it back out on the view, I added these Extension Methods to the ViewData class: ViewData Extension Methods 

&lt;pre&gt;   &lt;br&gt;	/// &amp;lt;summary&amp;gt;&lt;br&gt;        /// Get the object saved in ViewData of this type.&lt;br&gt;        /// &amp;lt;/summary&amp;gt;&lt;br&gt;        /// &amp;lt;typeparam name="T"&amp;gt;Type of object to get&amp;lt;/typeparam&amp;gt;&lt;br&gt;        /// &amp;lt;param name="viewData" /&amp;gt;ViewData collection to retrieve from&amp;lt;/param&amp;gt;&lt;br&gt;        /// &amp;lt;returns&amp;gt;&lt;br&gt;        /// The typed data value (if found).  &lt;br&gt;        /// Otherwise, the default value for type T.&lt;br&gt;        /// &amp;lt;/returns&amp;gt;&lt;br&gt;        public static T Get&amp;lt;T&amp;gt;(this ViewData viewData)&lt;br&gt;        {&lt;br&gt;            return Get&amp;lt;T&amp;gt;(viewData, typeof(T).FullName);&lt;br&gt;        }&lt;br&gt;        /// &amp;lt;summary&amp;gt;&lt;br&gt;        /// Get the object saved in ViewData of this type.&lt;br&gt;        /// &amp;lt;/summary&amp;gt;&lt;br&gt;        /// Type of object to get&amp;lt;/typeparam&amp;gt;&lt;br&gt;        /// &amp;lt;param name="viewData" /&amp;gt;ViewData collection to retrieve from&amp;lt;/param&amp;gt;&lt;br&gt;        /// &amp;lt;param name="key" /&amp;gt;The key used to save the data.&amp;lt;/param&amp;gt;&lt;br&gt;        /// &amp;lt;returns&amp;gt;&lt;br&gt;        /// The typed data value (if found).  &lt;br&gt;        /// Otherwise, the default value for type T.&lt;br&gt;        /// &amp;lt;/returns&amp;gt;&lt;br&gt;        public static T Get&amp;lt;T&amp;gt;(this ViewData viewData, string key)&lt;br&gt;        {&lt;br&gt;            T returnValue;&lt;br&gt;            &lt;br&gt;            if (viewData.ContainsDataItem(key))&lt;br&gt;                returnValue = (T)viewData[key];&lt;br&gt;            else&lt;br&gt;            {&lt;br&gt;                // Since we're in the view, just play nice&lt;br&gt;                // and return the default value if it the &lt;br&gt;                // key doesn't exist.&lt;br&gt;                returnValue = default(T);&lt;br&gt;            }&lt;br&gt;            return returnValue;&lt;br&gt;        }&lt;/pre&gt;

&lt;p&gt;Simple enough, but I find them to be wicked useful! I hope you will, too. &lt;/p&gt;

&lt;p&gt;&lt;i&gt;&lt;b&gt;Edit:&lt;/b&gt; I noticed as I was looking through the CodeCampServer source tonight (just after finishing this post, no less) that Jeffrey had actually updated his SmartBag concept to something much more along the lines of this. Hey, I never said it was incredibly original, but it sure is nice to have your thoughts validated by someone else (especially one as knowledgeable as Jeffrey!).&lt;/i&gt;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=13941" width="1" height="1"&gt;</description></item><item><title>ASP.NET MVC Source Code Released</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2008/03/22/asp-net-mvc-source-code-released.aspx</link><pubDate>Sun, 23 Mar 2008 02:56:13 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:13904</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/13904.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=13904</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=13904</wfw:comment><description>&lt;p&gt;Just found out some cool news a little while ago:&amp;#160; the ASP.NET team graciously released the source code for their new wicked-cool framework on Wednesday.&amp;#160; You can get it at their CodePlex project &lt;a title="http://www.codeplex.com/aspnet" href="http://www.codeplex.com/aspnet"&gt;http://www.codeplex.com/aspnet&lt;/a&gt; (and &lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=11833"&gt;here's a link directly to the download page&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;This is a great development in the ongoing push that Microsoft seems to be making to become more and more transparent... or at the very least more agile.&amp;#160; And, I must say - I do like it!&amp;#160; So, if you haven't gotten a chance to play with the MVC framework stuff yet, go grab all the bits; if you have already been playing with it, now you can check out the source, too!&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=13904" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category></item><item><title>Upcoming Community Events (Central New Jersey)</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2008/01/09/upcoming-community-events-central-new-jersey.aspx</link><pubDate>Wed, 09 Jan 2008 06:54:47 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:12430</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/12430.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=12430</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=12430</wfw:comment><description>&lt;p&gt;If you're in the central New Jersey area for the next few weeks, we've got quite a few great events coming up:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;a href="http://www.njdotnet.net/blogs/meetings/archive/2008/01/07/january-s-meeting-sharepoint-101-a-developer-s-introduction-to-sharepoint.aspx" target="_blank"&gt;Thursday, January 10th:&amp;#160; NJDOTNET User Group Meeting - A Developer's Introduction to Sharepoint&lt;/a&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Come join us at the Infragistics World Headquarters for the Princeton area NJDOTNET User Group this Thursday night at 6:15 PM for a great talk given by our own &lt;a href="http://blogs.infragistics.com/blogs/tsnyder/" target="_blank"&gt;Todd Snyder&lt;/a&gt;!&amp;#160; I've had the pleasure of working relatively closely with Todd since he joined us at Infragistics a few months ago, and I can certainly tell you that he knows his stuff - Sharepoint in particular.&amp;#160; This should prove to be a &lt;em&gt;very&lt;/em&gt; interesting event!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.njdotnet.net/blogs/meetings/archive/2008/01/07/january-s-meeting-sharepoint-101-a-developer-s-introduction-to-sharepoint.aspx" target="_blank"&gt;Click here&lt;/a&gt; or the header above for more info!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.phillydotnet.org/" target="_blank"&gt;&lt;strong&gt;Saturday, January 12th:&amp;#160; Philly.NET Code Camp&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately, the registration period for this event has already closed, but maybe if you beg somebody over at the philly.net group, they'll let you in. :)&amp;#160; They've got a lot of great speakers and topics lined up so this, too, should prove to be a great event.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;a href="http://feeds.feedburner.com/~r/peterlau/~3/213338093/silverlight-1-0-firestarter-coming-to-nyc-january-26th.aspx" target="_blank"&gt;Saturday, January 26th:&amp;#160; New York City - Silverlight 1.0 Firestarter&lt;/a&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you missed the Silverlight Firestarter down in Philly last month, you missed a great time.&amp;#160; And, if you haven't even got a clue what Silverlight is, you're missing a whole lot more!&amp;#160; Luckily, the guys up in New York City have got you covered with their upcoming Firestarter event at the end of the month.&amp;#160; With a number of sessions throughout the day, developers with any level of Silverlight knowledge should be able to get a lot out of this event.&amp;#160; Click the link above for more details.&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=12430" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/NJDOTNET/default.aspx">NJDOTNET</category></item><item><title>Viva Las Vegas: See You at MIX '08!</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2008/01/02/viva-las-vegas-see-you-at-mix-08.aspx</link><pubDate>Wed, 02 Jan 2008 20:06:04 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:12329</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/12329.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=12329</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=12329</wfw:comment><description>&lt;p&gt;I recently found out that I'm one of the lucky ones whom Infragistics is sending to attend &lt;em&gt;&lt;strong&gt;the &lt;/strong&gt;&lt;/em&gt;Microsoft web developer event of the year - &lt;a href="http://www.visitmix.com/2008/index.html" target="_blank"&gt;MIX '08&lt;/a&gt;!&amp;nbsp; Getting to see such rockstars as Steve Ballmer, Scott Guthrie, and even Guy Kawasaki in person is really exciting... not to mention all of the other &lt;a href="https://content.visitmix.com/public/sessions.aspx" target="_blank"&gt;cool presentations, workshops, and panels&lt;/a&gt;.&amp;nbsp; This is the event I look forward to going to every year (and only partially due to the fact that it's in fabulous Las Vegas) and this year is certainly no exception.&amp;nbsp; Here are some of the topics I'm really excited about seeing this year:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ASP.NET MVC pattern&lt;/li&gt; &lt;li&gt;Windows Live platform&lt;/li&gt; &lt;li&gt;Dynamic SharePoint Websites&lt;/li&gt; &lt;li&gt;REST w/ ADO.NET Data Services Framework ("Astoria")&lt;/li&gt; &lt;li&gt;A whole slew of Silverlight stuff&lt;/li&gt; &lt;li&gt;and much more!&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;So, if you're a web developer, designer, manager... heck, if you even &lt;em&gt;surf&lt;/em&gt; the web, you should definitely come and check this show out!&lt;/p&gt; &lt;p&gt;I haven't yet figured out my exact schedule as far as which sessions I'll be attending, but I'll definitely be attending the opening party at TAO...&amp;nbsp; and after hours you'll almost certainly find me at the 3-6 table across the street at the Mirage.&amp;nbsp; :)&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=12329" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/conferences/default.aspx">conferences</category></item><item><title>Forums Update!</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/12/20/forums-update.aspx</link><pubDate>Thu, 20 Dec 2007 21:04:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:12082</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/12082.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=12082</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=12082</wfw:comment><description>&lt;P&gt;You may have seen my blog post a few weeks back about releasing an upgraded beta Community Server-based forums solution to &lt;A href="http://forums.labs.infragistics.com/"&gt;http://forums.labs.infragistics.com&lt;/A&gt;.&amp;nbsp; Thanks to our users' willingness to help us test out the new system as well as helping us identify and weed out any issues, we're ready to go live with it.&amp;nbsp; And, that's exactly what's happening starting &lt;STRONG&gt;tonight, &lt;/STRONG&gt;&lt;STRONG&gt;6 PM EST&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;During the update, you'll notice a few minutes of downtime on both the current solution living at &lt;A href="http://forums.infragistics.com/"&gt;http://forums.infragistics.com&lt;/A&gt; (and &lt;A href="http://news.infragistics.com/"&gt;http://news.infragistics.com&lt;/A&gt;) but once everything is back up, you'll be greeted by our new Community Server installation!&amp;nbsp; For those of you who have used the old forums and were not involved in our beta testing, there are a few things that have changed.&amp;nbsp; The most notable differences are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Integrated authentication (SSO) with the main website&lt;/STRONG&gt;.&amp;nbsp; You no longer have to log in to the forums separately - if you're logged in to the main website, you're authenticated on the forums! 
&lt;LI&gt;After long and careful analysis of our current newsgroup structure, we've decided to move some things around.&amp;nbsp; You'll notice that we've merged some groups together to provide a cleaner, more organized structure.&amp;nbsp; What's more, we've introduced the idea of groups and sub-forums to help you quickly and easily find exactly what you're looking for! 
&lt;LI&gt;Naturally, the above change in organization leads to the&amp;nbsp;newsgroup names changing. We did everything we could to avoid this from happening, but (as usual) change doesn't come without some expense. If you're currently using NNTP to subscribe to our forums, see the &lt;EM&gt;Updating Your NNTP Subscriptions&lt;/EM&gt; section below for more details on how to make the switch. 
&lt;LI&gt;&lt;STRONG&gt;User Points System&lt;/STRONG&gt;.&amp;nbsp; Want to know how you rank compared to other members of the forums?&amp;nbsp; Just compare your points!&amp;nbsp; Think of the possibilities this could bring in the future... :) 
&lt;LI&gt;Greatly improved searching (both internally and externally... e.g. Google!)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Updating Your NNTP Subscriptions&lt;/H3&gt;
&lt;P&gt;As I mentioned above, we've changed the names and paths of the current newsgroups.&amp;nbsp; The good news is that this should lead to more organized groups as well as more relevant threads within those groups.&amp;nbsp; The bad news is that&amp;nbsp;if you are subscribed via NNTP to our current newsgroups, you'll have to drop them and re-subscribe.&amp;nbsp; If this applies to you, here's what you're going to want to do:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Completely remove your current account.&amp;nbsp; &lt;EM&gt;Be sure to make whatever local backups you deem necessary!&lt;/EM&gt;&amp;nbsp; While the old forums will continue to live on (albeit under a different hostname: &lt;A href="http://forums.archive.infragistics.com/"&gt;http://forums.archive.infragistics.com&lt;/A&gt;), your local copies will most likely be deleted when you delete their associated account in your news reader (depending on the settings in your newsreader, of course).&lt;/LI&gt;
&lt;LI&gt;Create a new account, with the following settings:&lt;/LI&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;NNTP Server&lt;/STRONG&gt;: &lt;EM&gt;forums.infragistics.com&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Server requires authentication&lt;/STRONG&gt; (or similar):&amp;nbsp; &lt;EM&gt;true&lt;/EM&gt;, if you'd like to post/reply; &lt;EM&gt;false &lt;/EM&gt;if you're happy with anonymous viewing&lt;/LI&gt;
&lt;OL&gt;
&lt;LI&gt;If you selected &lt;EM&gt;true&lt;/EM&gt; in the step above, enter the same username and password as you use to log into the main website at &lt;A href="http://www.infragistics.com/Login.aspx"&gt;http://www.infragistics.com/Login.aspx&lt;/A&gt;.&amp;nbsp; If you do not have an account already, click on that link and click the "New Members" button to sign up!&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;Refresh your list of available groups.&amp;nbsp; You'll know you've got things set up properly if you get a list of groups that look like "netadvantage_for_asp.net.commands_and_editors" as opposed to "infragistics.products.netadvantage.aspnet.webhtmleditor".&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Subscribe&lt;/STRONG&gt; (or similar) and start enjoying your new NNTP goodness!&lt;/LI&gt;&lt;/OL&gt;&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For those of you who have been using NNTP to access our new forums while they have been in the beta phase, your accounts should continue to work without modification, however I strongly recommend you update the server name to "forums.infragistics.com" to avoid any potential funky-ness that should occur.&amp;nbsp; Depending on your reader, you should be able to leave the rest of your settings alone.&amp;nbsp; If this doesn't work for you, try using the steps listed above.&lt;/P&gt;
&lt;H3&gt;What About the Existing Forums?&lt;/H3&gt;
&lt;P&gt;During the release, we'll be switching the existing forums to read-only mode after which no more posts will be accepted.&amp;nbsp; After the release, the new forums will take over the &lt;EM&gt;forums.infragistics.com&lt;/EM&gt; hostname, however the archived, read-only forums will continue to be available at &lt;A href="http://forums.archive.infragistics.com/"&gt;http://forums.archive.infragistics.com&lt;/A&gt;. &lt;/P&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=12082" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Community+Server/default.aspx">Community Server</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Website+Updates/default.aspx">Website Updates</category></item><item><title>Upgrading from Visual Studio 2008 Beta 2 (and/or RC) to RTM</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/11/30/upgrading-from-visual-studio-2008-beta-2-and-or-rc-to-rtm.aspx</link><pubDate>Fri, 30 Nov 2007 18:16:41 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:11542</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/11542.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=11542</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=11542</wfw:comment><description>&lt;p&gt;Just wanted to write up a blog entry about my experience upgrading my Beta 2 and RC installations of Visual Studio 2008 (which I will forever call "Orcas") to the RTM version.&amp;nbsp; Hopefully this may save some of you from wasting a few hours of your life as I did...&lt;/p&gt; &lt;p&gt;I had the Orcas RC installed on both my laptop and home workstation, having already upgraded both from the Beta 2 release (with roughly the same upgrade experience on both machines as I'm going to describe).&amp;nbsp; I decided to upgrade my laptop to the RTM first, following the recommended procedure of completely uninstalling all previously installed components related to .NET 3.5 &amp;amp; anything labeled "2008" and this step ended up taking me &lt;strong&gt;&lt;em&gt;five and a half hours!&lt;/em&gt;&lt;/strong&gt;&amp;nbsp; Then, when I first ran the installer, it yelled at me because I had IE7 windows open - fair enough.&amp;nbsp; So, I closed them, continued with the installer and inevitably began opening more instances of IE as I continued to use my PC normally, not really thinking about the on-going installation in the background.&amp;nbsp; At some point late in the game, about 45 minutes in or so, I received &lt;em&gt;another&lt;/em&gt; popup yelling at me to close the IE instances I had re-opened!&amp;nbsp; After confirming with the installer that I had closed the applications it had asked me to, it proceeded to basically &lt;strong&gt;restart the installation&lt;/strong&gt; from the beginning! I never actually clocked it, but I think the installation step itself ended up taking &lt;strong&gt;over three hours&lt;/strong&gt;, which is just plain crazy!&lt;/p&gt; &lt;p&gt;But, all of those "please close IE" pop-ups I received along the way got me to thinking - this whole thing would probably go a lot smoother if I just kicked up the installer and left it alone to do its thing for a while.&amp;nbsp; I tested this theory on my home workstation...&amp;nbsp; I started the uninstall process and walked away, not touching anything or leaving anything running.&amp;nbsp; I came back about 45 minutes later with a happy "Successfully Uninstalled!" message waiting for me.&amp;nbsp; Super!&amp;nbsp; Then, on to the installation of Orcas RTM;&amp;nbsp; same deal - kick off the install and &lt;em&gt;walk away&lt;/em&gt;.&amp;nbsp; Another 45 minutes went by and I decided to go back and check on the install, expecting to find something like 60% complete or so...&amp;nbsp; Once again, I was pleasantly surprised to see a wonderful "Installation Complete!" message waiting for me, and my newly-renovated and upgraded development playground was ready to roll again!&amp;nbsp; &lt;strong&gt;This time, the whole process took less than an hour and a half &lt;/strong&gt;- from uninstall to completed install - and that's only because I chose to leave it for 45 minute increments; it was probably finished much quicker than that!&amp;nbsp; And, for what it's worth ('cause I know you're wondering), these two machines are very comparable in terms of memory and processor speed.&lt;/p&gt; &lt;p&gt;So, the moral of this story is:&lt;/p&gt; &lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;START THE UNINSTALL AND INSTALL PROCESSES AND WALK AWAY.&lt;/strong&gt;&amp;nbsp; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;Stay out of Orcas's way while it's setting up its goodness for you and you'll both be better off.&amp;nbsp; Just another Public Service Announcement from your friendly neighborhood Webinary...&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=11542" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category></item><item><title>Try Out Our Beta Forums!</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/11/19/try-out-our-beta-forums.aspx</link><pubDate>Mon, 19 Nov 2007 08:34:31 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:11087</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/11087.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=11087</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=11087</wfw:comment><description>&lt;p&gt;In case you haven't heard, we recently opened up the beta testing of our newly-upgraded forums to the general public...&amp;#160; and we'd love for you to try them out!&amp;#160; So, if you've got some time, cruise on over to &lt;a href="http://forums.labs.infragistics.com"&gt;http://forums.labs.infragistics.com&lt;/a&gt; and tell us what you think.&amp;#160; Now's the best time to give us feedback since we're only in &amp;quot;beta mode&amp;quot; and can easily change things around.&amp;#160; Also - just so you know - we're looking to go live with these upgraded forums shortly.&amp;#160; What this means to you users of the existing forums is that the upgrade will entail a bit of change, but it's nothing to fear.&lt;/p&gt;  &lt;p&gt;The best place to get information concerning the upgraded site - for both new and existing forums users - is &lt;a href="http://forums.labs.infragistics.com/forums/p/596/9739.aspx"&gt;Ambrose's nice little FAQ&lt;/a&gt;. Hopefully this should be all you need to help get you acquainted with the new system, but if you have any further questions or comments, feel free to post them in the new system and let us know!&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=11087" width="1" height="1"&gt;</description></item><item><title>Recent Website Update:  Export Your Keys to Excel!</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/11/16/recent-website-update-export-your-keys-to-excel.aspx</link><pubDate>Fri, 16 Nov 2007 18:01:03 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:10966</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/10966.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=10966</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=10966</wfw:comment><description>&lt;p&gt;We released an update to the &lt;a href="http://www.infragistics.com" target="_blank"&gt;main website&lt;/a&gt; last night that includes a few interesting and useful tidbits.&amp;nbsp; The two most notable of these are an updated&amp;nbsp; Supported Environments page as well as the ability to (finally! I know...) export your keys to Excel for off-line "safe keeping".&lt;/p&gt; &lt;h3&gt;Supported Environments&lt;a href="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/RecentWebsiteUpdateExportYourKeystoExcel_B719/image_5.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="147" alt="image" src="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/RecentWebsiteUpdateExportYourKeystoExcel_B719/image_thumb_1.png" width="243" align="right" border="0"&gt;&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Until now, our &lt;a href="http://www.infragistics.com/support/supported-environments.aspx" target="_blank"&gt;Supported Environments&lt;/a&gt; page has been relatively inane and somewhat difficult to use.&amp;nbsp; This recent update - besides adding cute little icons - lays everything out in a much more organized and (we feel) much more intuitive way.&amp;nbsp; Now you can more easily see exactly what is being supported along with what forms of support we're offering, broken down by product and environment.&amp;nbsp; Hopefully many of you will find this helpful.&amp;nbsp; Feel free to check out the screenshot to the right for a little taste of the new interface, just in case you don't feel like hitting the page itself:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Export Keys to Excel&lt;/h3&gt; &lt;p&gt;For a while now, you guys have been requesting the ability to be able to export your keys from &lt;a href="https://www.infragistics.com/Membership/Default.aspx?panel=Downloads" target="_blank"&gt;My Keys &amp;amp; Downloads section&lt;/a&gt; of our site to a local file (preferably an Excel spreadsheet).&amp;nbsp; Well, all I can say is "you're right!" and it's pretty silly that it's taken us this long to give it to you.&amp;nbsp; But, without further delay, I am glad to announce that you will finally be able to do it!&amp;nbsp; What's more, using the power of our &lt;a href="http://www.infragistics.com/dotnet/netadvantage/aspnet/webgrid.aspx" target="_blank"&gt;WebGrid&lt;/a&gt; &amp;amp; &lt;a href="http://www.infragistics.com/dotnet/netadvantage/aspnet/infragisticsexcel.aspx" target="_blank"&gt;WebGridExcelExcelExporter&lt;/a&gt; controls, it was &lt;strong&gt;super easy&lt;/strong&gt;!&amp;nbsp; We're already using a grid to display the keys; using our Excel exporter functionality, all it took was a few lines of code to export that grid into an Excel spreadsheet!&amp;nbsp; Granted, the styling could be a bit better - since it hasn't yet received the &lt;a href="http://www.infragistics.com/design/default.aspx" target="_blank"&gt;magic touch of VDG&lt;/a&gt; - but we are interested in getting this raw power into your hands ASAP!&lt;a href="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/RecentWebsiteUpdateExportYourKeystoExcel_B719/image_7.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="163" alt="image" src="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/RecentWebsiteUpdateExportYourKeystoExcel_B719/image_thumb_2.png" width="335" align="right" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I bet by now you're itching to take advantage of it, huh?&amp;nbsp; Well, for those of you who have registered keys, you can surf on over to your &lt;a href="https://www.infragistics.com/Membership/Default.aspx?panel=Downloads" target="_blank"&gt;My Keys &amp;amp; Downloads&lt;/a&gt; page and click on the "Export Keys" link next to the Excel icon - it's as easy as that!&amp;nbsp; &lt;/p&gt; &lt;p&gt;Please note, you're going to have to have &lt;em&gt;keys&lt;/em&gt; &lt;em&gt;registered to your account &lt;/em&gt;in order for this link to even show up, so if you haven't registered anything yet, well...&amp;nbsp; why not!? :)&amp;nbsp; Now's the perfect time to do so!&amp;nbsp; Also, always keep in mind that anything saved off-line will not be automatically updated in the future, so always check back on the site to view the most up-to-date information about your account.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Now it's back to coding for me so I start working on the next great update to help make your Infragistics.com experiences better!&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=10966" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/usability/default.aspx">usability</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Website+Updates/default.aspx">Website Updates</category></item><item><title>Custom Authentication with Community Server</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/10/24/custom-authentication-with-community-server.aspx</link><pubDate>Wed, 24 Oct 2007 06:10:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:10356</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/10356.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=10356</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=10356</wfw:comment><description>&lt;P&gt;You may have scrolled down to the bottom of one of our blog posts at some point and noticed the little Community Server logo in the page footer.&amp;nbsp; We've been using Community Server to host our blogs for some time now, and it's such a great platform that we're looking to leverage it a bit more.&amp;nbsp; To do what we're thinking of, you guys will need to be able to log in...&amp;nbsp; and what kind of user experience is it for you to have two IG.com accounts?&amp;nbsp; Enter Single Sign On (SSO), and lucky for us, Telligent sells a custom module that does just that.&amp;nbsp; Setting it up was a cinch: just drop the assembly in, tell Community Server which cookie to use, and make sure that your main site (the authenticating site) is setting the cookie correctly.&amp;nbsp; And, it really was that simple!&amp;nbsp; Well, almost...&lt;/P&gt;
&lt;P&gt;The out-of-the-box solution did work great for almost all scenarios.&amp;nbsp; There were, however, a few problems we had:&lt;/P&gt;
&lt;H3&gt;Cookie Timeouts&lt;/H3&gt;
&lt;P&gt;Unfortunately, it doesn't seem like the custom cookie authentication module can be configured to provide any type of sliding expiration behavior to the cookie.&amp;nbsp; That means that after a user logs in on the main site and the cookie is created, they only have as long as the cookie lives to be "singlely signed on" and once it expires, they'd be redirected back to the main site to re-authenticate themselves.&amp;nbsp; The most obvious and easiest fix would be to just set no expiration date on the cookie.&amp;nbsp; Sure - that'd work, but I prefer the security of having users automatically signed out after a period of inactivity, at least by default.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;So, I decided to write a module to check for the cookie on each request, and update the expiration date accordingly.&amp;nbsp; BAM - sliding expiration.&amp;nbsp; Below is the code I used to do it (you can also &lt;A class="" href="http://blogs.infragistics.com/blogs/jess_chadwick/attachment/10356.ashx"&gt;click here to download the code samples&lt;/A&gt;).&lt;/P&gt;
Cookie Manager
&lt;P&gt;public class CookieManager : IHttpModule &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Lifetime of sliding expiration (in minutes) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private const int COOKIE_LIFETIME = 20; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region CookieDomain &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static string _CookieDomain = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConfigurationManager.AppSettings["CookieDomain"]; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets or sets the cookie domain. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;value&amp;gt;The cookie domain.&amp;lt;/value&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string CookieDomain &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (String.IsNullOrEmpty(_CookieDomain)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string cookieDomain = null; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If no domain name was specified, try to guess one &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string hostname = HttpContext.Current.Request.Url.Host; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Try to get the domain name &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] hostnameParts = hostname.Split('.'); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hostnameParts.Length &amp;gt;= 2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookieDomain = String.Format( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "{0}.{1}", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hostnameParts[hostnameParts.Length - 2], &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hostnameParts[hostnameParts.Length - 1]); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _CookieDomain = cookieDomain ?? hostname; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch { /* We don't really care if this doesn't work... */ } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Don't allow an empty domain &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (String.IsNullOrEmpty(_CookieDomain)) _CookieDomain = "localhost"; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _CookieDomain; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _CookieDomain = value; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region SSOCookieName &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static string _SSOCookieName; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets the name of the SSO cookie that the&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Custom Authentication module is using. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;value&amp;gt;The name of the SSO cookie.&amp;lt;/value&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string SSOCookieName &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_SSOCookieName == null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Telligent.Components.Provider authProvider = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSConfiguration.GetConfig() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Extensions["CustomAuthentication"] as Telligent.Components.Provider; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (authProvider != null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _SSOCookieName = authProvider.Attributes["authenticatedUserCookieName"]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ApplicationException( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Could not find Community Server provider 'CustomAuthentication'."); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _SSOCookieName; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void KeepSSOCookieAlive(HttpContext context) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // See if we've got an SSO cookie &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpCookie cookie = context.Request.Cookies[SSOCookieName]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cookie != null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Make sure the domain name is set &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookie.Domain = CookieDomain; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Update the cookie's expiration (use sliding expiration) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookie.Expires = DateTime.Now.AddMinutes(COOKIE_LIFETIME); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send the cookie back &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.Cookies.Set(cookie); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IHttpModule Members &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Disposes of the resources (other than memory) used&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// by the module that implements &amp;lt;see cref="T:System.Web.IHttpModule"&amp;gt;&amp;lt;/see&amp;gt;. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt; public void Dispose() { } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt; /// Inits the specified application. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="application"&amp;gt;The application.&amp;lt;/param&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Init(HttpApplication application) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.BeginRequest += new EventHandler(application_BeginRequest); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void application_BeginRequest(object sender, EventArgs e) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; KeepSSOCookieAlive((sender as HttpApplication).Context); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion &lt;BR&gt;}&lt;/P&gt; 
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;There are a few things in this class I'd like to point out:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;The most important method, obviously, is the KeepSSOCookieAlive() method.&amp;nbsp; It's the heart of the module, but pretty straightforward. &lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;I decided to try to get the CookieDomain programmatically, but didn't really get into too complex of an operation to get the correct domain.&amp;nbsp; If for whatever reason this didn't work in production, you could easily override the guessing by setting it in the AppSettings. &lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;I'm getting the actual cookie name used by the provider - by actually retrieving the provider itself and asking it which cookie it's looking for - so that there won't be any confusion. &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;News Gateway Authentication&lt;/H3&gt;
&lt;P&gt;Ok, great - we've got the SSO for the main Community Server instance working like a charm, so I move on to getting Telligent's News Gateway service into place.&amp;nbsp; After reading through the docs for a bit, I see a very ominous line saying something to the effect of "Custom (cookie-based) Authentication won't work with the News Gateway."&amp;nbsp; Ugh!&amp;nbsp; I mean, it makes sense, but... Ugh!&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Of course, the first thing I do is try it and hope it works.&amp;nbsp; Unsurprisingly, it doesn't.&amp;nbsp; The next thing I do is take a step back, look through what's available, and spot Telligent's Form-based membership provider, which (I think) is the default provider in the Gateway.&amp;nbsp; The Cookie provider works by creating a Community Server account for a user that has logged in to the main site.&amp;nbsp; The problem with Forms (username/password combination) Authentication is that the Community Server account that is set up knows nothing about your password from the originating site, nor can it ask the originating site - that it knows nothing about - to authenticate you...&amp;nbsp; unless you help it.&lt;/P&gt;
&lt;P&gt;The solution was obvious: override the ValidateUser(string username, string password) method of the Community Server Forms Membership Provider.&amp;nbsp; I wasn't going to paste the code because it's just a simple override, but here's an example snippet (you can also &lt;A class="" href="http://blogs.infragistics.com/blogs/jess_chadwick/attachment/10356.ashx"&gt;click here to download the code samples&lt;/A&gt;):&lt;/P&gt;
Custom Membership Provider
&lt;P&gt;public class CustomMembershipProvider &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; : CommunityServer.ASPNet20MemberRole.CSMembershipProvider &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override bool ValidateUser(string username, string password) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO: Insert your custom validation logic here &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (username == "superdude" &amp;amp;&amp;amp; password = "wickedcool"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt; 
&lt;P&gt;That's right - just a regular ol' override of the membership provider.&amp;nbsp; Then you can follow it up by copying the Membership provider section in the configuration file (CommunityServer.NntpServer.Service.exe.config or CommunityServer.NntpServer.Console.exe.config, depending on which one you're using) and replace the CSMembershipProvider with your own.&amp;nbsp; Then, BAM - you've got username/password authentication against whatever data source you like.&lt;/P&gt;
&lt;P&gt;I hope this post can help you out if you were coming across some of the same problems we were!&lt;/P&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=10356" width="1" height="1"&gt;</description><enclosure url="http://blogs.infragistics.com/blogs/jess_chadwick/attachment/10356.ashx" length="1822" type="application/x-zip-compressed" /><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Community+Server/default.aspx">Community Server</category></item><item><title>What You Want vs. What I Want</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/10/24/what-you-want-vs-what-i-want.aspx</link><pubDate>Wed, 24 Oct 2007 04:56:38 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:10354</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/10354.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=10354</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=10354</wfw:comment><description>&lt;p&gt;You know what really grinds my gears?&amp;#xA0; Bad UX!&lt;/p&gt;  &lt;p&gt;I came across this login prompt today on a local county college library's website and it was just one more example of horrible UX that I see all too often and makes me physically sick:&lt;/p&gt;  &lt;div style="width:100%;text-align:center;"&gt;&lt;img id="id" style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px;border-right-width:0px;" height="129" alt="Horrible Login" src="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/WhatYouWantvs.WhatIWant_2BDE/login_3.png" width="640" border="0" /&gt; &lt;/div&gt;  &lt;p&gt;What's wrong with this?&amp;#xA0; Oh geeze... where do I start!?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What's with the horizontal alignment??&amp;#xA0; Stack these fields vertically, please!&amp;#xA0; Users are more than willing to scroll up/down almost indefinitely, but if you make them scroll horizontally, they may never come back again.&amp;#xA0; Granted, this particular example isn't &lt;em&gt;too&lt;/em&gt; wide, but why deviate from the de-facto standard? &lt;/li&gt;    &lt;li&gt;&amp;quot;College ID number (ex G12345678)&amp;quot;&amp;#xA0; This has always bothered me.&amp;#xA0; Why can't I choose my own login name?&amp;#xA0; Sure, I understand that it has to be linked to my asinine college ID number at some point - and that's fine - but let me choose a username I can remember.&amp;#xA0; Some people defend this practice, citing &amp;quot;security concerns.&amp;quot;&amp;#xA0; What: security through obscurity?&amp;#xA0; Give me a break - if I can log into my PayPal account with just a username and password, a county library system shouldn't need any more than that. &lt;/li&gt;    &lt;li&gt;Status!?!&amp;#xA0; What the heck!?&amp;#xA0; Why do you need to know my status?&amp;#xA0; And, what exactly is my status?&amp;#xA0; This may sound a little philosophical, but what &lt;em&gt;makes&lt;/em&gt; a Student or &amp;quot;Faculty/Staff&amp;quot;, anyway?&amp;#xA0; What if I am a student worker, employed by the college? &lt;/li&gt;    &lt;li&gt;The only action on the page is &amp;quot;Access Databases.&amp;quot;&amp;#xA0; What databases?&amp;#xA0; This is the prompt to login into an online library card catalogue .&amp;#xA0; I don't want to access &amp;quot;databases&amp;quot;, I want to search the card catalogue!&amp;#xA0; Actually, my &lt;em&gt;true&lt;/em&gt; goal is to find and request the book I'm looking for...&amp;#xA0; but I've already accepted that I have to use the online catalogue to do that. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It's the second and third items that particularly bother me, and the issues that I'm going to attempt to tackle in this post.&lt;/p&gt;  &lt;p&gt;&amp;#xA0;&lt;/p&gt;  &lt;h3&gt;The Problem&lt;/h3&gt;  &lt;p&gt;You may be saying, &amp;quot;calm down, it's just a library login...&amp;quot;&amp;#xA0; But that's the point - it's not.&amp;#xA0; You run into these things on a daily basis, and they need to stop!&amp;#xA0; UI developers need to make the interface much more polite; they need to cater to their customers instead of insisting their customers cater to them.&amp;#xA0; They ask you for things that they know just so they don't have to figure it out themselves.&amp;#xA0; They can (or at least &lt;em&gt;should&lt;/em&gt; be able to) take your ID number, cross-reference it against some database somewhere and determine what your status is, but - for whatever reasons - they don't.&amp;#xA0; Of course, these atrocities aren't limited to login pages... but any time you're soliciting something from the user - asking them to give you some of their priceless time and energy to give you something you want.&lt;/p&gt;  &lt;p&gt;It becomes an epic struggle between what you (the customer) and I (the developer) actually want out of this interaction.&amp;#xA0; You usually want a few specific things - in the above example, it happens that you'd like to locate and possibly reserve a book without leaving the comfort of your home.&amp;#xA0; I am here to write applications that give you what you need, but I also have concerns.&amp;#xA0; They may be security-, performance-, business-related, or a myriad other things... but who's needs should take precedence?&amp;#xA0; I'll give you a hint - if your needs didn't exist, I wouldn't have a job.&lt;/p&gt;  &lt;p&gt;And the most annoying thing about it all is that the solution is very easy...&lt;/p&gt;  &lt;p&gt;&amp;#xA0;&lt;/p&gt;  &lt;h3&gt;Put the Customer First&lt;/h3&gt;  &lt;p&gt;A lot of lip service is given to this concept, but somehow the sentiment often gets lost somewhere between the requirements phase and the UI design (if it was ever there to begin with)...&amp;#xA0; But, there's a solution: design with the customer in mind.&amp;#xA0; Obviously you're going to need some things - such as a username and password pair in order to authenticate a user, or billing information to complete an order&amp;#xA0; - but before you ask them to spend their valuable time giving you something, &lt;strong&gt;be sure you really need what you're asking for!&lt;/strong&gt;&amp;#xA0; Not only that, ask for it without wasting their time.&amp;#xA0; Here are a few tips:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;For &lt;em&gt;&lt;strong&gt;every&lt;/strong&gt;&lt;/em&gt; field you're requiring the user to enter, ask yourself if there is any way you can figure it out yourself using some other piece of information they've already provided.&amp;#xA0; If this is the case, don't waste their time asking them in the first place.&amp;#xA0; For instance: in the above example I can probably determine whether the user is Staff or Student once they've given me their ID &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Ask them for something they know&lt;/strong&gt; (or can remember easily)!&amp;#xA0; Don't require them to give you their randomly-assigned personal ID (e.g. college id, employee id, etc) every time!&amp;#xA0; It may be very important to you, but you can help them out by asking them &lt;strong&gt;once&lt;/strong&gt; (the first time) and then let them cross-reference it to something that they can remember, such as a username that they've picked.&amp;#xA0; Let the system do the memorizing of obscure data! &lt;/li&gt;    &lt;li&gt;It often helps to explain to customers - on a per-item basis - why it is you think this information is important.&amp;#xA0; Not only is this likely to decrease their annoyance at having to answer your questions, it will also help them understand what, exactly, you're asking for and may even increase their chances of being honest!      &lt;ul&gt;       &lt;li&gt;I know, I know - you're thinking &amp;quot;My users don't lie!&amp;quot;&amp;#xA0; Well, I guarantee that if you force them to give you information they don't want to give they will!&amp;#xA0; Tell me - honestly - how many times have you filled out a form, and entered your email address as &amp;quot;&lt;span&gt;effeafdsfefe@fdsafdsfe.com&lt;/span&gt;&amp;quot;? I thought so...&amp;#xA0; (Effeafdsfefe must be getting a LOT of junk mail, whomever he or she is!) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Ask yourself if you're going to &lt;em&gt;- realistically - &lt;/em&gt;do something with this data, or if it's just going to hang out in your database/data warehouse not being put to any good use.&amp;#xA0; Wasting your users' time asking them for information you don't really care about is the biggest insult you can give them.&amp;#xA0; If you determine this is true - that you don't really care about a particular item - but you decide &lt;strong&gt;not&lt;/strong&gt; to remove it anyway (e.g. some business group somewhere thinks it's really important), here are a few ideas that you might implement to ease the added burden you are now placing on your users:       &lt;ul&gt;       &lt;li&gt;Make it optional, &lt;em&gt;please&lt;/em&gt;!&amp;#xA0; If you're only going to use it at the rare times you're interested in it, let me decide whether or not I want to enter it.&amp;#xA0; I'll enter it during the rare times that I feel like wasting my time entering this extraneous data... &lt;/li&gt;        &lt;li&gt;Try grouping all of these optional items away from the ones so they don't detract from the importance of the required fields.&amp;#xA0; Then, you may even want to go so far as hiding these fields from the user, allowing the user to choose whether or not they even want to see them. &lt;/li&gt;        &lt;li&gt;Pre-populate it with sane default data that the user can simply accept as opposed to entering themselves &lt;/li&gt;        &lt;li&gt;If none of these works - and you're dealing with a known set of values - use the technique that's all the rage lately: &lt;strong&gt;auto-complete&lt;/strong&gt;.&amp;#xA0; This is where the user begins entering data and you try to guess what they're try to say before they're finished saying it...&amp;#xA0; saving them a bunch of energy.&amp;#xA0; If you're going to make them work, make them work as little as possible. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The common idea shared between those last two suggestions bears repeating: &lt;strong&gt;pre-populate whenever you can!&lt;/strong&gt;&amp;#xA0; If you know something, by all means &lt;strong&gt;be polite&lt;/strong&gt; and tell the user you know it already.&amp;#xA0; This can make all the difference between a smart, friendly interface and a waste of time.&amp;#xA0; After all, filling out a form doesn't really have to be a tedious, laborious task.&amp;#xA0; Not if it was created right!&lt;/p&gt;  &lt;p&gt;&amp;#xA0;&lt;/p&gt;  &lt;h3&gt;Take Action!&lt;/h3&gt;  &lt;p&gt;So, now I've made you aware of some of the worst things you can do to your users (along with some helpful tips to mitigate them).&amp;#xA0; Well... we're the developers who propagate these atrocities!&amp;#xA0; And, that means that we hold the power to end them.&amp;#xA0; So, I want you to try something:&amp;#xA0; every morning when you wake up, look in the mirror and say &amp;quot;Put the Customer First&amp;quot; three times.&amp;#xA0; One of two things will happen: either you'll start changing the way you think about designing interfaces, or... you'll feel incredibly silly and stop doing it very quickly.&amp;#xA0; It will probably be the latter (that's what happened to me), but at least you gave it a shot, and maybe just by trying you'll start thinking about it just a bit more;&amp;#xA0; and that's a step in the right direction.&amp;#xA0; Believe me: your users will thank you.&amp;#xA0; I know I will.&lt;/p&gt;  &lt;p&gt;&amp;#xA0;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Recommended Reading:&lt;/strong&gt;&amp;#xA0;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://books.google.com/books?id=04cFCVXC_AUC&amp;amp;pg=PA3&amp;amp;dq=inmates+running+the+asylum&amp;amp;sig=fVVchvGkBrOZAMX3vV6qttZCRf4#PPP1,M1" target="_blank"&gt;The Inmates Are Running the Asylum&lt;/a&gt;, by Alan Cooper. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://books.google.com/books?id=5clhONg4UQIC&amp;amp;dq=designing+interfaces&amp;amp;pg=PP1&amp;amp;ots=cyWb43FhkS&amp;amp;sig=f4uCsa3vjrk-dLFJfxdiPNv26cM&amp;amp;prev=http://www.google.com/search%3Fq%3DDesigning%2BInterfaces%26rls%3Dcom.microsoft:*%26ie%3DUTF-8%26oe%3DUTF-8%26startIndex%3D%26startPage%3D1&amp;amp;sa=X&amp;amp;oi=print&amp;amp;ct=title&amp;amp;cad=one-book-with-thumbnail" target="_blank"&gt;Designing Interfaces&lt;/a&gt;, by Jenifer Tidwell &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=10354" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/usability/default.aspx">usability</category></item><item><title>Awesome Article on Usability</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/10/09/awesome-article-on-usability.aspx</link><pubDate>Tue, 09 Oct 2007 19:07:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:10087</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/10087.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=10087</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=10087</wfw:comment><description>&lt;TABLE class=""&gt;

&lt;TR&gt;
&lt;TD class="" colSpan=2&gt;
&lt;P&gt;A buddy of mine sent me a link to the most concise article on usability I've seen in a while.&amp;nbsp; There may not be a slew of brand new ideas in here, but it is a great checklist of standard and common practices and ideas.&amp;nbsp; It starts with age-old, simplistic axioms such as the "7+-2 rule", the "2-second rule", and the "3-click rule", then delves into deeper topics, even finishing with a glossary!&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" colSpan=2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.smashingmagazine.com/2007/10/09/30-usability-issues-to-be-aware-of/" target=_blank&gt;&lt;STRONG&gt;Click here to check out the article.&lt;/STRONG&gt;&amp;nbsp; Do it now!&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=""&gt;
&lt;P&gt;I had to laugh when I came across the "Baby-Duck-Syndrome," since I was employing this theory just the other day during a discussion with &lt;A href="http://blogs.infragistics.com/blogs/eblankenship/" target=_blank&gt;Ed Blankenship&lt;/A&gt;.&amp;nbsp; I was arguing that his tendency toward excluding parenthesis when optional (e.g. preferring Fig. B over Fig. A, shown on the right) was due almost solely to&amp;nbsp; the fact that he was raised as a Visual Basic programmer and has only recently seen the light at the end of the tunnel, switching over to C#.&lt;/P&gt;
&lt;P&gt;Whoops, did I just alienate all of my VB readers?&amp;nbsp; Please don't let my C# elitism get in the way of our relationship... :)&amp;nbsp; Remember, we're all running the CLR underneath... &lt;/P&gt;&lt;/TD&gt;
&lt;TD class=""&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2&gt;

&lt;TR&gt;
&lt;TD class=""&gt;&lt;A href="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/AwesomeArticleonUsability_D411/image_2.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height=97 alt="Fig. A" src="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/AwesomeArticleonUsability_D411/image_thumb.png" width=114 align=right border=0&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" align=middle&gt;&lt;STRONG&gt;Fig. A&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=""&gt;&lt;A href="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/AwesomeArticleonUsability_D411/image_4.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height=98 alt=image src="http://blogs.infragistics.com/blogs/jess_chadwick/WindowsLiveWriter/AwesomeArticleonUsability_D411/image_thumb_1.png" width=116 align=right border=0&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" align=middle&gt;&lt;STRONG&gt;Fig. B&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=10087" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/UX/default.aspx">UX</category></item><item><title>Be Careful of What You Cache... and How You Cache It!</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/10/01/be-careful-of-what-you-cache-and-how-you-cache-it.aspx</link><pubDate>Mon, 01 Oct 2007 22:03:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:9890</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/9890.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=9890</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=9890</wfw:comment><description>This post is about a wonderfully embarrassing experience I had recently from which you can (hopefully) learn something. Or - at the very least - this can serve as a reminder of what you already know. Recently a few guys from our IS team and I locked ourselves...(&lt;a href="http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/10/01/be-careful-of-what-you-cache-and-how-you-cache-it.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=9890" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/Caching/default.aspx">Caching</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/HttpContext/default.aspx">HttpContext</category><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Upcoming NJDOTNET User Group meeting!</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/08/07/upcoming-njdotnet-user-group-meeting.aspx</link><pubDate>Tue, 07 Aug 2007 20:42:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:8352</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/8352.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=8352</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=8352</wfw:comment><description>I'll be speaking at the upcoming NJDOTNET User Group meeting in East Windsor, NJ this Thursday, August 9th. The topic? None other than unit testing and Test Driven Development. Here's the exerpt from the newsletter: Clean Code That Works – Jesse Chadwick...(&lt;a href="http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/08/07/upcoming-njdotnet-user-group-meeting.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=8352" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/jess_chadwick/archive/tags/NJDOTNET/default.aspx">NJDOTNET</category></item><item><title>Dummy Page Handler</title><link>http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/08/01/dummy-page-handler.aspx</link><pubDate>Wed, 01 Aug 2007 20:53:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:8011</guid><dc:creator>Jess Chadwick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/jess_chadwick/comments/8011.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/jess_chadwick/commentrss.aspx?PostID=8011</wfw:commentRss><wfw:comment>http://blogs.infragistics.com/blogs/jess_chadwick/rsscomments.aspx?PostID=8011</wfw:comment><description>My current project here at Infragistics is revamping our entire redirect and tracking backend. Since we are dealing with redirects and rewrites, my tests naturally ventured into the realm of doing something to/with the current HttpContext. As anyone who's...(&lt;a href="http://blogs.infragistics.com/blogs/jess_chadwick/archive/2007/08/01/dummy-page-handler.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=8011" width="1" height="1"&gt;</description></item></channel></rss>