Wednesday, April 26, 2006

Web custom controls - changing the base tag

In this blog entry "A detail the Webcontrol books don't teach you", Miguel Castro tells you how to override the default behavior of a web custom control and replace the SPAN that is generated with a DIV (or any other tag!), and points out the differences needed when your control inherits from System.Web.UI.CompositeControl rather than System.Web.UI.Control.

Amazing how Googling (in this case for "web custom control render div not span") can give you exactly the answer you were after!

Fixing ATLAS Control Extenders

ATLAS is a really nice piece of technology, allowing you to AJAX enable an ASP.Net page. The recently released ATLAS Control Toolkit provides a suite of ATLAS controls that are useful out of the box, and provide a good set of samples for developing your own.

Of course, the problem with using any third party control is that you may have trouble when the control doesn't work in quite the way you expect.

I've been having a problem with the Popup Control Extender recently. It's a control to let you use one control on an ASP.Net page to toggle the visibility of another - and being part of the ATLAS Control Toolkit, it's fully ATLAS enabled and so renders the behavior on the client.

The problem was that the designers of the toolkit didn't consider the case when the extender was used in a composite control that was repeated on a page. The toolkit renders markup on the page for behavioral properties exposed from the extender, but wasn't catering for when the extender was itself repeated as part of a composite control.

Fortunately, the source code for the Popup Control Extender comes with the ATLAS Control Toolkit itself, so I was able to fix the fault myself - score one for open / shared source!

I posted the full fix in the ASP.NET Forums - hopefully others will find it useful. I'm just made up to be able to contribute something back for a change!

Friday, April 21, 2006

Getting at HttpServerUtility

Here's the problem - you want to HTML encode some content in a class library that supports your ASP.Net application... You could write the routine to HTML encode a string yourself, or you could re-factor your code to do the encoding in the page code-behind like this:
public partial class DemoPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
LabelControl.Text =
Server.HtmlEncode( LibraryClassInstance.Content );
}

// rest of the implementation goes here
}
But what if you're abstracting things so that a library object has to be able to render itself as HTML?

The problem is all about getting at the HtmlEncode method if you've not got a Server object handy. The Server object is actually a singleton instance of the HttpServerUtility class exposed by the ASP.Net environment from the HttpContext in which the page is running.

HOWEVER, the HttpContext class exposes a static method to return the current context instance, including the associated HttpServerUtility instance, so all you have to do in the library is the following
namespace demo
{
class LibraryClass
{
public string GetHtmlSafeContent()
{
return HttpContext.Current.Server.HtmlEncode(this.Content);
}

// remainder of the implementation goes here
}
}
Voila - HTML (and URL) encoding and de-coding at your fingertips.

Design-time goodness: ImageUrls

When you're developing web server controls, how often do you expose a Url or an ImageUrl property? Chances are that it's one of those tasks that happens 9 times out of 10, as adding image support to an existing or composite control is that common a task.

In this forum post, Steven Cheng from MS support gives a good code-snippet for a property that has the default ImageUrl designer applied to it. Unfortunately, he neglects to point out the assembly references needed to get it to work.

To use the standard designers requires you to reference the System.Design.dll assembly in your control library, and then to add the using statements highlighted in the sample below


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Design;
using System.Drawing.Design;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;

