<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/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>Stefan Sedich's Blog</title><link>http://weblogs.asp.net/stefansedich/default.aspx</link><description>My adventures in the wonderful world of .NET.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Paging with NHibernate using a custom Extension method to make it 'easier' :)...</title><link>http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make-it-easier.aspx</link><pubDate>Fri, 03 Oct 2008 11:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6656467</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6656467</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make-it-easier.aspx#comments</comments><description>&lt;p&gt;Evening All,&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;What better thing to do on a friday night than code and blog :P. Thought it was about time I shared my custom paging helper methods for NHibernate. I quite liked this solution as it worked nicely and was easy to use. I will go into as much detail as I can here without putting you to sleep.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;&lt;u&gt;The Idea&lt;/u&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;Basically my idea was to replicate something like in Linq to SQL, where you can basically define a query and call Skip(x).Take(x), in the end I came up with the idea of calling an ToPagedResult(index, pageSize); extension method, this would then return a PagedResult&amp;lt;T&amp;gt; object, the PageResult object would basically just be a container which would hold the total results and the total item count. Simple really, reason for this is just to make paging results a little easier and reduce code waste by wrapping my common functionality in my extension method.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;The Solution&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;The solution will need 2 things, first it will need my PagedResult&amp;lt;T&amp;gt; class, and then the ToPagedResult Extension method. Firstly the PagedResult class:&lt;/p&gt;&lt;p&gt;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The paged result container class, holds the page of data and the&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// total item count for the query.&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;typeparam name="TEntity"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class PagedResult&amp;lt;TEntity&amp;gt; {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Properties&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets the total number of items.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public long TotalItems { get; protected set; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets the items for the current page.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IList&amp;lt;TEntity&amp;gt; Items { get; protected set; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Constructor&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Inititialize an instance of the paged result object, setting the&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// items and total items.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PagedResult(IList&amp;lt;TEntity&amp;gt; items, long totalItems) {&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; TotalItems = totalItems;&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; Items = items;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;This is a simple class really just holds the page of items and the total item count, only reason for this is just a neat way to return the results. In another version of this class I have added properties for the page index, total pages properties too but in this example I kept it simple and just added what is needed.&lt;br&gt;&lt;br&gt;&lt;br&gt;Next up is the extension method, basically I have in my project an NHibernateExtensions class which holds all my common extension methods, but for the example I am only including the ToPagedResult extension, the code for this is below:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;public static class NHibernateExtensions {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Based on the ICriteria will return a paged result set, will create two copies &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// of the query 1 will be used to select the total count of items, the other&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// used to select the page of data.&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; /// The results will be wraped in a PagedResult object which will contain &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// the items and total item count.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;typeparam name="TEntity"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="criteria"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="startIndex"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="pageSize"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static PagedResult&amp;lt;TEntity&amp;gt; ToPagedResult&amp;lt;TEntity&amp;gt;(this ICriteria criteria, int startIndex, int pageSize) {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clone a copy of the criteria, setting a projection&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; // to get the row count, this will get the total number of &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; // items in the query using a select count(*)&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; ICriteria countCriteria = CriteriaTransformer.Clone(criteria)&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; .SetProjection(Projections.RowCount());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clone a copy fo the criteria to get the page of data,&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; // setting max and first result, this will get the page of data.s&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; ICriteria pageCriteria = CriteriaTransformer.Clone(criteria)&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; .SetMaxResults(pageSize)&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; .SetFirstResult(startIndex);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create a new pagedresult object and populate it, use the paged query &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; // to get the items, and the count query to get the total item count.&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; var pagedResult = new PagedResult&amp;lt;TEntity&amp;gt;(pageCriteria.List&amp;lt;TEntity&amp;gt;(),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int)countCriteria.UniqueResult());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Return the result.&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 pagedResult;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The extension method works as follows, it is an extension on the ICriteria, could be made to work with DetachedCriteria too but in my case I only need it for ICriteria, based on the query it will make 2 copies using the CriteriaTransformer.Clone method, one query will be used to get the total item count, so we set a count projection on it. &lt;br&gt;&lt;br&gt;The second copy is used to get the actual page of data, it uses NHibernates SetMaxResults and SetFirstResult methods to do this, then finally we create a new instance of our PagedResult container setting the items and item count using the two queries. Finally returning the paged result.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;Usage Example&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;To use this extension method we first define an ICriteria query and then call the extension method to get the data, and example on out People table would be something like so, the search is just getting a list of people with age &amp;gt; 20. The page to get will be 0, i.e. the first page and there will be 10 items per page.&lt;br&gt;&lt;/p&gt;&lt;p&gt;// Create the criteria to get people with age&amp;nbsp; &amp;gt; 20&lt;br&gt;ICriteria criteria = this.session.CreateCriteria(typeof (Person))&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; .Add(Restrictions.Gt("Age", 20));&lt;br&gt;&lt;br&gt;// Get the paged result using the above criteria and our new extension method.&lt;br&gt;PagedResult&amp;lt;Person&amp;gt; pagedResult = criteria.ToPagedResult&amp;lt;Person&amp;gt;(0, 10);&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;b&gt;Finish&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;Hope you might find this useful in some of your projects, although it it something very simple it has saved me a great deal of time with paging in my project and means writing less code which is always a bonus. Send me any comments/suggestions you wish I am always open to criticism :).&lt;br&gt;&lt;br&gt;&lt;br&gt;Cheers&lt;br&gt;Stefan&lt;u&gt;&lt;b&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;&lt;/u&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6656467" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Set the value of a version column in NHibernate manually</title><link>http://weblogs.asp.net/stefansedich/archive/2008/10/01/set-the-value-of-a-version-column-in-nhibernate-manually.aspx</link><pubDate>Wed, 01 Oct 2008 14:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6650227</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6650227</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/10/01/set-the-value-of-a-version-column-in-nhibernate-manually.aspx#comments</comments><description>&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Arial; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px;"&gt;My first post in a long time :), look forward to more from me as I am back baby. &lt;br&gt;&lt;br&gt;I am currently working on a project and for the first time am using NHibernate, I must say compared to LINQ to Sql I am in love, NHibernate ROCKS! An issue I was having was that I have a version column in my database defined as an integer and then in my NHibernate mapping files have defined a &amp;lt;version&amp;gt; element to map to this column. Now one issue is that in my service methods I do something like this:&lt;br&gt;&lt;br&gt;public void Update(MyDTO dto) {&lt;br&gt;&lt;br&gt;    // Select the item.&lt;br&gt;    var item = this.repository.SelectById(dto.Id);&lt;br&gt;&lt;br&gt;    // Map values from DTO to model.&lt;br&gt;    item.Name = dto.Name;&lt;br&gt;    item.Version = dto.Version;&lt;br&gt;&lt;br&gt;    // Call update&lt;br&gt;    this.repository.Update(item);   &lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;Because I am passing in a DTO object from my UI layer I need to first load the entity from the repository by Id. Then I map across my properties including the version, which in this case was populated from a hidden field on the UI into the DTO. Next I call update, now my initial assumption was that this would work as I excepted for optimistic locking. I thought that for example say the current version in the DB was 2, and the item we are updating is version 1, so it would load the item with a version = 2.&lt;br&gt;&lt;br&gt;Then we override the version to 1 and upon update I would expect it to use this version 1 for the optimistic check. WRONG it from what I understand uses the version value which is cached from a copy of the item upon loading it. If you look at the documentation there are 3 types approaches to optimistic concurrency.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;10.4.1. Long session with automatic versioning&lt;br&gt;&lt;br&gt;A single ISession instance and its persistent instances are used for the whole application transaction.&lt;br&gt;&lt;br&gt;The ISession uses optimistic locking with versioning to ensure that many database transactions appear to the application as a single logical application transaction. The ISession is disconnected from any underlying ADO.NET connection when waiting for user interaction. This approach is the most efficient in terms of database access. The application need not concern itself with version checking or with reattaching detached instances.&lt;br&gt;&lt;br&gt;// foo is an instance loaded earlier by the Session&lt;br&gt;session.Reconnect();&lt;br&gt;transaction = session.BeginTransaction();&lt;br&gt;foo.Property = "bar";&lt;br&gt;session.Flush();&lt;br&gt;transaction.Commit();&lt;br&gt;session.Disconnect();&lt;br&gt;The foo object still knows which ISession it was loaded it. As soon as the ISession has an ADO.NET connection, we commit the changes to the object.&lt;br&gt;&lt;br&gt;This pattern is problematic if our ISession is too big to be stored during user think time, e.g. an HttpSession should be kept as small as possible. As the ISession is also the (mandatory) first-level cache and contains all loaded objects, we can propably use this strategy only for a few request/response cycles. This is indeed recommended, as the ISession will soon also have stale data.&lt;br&gt;&lt;br&gt;10.4.2. Many sessions with automatic versioning&lt;br&gt;&lt;br&gt;Each interaction with the persistent store occurs in a new ISession. However, the same persistent instances are reused for each interaction with the database. The application manipulates the state of detached instances originally loaded in another ISession and then "reassociates" them using ISession.Update() or ISession.SaveOrUpdate().&lt;br&gt;&lt;br&gt;// foo is an instance loaded by a previous Session&lt;br&gt;foo.Property = "bar";&lt;br&gt;session = factory.OpenSession();&lt;br&gt;transaction = session.BeginTransaction();&lt;br&gt;session.SaveOrUpdate(foo);&lt;br&gt;session.Flush();&lt;br&gt;transaction.Commit();&lt;br&gt;session.Close();&lt;br&gt;You may also call Lock() instead of Update() and use LockMode.Read (performing a version check, bypassing all caches) if you are sure that the object has not been modified.&lt;br&gt;&lt;br&gt;10.4.3. Application version checking&lt;br&gt;&lt;br&gt;Each interaction with the database occurs in a new ISession that reloads all persistent instances from the database before manipulating them. This approach forces the application to carry out its own version checking to ensure application transaction isolation. (Of course, NHibernate will still update version numbers for you.) This approach is the least efficient in terms of database access.&lt;br&gt;&lt;br&gt;// foo is an instance loaded by a previous Session&lt;br&gt;session = factory.OpenSession();&lt;br&gt;transaction = session.BeginTransaction();&lt;br&gt;int oldVersion = foo.Version;&lt;br&gt;session.Load( foo, foo.Key );&lt;br&gt;if ( oldVersion != foo.Version ) throw new StaleObjectStateException();&lt;br&gt;foo.Property = "bar";&lt;br&gt;session.Flush();&lt;br&gt;transaction.Commit();&lt;br&gt;session.close();&lt;br&gt;Of course, if you are operating in a low-data-concurrency environment and don't require version checking, you may use this approach and just skip the version check.&lt;br&gt;&lt;br&gt;-------------------&lt;br&gt;&lt;br&gt; Now if you look at the above it is clear that I am using the third scenario hence why I as having the issues, if I kept the session around for the life of the transaction i.e store in cache when you display the page and then use this session again for the save, the version would have been handled automagically same being if you had the full object and call an Update with it on a new Session. &lt;br&gt;&lt;br&gt;But in my case I do not have the full object and am only mapping over a sub set of parameters from my DTO, so I need to first load the item by ID from the session and then map across my parameters, finally calling an update, this is where the issue is. To fix this the solution which I found on the Java forums and adopted was to create an interceptor which would handle the OnFlushDirty method. In here I will compare the Version of the entity being flushed to the Version of the item in the database, this will do what I would like and allows me to set the Version manually. &lt;br&gt;&lt;br&gt;The main issue is that there is 1 extra DB call to get the version, but in my case this is minimal. The code for the interceptor is below, it doesn't seem to have any issues as yet but will undergo more testing as time goes by.  The solution/ideas came from here: http://forum.hibernate.org/viewtopic.php?t=977889, and was changed to work.&lt;br&gt;&lt;br&gt;&lt;br&gt;public class NHInterceptor : EmptyInterceptor {&lt;br&gt;        private ISession _session;&lt;br&gt;&lt;br&gt;        public override void SetSession(ISession session) {&lt;br&gt;            this._session = session;&lt;br&gt;&lt;br&gt;            base.SetSession(session);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types) {&lt;br&gt;            ISessionImplementor sessimpl = _session.GetSessionImplementation();&lt;br&gt;            IEntityPersister persister = sessimpl.GetEntityPersister(entity);&lt;br&gt;            EntityMode mode = _session.GetSessionImplementation().EntityMode;&lt;br&gt;&lt;br&gt;            if(persister.IsVersioned) {&lt;br&gt;                object version = persister.GetVersion(entity, mode);&lt;br&gt;                object currentVersion = persister.GetCurrentVersion(id, sessimpl);&lt;br&gt;&lt;br&gt;                if (!persister.VersionType.IsEqual(currentVersion, version)) &lt;br&gt;                    throw new StaleObjectStateException(persister.EntityName, id);&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types);&lt;br&gt;        }&lt;br&gt;&lt;br&gt;    } &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Maybe you find this useful.&lt;br&gt;&lt;br&gt;&lt;br&gt;Thanks&lt;br&gt;Stefan&lt;/span&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6650227" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Enhanced XMLSiteMapProvider with support for dynamic nodes.</title><link>http://weblogs.asp.net/stefansedich/archive/2008/08/14/enhanced-xmlsitemapprovider-with-support-for-dynamic-nodes.aspx</link><pubDate>Thu, 14 Aug 2008 11:43:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6517294</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6517294</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/08/14/enhanced-xmlsitemapprovider-with-support-for-dynamic-nodes.aspx#comments</comments><description>&lt;p&gt;Hello All,&lt;/p&gt;&lt;p&gt;This might be a long one so bear with me here this might bore you :).&lt;br&gt;&lt;br&gt;&lt;br&gt;I have have had the need to be able to add dynamic nodes to my sitemap, I am using a sitemap xml file. My first solution, was to create a custom sitemap provider, which would parse the XML and if it detected the node I had to insert my dynamic nodes into, it would do this and then continue.&lt;/p&gt;&lt;p&gt;Fine I thought but not good enough. I wanted a generic solution that could be reused and that would be easy to use. I came up with the idea of extending the sitemap XML file to contain some new nodes. Then create a custom parser that would make use of this. The idea in the end was to add two new elements to the sitemap, the elements being &amp;lt;dynamicNode&amp;gt; and &amp;lt;dynamicNodes&amp;gt;, the idea was that they would call a static method on a class that would either return 1 node or a collection. These would then be injected into the sitemap when it is created.&lt;/p&gt;&lt;p&gt;The beauty here was that you could add dynamic nodes to our sitemap, one other side effect was that you could now nest dynamic nodes in static nodes, and also nest static nodes in either a dynamic node, or a dynamic nodes collection. If you look at the sample project supplied you will see this works quite well. One thing to note is that any static nodes added to either a dynamic node or dynamic nodes collection. It will be added at the end. Which I think is expected behaviour, well for me anyway.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;- The new sitemap file -&lt;br&gt;&lt;br&gt;Here is an example of what the sitemap file will now look like. Say we have 3 static nodes, and within the static products node, we need to get products from our database, and add them as children. You could create an easy site map file like so:&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;lt;siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" &amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;siteMapNode url="Default.aspx" title="Home"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="About.aspx" title="About Us" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="FAQ.aspx" title="FAQ" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="Product.aspx" title="Products"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dynamicNodes type="Sample.MenuHelper, Sample" method="GetProducts" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/siteMapNode&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/siteMapNode&amp;gt;&lt;br&gt;&amp;lt;/siteMap&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;Here you can see that we have added some static nodes, and within our products node, we have added a dynamicnodes, node. You can see that this calls the static method GetProducts on the MenuHelper class. This method will return a collection of nodes which will be inserted into our static nodes children. And dynamic insertion of child nodes is now possible :)... You are also able to have a dynamic node, which is a single root node, plus you can nest until your heart is content, which you will see in the sample.&lt;br&gt;&lt;br&gt;-- MenuHelper --&lt;br&gt;&lt;br&gt;In this class we would have a static GetProducts method, this would return a list of XX objects. These objects are helpers, they allow us to create a collection of sitemap nodes, so that they can be used in the provider to build up the sitemap. The node has the default properties (key,url,title,description) and you can add custom attributes too. The method would look like so, you could imagine this would use the database to get products and build up the list.&lt;br&gt;&lt;br&gt;public static List&amp;lt;EnhancedXMLSiteMapProvider.EnhancedSiteMapNode&amp;gt; GetProducts() {&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 new List&amp;lt;EnhancedXMLSiteMapProvider.EnhancedSiteMapNode&amp;gt;() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new EnhancedXMLSiteMapProvider.EnhancedSiteMapNode() {&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; Key="Product1.aspx",&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Url="Product1.aspx",&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title="Product 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; }&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; };&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;-- Web.Config Configuration --&lt;br&gt;&lt;br&gt;You need to configure the provider in the web.config. In the sample project this is done as so:&lt;br&gt;&lt;br&gt;&amp;lt;siteMap defaultProvider="EnhancedXMLSiteMapProvider"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;providers&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="EnhancedXMLSiteMapProvider" type="EnhancedXMLSiteMapProviderSample.EnhancedXMLSiteMapProvider, EnhancedXMLSiteMapProviderSample" &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; siteMapFile="~/Web.sitemap"&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cacheDuration="15"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/providers&amp;gt;&lt;br&gt;&amp;lt;/siteMap&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I am basically setting it as the default provider, I am pointing it to the xml sitemap file, and setting the cache duration (this defaults to 5 if not set). Once this is done you are ready to run. One thing to note is that the provider also puts a dependancy on the xml file, so that once changed it invalidates the sitemap. And also after the time duration. &lt;br&gt;&lt;br&gt;One issue is that any dynamic data does not invalidate the cache, you are able to set a cacheKey on the provider which is used for caching. Then you can use code to remove the item. So you backend could remove the cache item when it needs the menu to change.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-- The Provider --&lt;br&gt;&lt;br&gt;I am not going to go into full detail on the provider and show all the code, it is all included in the sample project so just have a look. Basically the main workings, just parses the XML file, depending on the node type will do different things. If it encounters a dynamicNode or dynamicNodes element it will grab the type and method attributes, and use reflection to call these methods and continue parsing the data. &lt;br&gt;&lt;br&gt;I have tested this with many levels/combinations of nodes and I have not had any issues yet, mind you I know this needs neatening up and it is only the efforts of a days work. I will post updates as I go and any bug fixes to this. But at the moment I am happy with where it is.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-- Final Word --&lt;/p&gt;&lt;p&gt;The sample project is supplied below, have a play and let me know what you think. Also this is the first time I have ever used the site map provider, so if I have just reinvented the wheel please give me a gentle slap and let me know :). &lt;/p&gt;&lt;p&gt;Sample Project Files&lt;br&gt;------------------------------------------------------------&lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/stefansedich/EnhancedXMLSiteMapProviderSample.zip" mce_href="http://weblogs.asp.net/blogs/stefansedich/EnhancedXMLSiteMapProviderSample.zip"&gt;EnhancedXMLSiteMapProviderSample.zip&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6517294" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Configuration/default.aspx">Configuration</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/XML/default.aspx">XML</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Sitemap/default.aspx">Sitemap</category></item><item><title>Nullable ConvertTo Extension Method</title><link>http://weblogs.asp.net/stefansedich/archive/2008/08/12/nullable-convertto-extension-method.aspx</link><pubDate>Tue, 12 Aug 2008 06:21:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6507126</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6507126</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/08/12/nullable-convertto-extension-method.aspx#comments</comments><description>&lt;p&gt;Hello,&lt;/p&gt;&lt;p&gt;I have the need to easily convert a string to another type i.e. int. And would like to return null if the string is empty. I created a quick extension method, thought id post it up incase anyone finds it helpful.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Converts a string value to the given type, if the string is empty, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// will return null.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name="input"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static T? ConvertTo&amp;lt;T&amp;gt;(this string input) where T : struct {&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; T? ret = null;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!string.IsNullOrEmpty(input)) {&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; ret = (T)Convert.ChangeType(input, typeof(T));&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;&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 ret;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;Basically to use this, just call the extension method on a string:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;"12".ConvertTo&amp;lt;int&amp;gt;(); // Returns 12&lt;br&gt;"".ConvertTo&amp;lt;int&amp;gt;(); // Returns null&lt;br&gt;"1ddsfs".ConvertTo&amp;lt;int&amp;gt;(); // Exception thrown (behaviour I wanted)&lt;br&gt;&lt;br&gt;&lt;br&gt;Just a quick one today, will be posting some more useful things in the weeks to come.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Cheers&lt;br&gt;Stefan&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6507126" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category></item><item><title>Long time no post :(</title><link>http://weblogs.asp.net/stefansedich/archive/2008/07/13/long-time-no-post.aspx</link><pubDate>Sun, 13 Jul 2008 10:21:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6396240</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6396240</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/07/13/long-time-no-post.aspx#comments</comments><description>&lt;p&gt;Hello All,&lt;/p&gt;&lt;p&gt;I must say I have been slack, I have not had a post in a long time. I am still alive just have not had the time/motivation to keep this upto date like I had planned.&lt;/p&gt;&lt;p&gt;I am going to hit the road hard again and I hope to be blogging again in the next few weeks. Look forward to sharing my findings with everyone once again.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Cheers&lt;br&gt;Stefan &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6396240" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Urchin ELF2 Ecommecre Log File Helper</title><link>http://weblogs.asp.net/stefansedich/archive/2008/04/04/urchin-elf2-ecommecre-log-file-helper.aspx</link><pubDate>Fri, 04 Apr 2008 12:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6064759</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6064759</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/04/04/urchin-elf2-ecommecre-log-file-helper.aspx#comments</comments><description>&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;Hello,&lt;br&gt;&lt;br&gt;I am currently needing to implement ecommerce tracking with our Urchin stats server. To do this it reads your transaction logs that you write to when users buy from your site. This file needs to be in a special format ELF2 &lt;a href="http://www.google.com/support/urchin45/bin/answer.py?answer=28448" target="_blank" mce_href="http://www.google.com/support/urchin45/bin/answer.py?answer=28448"&gt;click here for more info&lt;/a&gt;.&lt;br&gt;&lt;br&gt;I though I would write some helper classes to make writing my ELF2 logs easier and something that would be reusable and could even have functionality added in the future to parse the logs (most likely never needed but you never know). So I created a set of classes to do this for me. I will not post the source code right now but if there is interest will tidy it up and release it for all too use.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;Adding a new order to a transaction record to your log is as easy as pie:&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;

&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(43, 145, 175);"&gt;ELF2TransactionLog&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; log = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ELF2TransactionLog&lt;/span&gt;();&lt;/span&gt;





























































&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;log.TransactionLines.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ELF2LogTransactionLine&lt;/span&gt;()
{&lt;br&gt;&lt;span style=""&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;/span&gt;OrderID = &lt;span style="color: rgb(163, 21, 21);"&gt;"100"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;RemoteHost = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETIPHERE"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;UserAgent =
Request.ServerVariables[&lt;span style="color: rgb(163, 21, 21);"&gt;"HTTP_USER_AGENT"&lt;/span&gt;].ToString(),&lt;br&gt;&lt;span style=""&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;/span&gt;Store = &lt;span style="color: rgb(163, 21, 21);"&gt;"My Store"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;SessionID = &lt;span style="color: rgb(163, 21, 21);"&gt;"000-111"&lt;/span&gt;,&lt;span style=""&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; &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;/span&gt;Total = 895,&lt;br&gt;&lt;span style=""&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;/span&gt;Tax = 10,&lt;br&gt;&lt;span style=""&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;/span&gt;Shipping = 10,&lt;br&gt;&lt;span style=""&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;/span&gt;BillCity = &lt;span style="color: rgb(163, 21, 21);"&gt;"Perth"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;BillState = &lt;span style="color: rgb(163, 21, 21);"&gt;"WA"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;BillZip = &lt;span style="color: rgb(163, 21, 21);"&gt;"6025"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;BillCountry = &lt;span style="color: rgb(163, 21, 21);"&gt;"Australia"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;Cookies = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETCOOKIESHERE :)"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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;/span&gt;LineItems = {&lt;br&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;
&lt;span style="color: rgb(43, 145, 175);"&gt;ELF2LogTransactionItemLine&lt;/span&gt;() {&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;OrderID = &lt;span style="color: rgb(163, 21, 21);"&gt;"100"&lt;/span&gt;,&lt;span style=""&gt;&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; &lt;/span&gt;ProductCode = &lt;span style="color: rgb(163, 21, 21);"&gt;"test1"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;ProductName = &lt;span style="color: rgb(163, 21, 21);"&gt;"Test Product 1"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Variation = &lt;span style="color: rgb(163, 21, 21);"&gt;""&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Price = 100M,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Quantity = 1,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;UpSold = &lt;span style="color: blue;"&gt;false&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;UserAgent =
Request.ServerVariables[&lt;span style="color: rgb(163, 21, 21);"&gt;"HTTP_USER_AGENT"&lt;/span&gt;].ToString(),&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;Cookies = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETCOOKIESHERE"&lt;/span&gt;,&lt;br&gt;&lt;span style=""&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; &lt;/span&gt;RemoteHost = &lt;span style="color: rgb(163, 21, 21);"&gt;"GETIPHERE"&lt;/span&gt;&lt;br&gt;&lt;span style=""&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;/span&gt;}&lt;br&gt;&lt;span style=""&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;/span&gt;}&lt;br&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;});&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;/span&gt;log.Save(Server.MapPath(&lt;span style="color: rgb(163, 21, 21);"&gt;"~/biglog.log"&lt;/span&gt;), &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;br&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6064759" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/Urchin/default.aspx">Urchin</category></item><item><title>Our First ASP.NET 3.5 Site Goes Live!!</title><link>http://weblogs.asp.net/stefansedich/archive/2008/04/03/our-first-asp-net-3-5-site-goes-live.aspx</link><pubDate>Thu, 03 Apr 2008 04:45:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6062420</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6062420</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/04/03/our-first-asp-net-3-5-site-goes-live.aspx#comments</comments><description>&lt;P&gt;Hello All,&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;UPDATE 20080409:&lt;BR&gt;&lt;BR&gt;&lt;/STRONG&gt;Another site has launced, check out &lt;A href="http://www.betts.com.au/"&gt;www.betts.com.au&lt;/A&gt;!!!&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Thanks&lt;BR&gt;Stefan&lt;BR&gt;&lt;BR&gt;----------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;Finally our first ASP.NET 3.5 website went live today, there are 2 more to come but this one is the only one live atm: &lt;BR&gt;&lt;BR&gt;&lt;A href="http://www.zushoe.com.au/" target=_blank mce_href="http://www.zushoe.com.au/"&gt;http://www.zushoe.com.au/&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;This has been challenging and fun as we have used all the latest tools and technologies in this project, some include:&lt;BR&gt;&lt;BR&gt;- Visual Studio 2008&lt;BR&gt;- ASP.NET 3.5&lt;BR&gt;- LINQ to SQL&lt;BR&gt;- ASP.NET AJAX&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;There are really cool features in this site too, for example the paging in the catalogue is done with ajax but using custom link controls I have allowed SEO to still work. It has full AJAX history support too. There are custom developed ASP.NET AJAX controls and extensive caching, plus much more. &lt;BR&gt;&lt;BR&gt;All in all this project was great to work on, being able to use .NET 3.5 and Visual Studio 2008 saved us a lot of time, and using LINQ to SQL cut down creating the DAL quite a bit. Of course with all new techs we have had challenges along the way, but still developed it alot quicker using VS 2008 and .NET 3.5.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;That is all for now, might try post on our challenges sometime soon.&lt;BR&gt;&lt;BR&gt;Thanks&lt;BR&gt;Stefan&lt;BR&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6062420" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category></item><item><title>Simplified ASP.NET AJAX Custom Control Development With VS Item Template</title><link>http://weblogs.asp.net/stefansedich/archive/2008/04/01/simplified-asp-net-ajax-custom-control-development.aspx</link><pubDate>Tue, 01 Apr 2008 14:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6056482</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6056482</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/04/01/simplified-asp-net-ajax-custom-control-development.aspx#comments</comments><description>&lt;p&gt;Hello,    &lt;br&gt;    &lt;br&gt;At work today I had a friend (Blair) have issues with trying to get a browser alert to popup on the page during an ASYNC post back. I told him I would make a custom control in 30 secounds or less that would do this and make life much easier. Overkill I know for such a simple task but it was more of a demo to show the ease/speed of creating a control using my custom item template.&lt;br&gt;    &lt;/p&gt;&lt;p&gt;&lt;b&gt;The VS Item Template:&lt;br&gt;&lt;/b&gt;&lt;br&gt;I have created a template in Visual Studio that lets me add a new ASP.NET AJAX server control to any project, this adds the Control class and the debug and release JS files. So basically all I need to do is right click (add new item) ASP.NET AJAX Server Control. The files are now in my solution. The benefit of this is that the default java script file that is added when you create a new control library will not be able to be packed as it is missing a few ; and { }. My template has fixed these issues and it makes life a heck of a lot easier. I then just make the two JS files embedded resources and I am good to go (I need to do this as I could not see a way to get the item template to do this). I will not go into how to create the template here, but have included it for download if you would like to see/use it.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Creating the control:      &lt;br&gt;      &lt;br&gt;&lt;/b&gt;This was the easy part, once I have added my control called MessageBoxControl to my project, which gives me a shell control, I just added a private variable to hold the message and a ShowMessage method. The ShowMessage method does nothing but set this private message variable. It just looks nice to use MessageBox1.ShowMessage("error!"). The code for the control is below:     &lt;br&gt;    &lt;br&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Collections.Generic;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Configuration;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Linq;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Web;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Web.Security;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Web.UI;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Web.UI.WebControls;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Web.UI.WebControls.WebParts;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Web.UI.HtmlControls;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; System.Xml.Linq;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;[&lt;span style="color: blue;"&gt;assembly&lt;/span&gt;: &lt;span style="color: rgb(43, 145, 175);"&gt;WebResource&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"MessageBox.MessageBoxControl.js"&lt;/span&gt;, &lt;span style="color: rgb(163, 21, 21);"&gt;"text/javascript"&lt;/span&gt;)]      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;[&lt;span style="color: blue;"&gt;assembly&lt;/span&gt;: &lt;span style="color: rgb(43, 145, 175);"&gt;WebResource&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"MessageBox.MessageBoxControl.debug.js"&lt;/span&gt;, &lt;span style="color: rgb(163, 21, 21);"&gt;"text/javascript"&lt;/span&gt;)]      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;namespace&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; MessageBox {     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Summary description for ServerControl1       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MessageBoxControl&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;ScriptControl&lt;/span&gt; {      &lt;br&gt;      &lt;br&gt;&lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _message = &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#region&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; Script Descriptiors&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;ScriptDescriptor&lt;/span&gt;&amp;gt;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&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;/span&gt;GetScriptDescriptors() {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ScriptControlDescriptor&lt;/span&gt; descriptor = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ScriptControlDescriptor&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"MessageBox.MessageBoxControl"&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.ClientID);      &lt;br&gt;&lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;descriptor.AddProperty(&lt;span style="color: rgb(163, 21, 21);"&gt;"Message"&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;._message);&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; descriptor;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Generate the script reference       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;ScriptReference&lt;/span&gt;&amp;gt;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&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;/span&gt;GetScriptReferences() {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ScriptReference&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"MessageBox.MessageBoxControl.js"&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetType().Assembly.FullName);      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#endregion&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#region&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; Message Showing&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Just sets my message text.       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name="message"&amp;gt;&amp;lt;/param&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShowMessage(&lt;span style="color: blue;"&gt;string&lt;/span&gt; message) {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;._message = message;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}      &lt;br&gt;&lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#endregion&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}      
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; line-height: 115%;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;}&lt;/span&gt;&lt;/p&gt;
  