namespace DemoControls
{
[DefaultProperty("Caption")]
[ToolboxData("<{0}:CoolButton runat=server>")]
public class CoolButton : ImageButton
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design,Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",typeof(UITypeEditor))]
public string RolloverImageUrl
{
get
{
String s = (String)ViewState["RolloverImageUrl"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["RolloverImageUrl"] = value;
}
}

// rest of the implementation goes here...
}


Adding this kind of design-time support is a snip, and makes those simple extended controls much more usable.

Tuesday, April 18, 2006

Source Code for the Built-in ASP.NET 2.0 Providers Now Available for Download

In his blog, ScottGu today announced:
Today we released the source code for the built-in ASP.NET 2.0 Membership, Role Management, Site Navigation, Session State, Profile, Web Events, and Web Part Personalization providers

This is a great thing - not only is Microsoft being much more helpful by providing sample code to let us develop (in this case) pluggable providers, but rather than releasing ????? code which just demonstrates the concepts, they're releasing the production code that we're already using.

The ASP.Net developer centre also great documentation on the Provider design pattern/model, and the individual provider types used by ASP.Net 2.0.

Finally, they've also released this under the Microsoft Permissive License (Ms-PL) - a license that allows and encourages the development of derivative works.

I for one can see myself using all of these types of providers at some point or other in my current project, so these samples are going to make my life much easier. Good stuff.

Thursday, April 13, 2006

VS2005 Web Application Projects hits RC1

I've blogged about this VS2005 add-in before, as it provides a much better migration experience for complex web applications.

But today Robert Shelton posted that the add-in has now reached RC1. This is a good thing, as a (nearly) production ready toolkit for migrating "old" ASP.Net 1.1 web applications is sorely needed.

You can read his blog post here and get the download here.

Moving a development team forward - "scrimages"

In this blog article, David L details how he implemented a "Developer training regime" at a client in order to move the team's .Net development skills forward and prepare them to migrate to ASP.Net 2.0.

Apart from the (slightly dubious) American Football metaphor, the concept is remarkably similar to the Developer-to-Developer training that Angel Solutions and Mandogroup have already implemented, and that I intend on implementing here at In4Tek.

The article makes a good read, however, and is a timely reminder about the value of your developer's skill-sets and keeping them up to date, but also serves as a reminder that the training should perhaps have rather more focus on the end goal (in this case of migration) than be open-ended as the Mandogroup training has been thus far.

Check the article out here:

http://blogs.msdn.com/davidlem/archive/2006/04/13/575344.aspx

Columbus would have been proud - extending the ATLAS

The ATLAS group have been busy - today they announced the release of the ATLAS Control Toolkit. From the introduction.
The 'Atlas' Control Toolkit is a collection of samples and components that makes it easier then ever to build and consume rich client-side “Atlas” controls and extenders. The toolkit provides both ready to go samples and a powerful SDK to simplify the creation and re-use of your own custom controls and extenders.
As always, the best way to evaluate at a toolkit like this is to look at the samples provided, and the ATLAS toolkit doesn't disappoint, with 9 new controls and extenders that cover some of the most common AJAX features you'd need to make a site provide a rich and dynamic experience.

My particular favorites include the PopupControl and the ReorderList - paired, these two would provide an editing experience for simple data (such as lookup table data, for example) almost as good as could be achieved with a Windows Forms client.

More later, but I can see myself using these, and the guides for developing your own ATLAS controls and extenders extensively over the next little while.

Wednesday, April 12, 2006

Mix-and-match Unit Testing

In this MSDN Magazine article, John Robbins presents a tiny little hack that could save a huge amount of time if you're migrating a .Net 1.1 application with NUnit tests to .Net 2.0 and Visual Studio 2005.

The hack basically involves using some compile tests to switch between NUnit and VS2005 native testing.

The code he cites was actually found in the Patterns & Practices group Composite UI block source and is remarkably simple, requiring just the following code at the head of every test class and a change from using [Test]attributes to using [TestMethod]attributes instead.
#if !NUNIT
using Microsoft.VisualStudio.TestTools.UnitTesting;
#else
using NUnit.Framework;
using TestClass = NUnit.Framework.TestFixtureAttribute;
using TestMethod = NUnit.Framework.TestAttribute;
using TestInitialize = NUnit.Framework.SetUpAttribute;
using TestCleanup = NUnit.Framework.TearDownAttribute;
#endif
Nice when you find a simple solution to an apparently intractable problem!

Tuesday, April 04, 2006

Developer Highway Code

My colleague Andrew Lightowler spotted this in the security section of the UK MSDN site today. The Developer Highway Code: provides a checklist of security issues that every .Net developer should keep in mind when planning and implementing a piece of software. From the introduction:
To build software that meets your security objectives, you must integrate security activities into your software development lifecycle. This handbook captures and summarises the key security engineering activities that should be an integral part of your software development processes.
At over 170 pages, it's fairly heavyweight, but well worth a read, particularly in concert with Writing Secure Code (which you can, of course, get from Amazon).

I do, however, wonder how well (or more likely badly) some of my old code would fare against these checklists!

Friday, March 24, 2006

Six pillars of AJAX application design

AJAX and ATLAS are two hot topics in the arena of web application development.

In this blog entry
, RickSP covers a talk he presented at Mix'06 on how to "Design a Better User Experience with AJAX and ATLAS", and in particular, six "lessons from the trenches". My take is that these should really be "Six pillars of AJAX application design".

The two sites he references on AJAX Design Patterns and AJAX (XMLHttpRequest) Usability are an excellent read too.

Enterprise Library 2.0 extensions.

In his blog, Tom Hollander highlights some "bloody cool Enterprise Library v2 Extensions".

Whilst mostly related to the configuration of EntLib (but including a package that integrates the config tool with VS2005), one of the comments provides a link to a Data Teir Generator for EntLib.

I think that this could be a really simple way of getting started with the EntLib - bringing it closer to the data teir functionality of Castle ActiveRecord (and its associated generator) or IdeaBlade DevForce.

YET ANOTHER toolkit to evaluate! *sigh*

Thursday, March 23, 2006

ASP.Net on Rails

There's been a lot of excitement recently in the Open Source community about Ruby on Rails. This web development framework makes developing web applications much easier by providing a well structured Model/View/Controller framework in which to develop.

Of course, having this kind of framework available to ASP.Net would be even more exciting, the MonoRail project was a great find. Part of the wider Castle Project, it provides a true separation of presentation from business logic and persistance of data.

There's a nice database persistance layer as part of the project, too - ActiveRecord. Great for .Net 1.1, but possibly with some issues under .Net 2.0 as it relies on untyped collections. But I've found that there's a good article on implementing nicely typed collections for related objects tho, here, so I'm now less worried about using ActiveRecord as the persistance layer.

I'm going to try implementing a test with this later today, but it looks good from the documentation. There's even a stud for documentation about implementing the Inversion of Control pattern using the Windsor Container within the framework - all very interesting stuff.

Whether I manage to integrate MonoRail with AJAX (maybe using ATLAS) will be the real kicker, of course, but if it can be done, I think this could be an extremely powerful development framework.

More later.

Friday, March 10, 2006

The Provider pattern... in .Net 2.0 AND .Net 1.1

The ASP.Net Developer Center on MSDN has thrown up another useful article - or actually a pair of articles - on the Provider pattern.

In this first article, Rob Howard describes how the Provider model is implemented in .Net 2.0, along with a worked example.

Providers are, to my mind, absolutely central in developing flexible software architectures - being able to "unplug" a default provider and/or "plug-in" your own replacement/extension is central to role management in .Net 2.0. But it's also a very useful pattern in it's own right. The Search engine I wrote as part of the Mando Common Platform uses exactly this pattern (although partly configured via a database as well as via the web.config) to allow "pluggable" search handlers to operate across a variety of data sources.

But what's more interesting is that in the second article, Rob provides a parallel implementation of the provider pattern in .Net 1.1 - in the process clearly explaining how the pattern can be implemented in .Net 1.1.

This pair of articles really should be required reading at Mando for the programming team!

An Alan Partridge moment - VS2005 Web Application Projects

Ah-ha!

I just found this page on MSDN - a Beta version of an add-in for Visual Studio 2005 that allows it to work with web projects the way it used to in VS2003.

Looking at it, this should make migrating existing ASP.Net 1.1 projects to .Net 2.0 a tad easier by removing all the faffy refactoring that was needed to match the new coding model.

Actually, pretty much every posting on the ASP.Net Developer Centre: Infrastructure page is relevant right now - from the Web Standards support to the new Web Deployment projects. The use of the former is obvious, whilst the latter seems to take the Publish Web Project idea to the next level with web.config customisations and all sorts of goodness.

Time to find a simple ASP.Net 1.1 project and try converting it...

Wednesday, March 08, 2006

I have seen the future... and it is LINQ

I'm astounded... Really gobsmacked...

I've just watched this Video interview on Channel 9. In it, Anders Hejlsberg describes LINQ (Language INtegrated Query). A part of C#3, but already available as a technical preview, this brings SQL type querying to ANY object that implements IEnumerable.

That means pretty much EVERYTHING! I'm still trying to get my head around it all, but Anders' demo of iterating the instance methods of the string type using the syntax was the epiphany moment for me - a simple, elegant way of accessing complex real-world data. Wow!

The LINQ Project home page is available here:
http://msdn.microsoft.com/netframework/future/linq/

The technical preview is available here:
http://download.microsoft.com/download/4/7/0/4703eba2-78c4-4b09-8912-69f6c38d3a56/LINQ%20Preview.msi

Tuesday, March 07, 2006

Unit Testing snippets for VS2005

Having just touched on NUnit testing in a training presentation at Mando Group Ltd, it was perfect timing that I ran across this article posted to TheServerSide.Net.

Snippets seem to be a great addition to VS2005, allowing templates for common code to be pulled from a common store - great for implementing coding standards and best practices.

These snippets provide the framework for generating unit test classes running under both NUnit and Microsoft Visual Studio Team Server.

This is one set of snippets that I'm definitely going to be installing.

Saxon - providing an exciting " Hello World" implementation?

This post by M. David Peterson on the O'Reilly weblogs (and cross-posted to both XML.com and the Windows DevCentre) provides a fully-commented ASP.Net "Hello World" implementation.

Nothing exciting there, except that it's demonstrating using the Saxon 8.x XSLT processor to transform XML and XSLT into XHTML. What caught my attention was that Saxon provides XSLT 2.0 support, unlike the System.Xml.Xsl classes in .Net 1.1.

I've not tried this myself yet, but given the grief I've had with managing namespaces in XSLT 1.1, I'm hoping that Saxon might make using XSLT for the generation of dynamic content rather easier. Certainly, it would provide a stop-gap implementation until full XSLT 2.0 support is provided out of the box in .Net.

Saxon is available as a basic (non schema aware) version as OpenSource from SourceForge, or as a schema-aware version from Saxonica. Priced at £250 / workstation or server, it's reasonably cheap too.

Another item for the research list!

Monday, March 06, 2006

WSCF 0.6 Released

Thinktecture's Christian Weyer and Buddhike de Silva have released the latest version of this excellent toolkit. Now for .Net 2.0 and VS2005 only, in my mind this really is the optimum way of defining and coding web services across corporate boundaries.

The Web Services Contract First methodology is really a return to the original spirit of web services - that of an interface driven service oriented architecture. By providing all the tools to let you generate the WSDL contact first, this toolset makes you think about the interface between services, rather than the traditional VS driven way of just exposing your existing classes through a webservice.

I blogged about this before after going to a presentation on this by Christian, and am still as impressed - I just can't believe I missed the 0.6 release until now!

More information and the download links can be found at http://www.thinktecture.com/Resources/Software/WSContractFirst/default.html.

Thursday, March 02, 2006

Open Source vs "Commercial Reality"

In this OnLAMP article, Andrew Stellman, Jennifer Greene, authors of Applied Software Project Management, make some interesting comparisons between the corporate software development process and that of the Open Source community.

Whilst the article is unashamedly a plug for their book, it does highlight deficiencies that seem to be prevalent in the corporate world, where commercial constraints often put pressure on a project team to deliver "the product", causing other deliverables - in particular things like documentation, testing, architecture, etc - to be given less weight than they perhaps otherwise should. The practices and patterns that should be applied across the project getting subverted by the commercial "realities".

In the article, they detail five
principles for successfully delivering a project, namely:
  • Tell the truth all the time
  • Trust the team
  • Review everything, test everything
  • All developers are created equal
  • The fastest way through the project is to do it right
In my opinion, as an Architect and Developer, the two that get least weight are the "Review everything, test everything" and "The fastest way through the project is to do it right".

These, particularly the latter, should be championed much more. Time and again, I've found I've had to argue in favour of a bit more complexity and cost for a feature in order to future proof it or provide a foundation for future work, against the drive to deliver "just what's needed as soon as possible and as cheaply as possible".

Inevitably, if the product in question is going to have a future beyond its first release, then thinking about that future, and the possible changes or extensions to its functionality, and putting foundations in place to support that future give long-term cost benefits that far outweigh the short-term savings that a "sub-optimal" solution would bring.

The article can be found here:
http://www.onlamp.com/pub/a/onlamp/2006/02/27/what-corp-projects-learn-from-open-source.html