&lt;p&gt;   &lt;br&gt;As you can see the control is ultra simple. The private var is set and in my GetScriptDescriptors this is where I pass this value to my client script library. The client script library is also very simple. I need to add the Message Property and show the message using an alert().    &lt;br&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; color: green;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;/// &amp;lt;reference name="MicrosoftAjax.js"/&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: green;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;Type.registerNamespace(&lt;span style="color: rgb(163, 21, 21);"&gt;"MessageBox"&lt;/span&gt;);&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;MessageBox.MessageBoxControl = &lt;span style="color: blue;"&gt;function&lt;/span&gt;(element) {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MessageBox.MessageBoxControl.initializeBase(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, [element]);&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp; &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;._message = &lt;span style="color: rgb(163, 21, 21);"&gt;""&lt;/span&gt;;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;};&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;MessageBox.MessageBoxControl.prototype = {     &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;initialize: &lt;span style="color: blue;"&gt;function&lt;/span&gt;() {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MessageBox.MessageBoxControl.callBaseMethod(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: rgb(163, 21, 21);"&gt;'initialize'&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;._message != &lt;span style="color: rgb(163, 21, 21);"&gt;""&lt;/span&gt;) {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;alert(&lt;span style="color: blue;"&gt;this&lt;/span&gt;._message);      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;},      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dispose: &lt;span style="color: blue;"&gt;function&lt;/span&gt;() {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;//Add custom dispose actions here       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;MessageBox.MessageBoxControl.callBaseMethod(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: rgb(163, 21, 21);"&gt;'dispose'&lt;/span&gt;);      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;},      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;get_Message: &lt;span style="color: blue;"&gt;function&lt;/span&gt;() {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._message;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;},&amp;nbsp; &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;set_Message: &lt;span style="color: blue;"&gt;function&lt;/span&gt;(value) {      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;._message = value;      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;};&lt;/span&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   &lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;MessageBox.MessageBoxControl.registerClass(&lt;span style="color: rgb(163, 21, 21);"&gt;'MessageBox.MessageBoxControl'&lt;/span&gt;, Sys.UI.Control);      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;if&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt; (&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(Sys) !== &lt;span style="color: rgb(163, 21, 21);"&gt;'undefined'&lt;/span&gt;) { Sys.Application.notifyScriptLoaded(); }      &lt;br&gt;&lt;/span&gt;&lt;/p&gt;
  
&lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; line-height: 115%;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;Here we can see that we have the Message property and then in our initialise function we simply use this value to show a message to the user using a java script alert. Now that is my control done, I add it to my page and I can then use Control.ShowMessage("tesing") to show an alert message on the page.      &lt;br&gt;      &lt;br&gt;With the java script here a 2 files a .debug.js and a .js file. The .debug.js file will be used when your script manager is in debug mode and the .js when in release mode. Use &lt;a href="http://dean.edwards.name/packer/" mce_href="http://dean.edwards.name/packer/" target="_blank"&gt;Dean Edwards Packer&lt;/a&gt; to compress your debug script into a tight release mode script. If you have script errors when compressing your script make sure you use &lt;a href="http://www.jslint.com/" mce_href="http://www.jslint.com/" target="_blank"&gt;JSLint&lt;/a&gt; to verify your script, fixing any errors and pack again.      &lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;" courier="" new="" ;="" mso-no-proof:="" yes=""&gt;     &lt;br&gt;      &lt;br&gt;&lt;b&gt;Final:       &lt;br&gt;        &lt;br&gt;&lt;/b&gt;While this control was not really an example of how to build a rich control (or the most efficient way to show a message to the user), it was more of a demo on how creating your own VS Templates can make your day to day life much easier. And also demonstrating how quick and easy it is to develop a custom client control built on top of the ASP.NET AJAX Framework. I have included a copy of my VS Template below if you would like to use it. And also a copy of the sample project that this was built in. To use the template simply add the zip file to your visual studio template folder. I.E. C:\Users\USER\Documents\Visual Studio 2008\Templates\ItemTemplates\Visual C# on my vista machine.&lt;br&gt;      &lt;br&gt;- &lt;a href="http://weblogs.asp.net/blogs/stefansedich/ServerControl.zip"&gt;VS Template File&lt;/a&gt;&lt;br&gt;- &lt;a href="http://weblogs.asp.net/blogs/stefansedich/Sample.zip"&gt;Sample Project&lt;/a&gt;&lt;br&gt;      &lt;br&gt;      &lt;br&gt;&lt;br&gt;Thanks      &lt;br&gt;Stefan&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6056482" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/CONTROLS/default.aspx">CONTROLS</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category></item><item><title>Update to my LINQ to SQL performance in VB.NET saga</title><link>http://weblogs.asp.net/stefansedich/archive/2008/03/29/update-to-my-linq-to-sql-performance-in-vb-net-saga.aspx</link><pubDate>Sat, 29 Mar 2008 07:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6044718</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6044718</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/03/29/update-to-my-linq-to-sql-performance-in-vb-net-saga.aspx#comments</comments><description>&lt;p&gt;Hello,&lt;br&gt;&lt;br&gt;If you have&amp;nbsp; read my posts before where I was complaining about VB generated sub optimal SQL when using nullable columns in your where clauses, I came to the conclusion I was being silly and not using .Value on those nullable fields in my queries.&lt;br&gt;&lt;br&gt;I stumbled across this post today:&lt;br&gt;&lt;br&gt;http://blogs.msdn.com/vbteam/archive/2008/03/28/linq-to-sql-and-linq-to-entities-performance-improvements-tim-ng.aspx&lt;br&gt;&lt;br&gt;&lt;br&gt;Looks like it was an issue in the end and not me being totally stupid :).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6044718" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Book Review: Linq Quickly by N Satheesh Kumar</title><link>http://weblogs.asp.net/stefansedich/archive/2008/03/26/book-review-linq-quickly-by-n-satheesh-kumar.aspx</link><pubDate>Wed, 26 Mar 2008 13:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6028374</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=6028374</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/03/26/book-review-linq-quickly-by-n-satheesh-kumar.aspx#comments</comments><description>&lt;p&gt;This books title does not lie, it is LINQ and it is quickly.
This book is an excellent introduction into the world of LINQ and also a great
reference once you get your feet wet. &lt;br&gt;
&lt;br&gt;
The start of the book gives you a brief introduction into what LINQ is and also
an introduction into the new features in C# 3.0. It covers things like anonyms
types, object initializers, collection initializers, partial methods, implicitly
typed local variables, extension methods, lambda expressions, &amp;nbsp;query expressions and also a small intro to
expression trees.&lt;br&gt;
&lt;br&gt;
Then it covers LINQ to Objects, which gives you a good idea on how to use LINQ
over your in memory objects, including arrays, collections, string and even
text files. It shows you just how easy it is to do things that in the past
would have been a lot harder to complete. &lt;br&gt;
&lt;br&gt;
Next up is LINQ to XML, this is a great introduction to this subject, it covers
a great deal of information in regards to all the new LINQ to XML classes, how
to create/update/delete XML documents using these new classes and methods. You
are also shown the power you now have when you are querying XML and how easy it
just is.&lt;br&gt;
&lt;br&gt;
The LINQ to SQL chapter is also an excellent reference if you would like to get
your feet wet but would not like to be overwhelmed with information. There are
plenty of good examples on how to begin using LINQ to SQL and the code samples
provided make this very easy. It covers everything from Data Context,
Attributes, Relationships, querying, data manipulation, using stored procedures
and also all the other common query operators that you would use. There is also
a chapter on LINQ to Datasets but as I never use datasets this was something I
briefly skimmed over and did not digest.&lt;br&gt;
&lt;br&gt;
Finally the book provides a good chapter on Standard Query Operators, this is
an excellent post reference once you are already in the world of LINQ, it is
good to able to flick to be back, find what you need and see the function
prototypes and even a code sample on how to use it. I still sometimes will
flick to this part of the book to quickly reference things when I forget :P.&lt;br&gt;
&lt;br&gt;
All in all this was an excellent book and I would highly recommend it to anyone
who would like to start out with LINQ but would like to get a quick
introduction and be on their way to actually using it. This book provides just
that and more&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Book Information:&lt;/p&gt;

Title: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LINQ Quickly&lt;br&gt;
Author: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N Satheesh Kumar&lt;br&gt;
Publisher: &amp;nbsp;PACKT Publishing (http://www.packtpub.com/)&lt;br&gt;
Link:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.packtpub.com/linq-quick-starter/book"&gt;http://www.packtpub.com/linq-quick-starter/book&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
And finally a big thanks to Duane at PACKT Publishing for giving me the
opportunity to review this book.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Thanks&lt;br&gt;
Stefan&lt;br&gt;
&lt;br&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6028374" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/stefansedich/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/stefansedich/archive/tags/MICROSOFT/default.aspx">MICROSOFT</category></item><item><title>A Templated ASP.NET RSS Feed Reader Control</title><link>http://weblogs.asp.net/stefansedich/archive/2008/03/18/a-templated-asp-net-rss-feed-reader-control.aspx</link><pubDate>Tue, 18 Mar 2008 13:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5994082</guid><dc:creator>stefan.sedich</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/stefansedich/rsscomments.aspx?PostID=5994082</wfw:commentRss><comments>http://weblogs.asp.net/stefansedich/archive/2008/03/18/a-templated-asp-net-rss-feed-reader-control.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Update 20070330:&lt;br&gt;&lt;br&gt;&lt;/b&gt;By popular demand (well a couple people) I have included a sample project with everything needed to get started using this control. &lt;br&gt;&lt;br&gt;Basically just a sample web project, click here to get the zipped archive. You might notice things are done a little different, I include the System.ServiceModel.Syndication namespace on my page so that I can case the Container.DataItem to a SyndicationItem and access its properties that way, stops using Eval, but each to their own.&lt;br&gt;&lt;br&gt;&lt;br&gt;Hope that makes it easier for some, will be including full source in future too :).&lt;br&gt;&lt;br&gt;Project Files:&lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/stefansedich/TemplatedRSSFeedReader.zip"&gt;TemplatedRSSFeedReader.zip&lt;/a&gt;&lt;br&gt;&lt;br&gt;Thanks&lt;br&gt;Stefan&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Update 20070319:&lt;br&gt;&lt;/b&gt;&lt;br&gt;Today I attended the Heros Happen event in Perth, and I learnt something very very cool, you see how I wrote my own classes and code to load the syndicated feed in, then used LINQ to XML to load that into my classes. During &lt;a href="http://blogs.msdn.com/dglover/" mce_href="http://blogs.msdn.com/dglover/"&gt;Dave Glovers&lt;/a&gt; presentation on WCF he had a sample in there that was building an RSS feed, and I could see he was using some classes to do so. What I then noticed is these classes are new in .NET 3.5 and will make creation of this control 100 times easier plug give us full support of the RSS 2.0 spec and allow us to access all feed proprties :) :) and will mean *removing* code and making things much simpler.&lt;br&gt;&lt;br&gt;Firstly we need to add a reference to the System.ServiceModel.Web assembley, this is where the magic is. Then add a using System.ServiceModel.Syndication; to the RSSReader.cs class, we then have access to these helper classes which allow us to easily read and create RSS 2.0 and ATOM 1.0 feeds, as I am only supporting RSS I will only use the RSS formatter. To read our feed we need to do the below:&lt;br&gt;&lt;br&gt;Firslty read the feed into an XMLReader:&lt;br&gt;&lt;br&gt;XmlReader reader = XmlReader.Create("http://weblogs.asp.net/stefansedich/rss.aspx");&lt;br&gt;&lt;br&gt;Then create an instance of the RSS20FeedFormatter and then make this read the data from the xmlreader:&lt;br&gt;&lt;br&gt;Rss20FeedFormatter feedFormatter = new Rss20FeedFormatter();&lt;br&gt;feedFormatter.ReadFrom(reader);&lt;br&gt;&lt;br&gt;&lt;br&gt;We now can get access to the feed by using feedFormatter.Feed, this gives us an instance of a SyndicationFeed class which gives us access to all items and properties of our feed. The only difference now is that as some properties are a little different accessing them is different.So instead of feed.Title you use feed.Title.Text instead. The good thing with this is, 1. We have removed the need to do this manually and 2. We have all properties that belong to an RSS feed. &lt;br&gt;&lt;br&gt;The updated RSSReader class is below with the code changes. You can now remove the Feed and FeedItem classes we created earlier as they are needed no more. It just goes to show we learn something new every day.....&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Code:&lt;br&gt;&lt;br&gt;&lt;/b&gt;

&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; An RSS Feed reader server control, it will basically
aggregate rss feeds and display the content&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;RSSReader&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;CompositeControl&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;INamingContainer&lt;/span&gt;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#region&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; Properties&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; The URL of the feed to display&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FeedURL {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;
ViewState[&lt;span style="color: rgb(163, 21, 21);"&gt;"FeedURL"&lt;/span&gt;] != &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? ViewState[&lt;span style="color: rgb(163, 21, 21);"&gt;"FeedURL"&lt;/span&gt;].ToString()
: &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;ViewState[&lt;span style="color: rgb(163, 21, 21);"&gt;"FeedURL"&lt;/span&gt;] = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; The number of items to show from the feed, 10 is the
default.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; FeedItemCount {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;
ViewState[&lt;span style="color: rgb(163, 21, 21);"&gt;"FeedItemCount"&lt;/span&gt;] != &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)ViewState[&lt;span style="color: rgb(163, 21, 21);"&gt;"FeedItemCount"&lt;/span&gt;] : 10;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;ViewState[&lt;span style="color: rgb(163, 21, 21);"&gt;"FeedItemCount"&lt;/span&gt;] = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; The header template for this control&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;TemplateContainer&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;RSSReaderDataItem&lt;/span&gt;)),
&lt;span style="color: rgb(43, 145, 175);"&gt;PersistenceMode&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;PersistenceMode&lt;/span&gt;.InnerProperty)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ITemplate&lt;/span&gt; HeaderTemplate { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; The footer template for this control&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;TemplateContainer&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;RSSReaderDataItem&lt;/span&gt;)),
&lt;span style="color: rgb(43, 145, 175);"&gt;PersistenceMode&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;PersistenceMode&lt;/span&gt;.InnerProperty)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ITemplate&lt;/span&gt; FooterTemplate { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; The item template for this control&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;TemplateContainer&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;RSSReaderDataItem&lt;/span&gt;)),
&lt;span style="color: rgb(43, 145, 175);"&gt;PersistenceMode&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;PersistenceMode&lt;/span&gt;.InnerProperty)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ITemplate&lt;/span&gt; ItemTemplate { &lt;span style="color: blue;"&gt;get&lt;/span&gt;;
&lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#endregion&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#region&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; Constructor&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Default
constructor &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;
RSSReader() {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#endregion&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#region&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; Child Control Creation&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Creates child controls for this control, first create the
header&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; based on template, then the items, then finally the
footer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;
&lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt;
CreateChildControls() {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Get
our RSS feed data, this is returned as a collection&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// of the
RSSReaderDataItem controls.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;SyndicationFeed&lt;/span&gt;
feed = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRSSData();&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;
(feed != &lt;span style="color: blue;"&gt;null&lt;/span&gt;) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: green;"&gt;//
Create the header template, and add to the controls.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;
(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.HeaderTemplate != &lt;span style="color: blue;"&gt;null&lt;/span&gt;) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: green;"&gt;//
Create the dataitem control for the header&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: green;"&gt;//
and assign it the current feed as its dataitem.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;RSSReaderDataItem&lt;/span&gt;
header = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;RSSReaderDataItem&lt;/span&gt;()
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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; &lt;/span&gt;DataItem = feed&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;};&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&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;/span&gt;&lt;span style="color: green;"&gt;//
Instantiate template, add to controls and &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
