Well this is my first ever forum post so please forgive me if it is a bit verbose or lacking in any way 
After spending a bit of time debugging the double postback problem with the CreateUserWizardAdapter I've found that it's caused by a slight problem with the html that is being rendered out for the create user button and I have come up with a fix for it that involves changing the CSS Control Adapter code. The solution for this problem can also be used to fix the double postback problems caused by the PasswordRecoveryAdapter, ChangePasswordAdapter, and LoginAdapter. Hopefully someone that looks after the sourcecode for the CSS Adapter project adds the fix to the project soon because it is affecting quite a few people!
Double Postback Problem - Cause (skip this if you just want the fix!):
Buttons that reside within the controls that are adapted by the CSS Control Adapters, for example the CreateUserWizard.CreateUserButton, are rendered out differently depending on the button type (which is set for example via CreateUserWizard.CreateUserButtonType = ButtonType.Link). The default button type used by the membership controls is Button. The following html controls are rendered out for the different System.Web.UI.WebControls.ButtonType enum values:
ButtonType.Button: input, type=submit
ButtonType.Image: input, type=image
ButtonType.Link: anchor
Both of the input controls will automatically cause the form that they reside within to be posted back to the server when they are clicked, whereas the anchor will not - instead it needs some javascript to cause a postback. This is where the problem is - all three html controls are rendered out with javascript attached to post the form back to the server on a click event, which allows buttons of type 'Link' to work correctly but causes buttons of type 'Button' and 'Image' to postback twice - the first time due to the javascript and the second because of the native postback.
The javascript method used to cause the postback is as follows:
WebForm_DoPostBackWithOptions(WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit))
In order to stop 'Button' buttons and 'Image' buttons firing twice we just need to set the clientSubmit parameter to false when these types of buttons are rendered out.
Other problems (specific to the CreateUserWizardAdapter control)
Once the double postback problem was fixed two other problems popped up. The first was that users still weren't being created. This was because the id and name (which is derived from the id) being used for the create user button was missing an underscore.
The other problem was that the cancel button didn't work. It was also missing an underscore from its name and also wasn't registered for Event Validation.
Code change to fix the Double Postback Problem in the CreateUserWizardAdapter (applicable to the other adapters too):
Change:
PostBackOptions options = new PostBackOptions(btn, "", "", false, false, false, clientSubmit, true, wizard.ID);
To:
bool clientSubmit = (wizard.CreateUserButtonType == ButtonType.Link);
PostBackOptions options = new PostBackOptions(btn, "", "", false, false, false, clientSubmit, true, wizard.ID);
Code change to fix all of the problems caused by the CreateUserWizardAdapter:
Replace the WriteCreateUserButtonPanel with the following:
private void WriteCreateUserButtonPanel(HtmlTextWriter writer, CreateUserWizard wizard)
{
string btnParentCtrlId = "__CustomNav0";
Control btnParentCtrl = wizard.FindControl(btnParentCtrlId);
if (btnParentCtrl != null)
{
string createUserBtnId = btnParentCtrlId + "_StepNextButton";
string idWithType = WebControlAdapterExtender.MakeIdWithButtonType("StepNextButton", wizard.CreateUserButtonType);
Control btn = btnParentCtrl.FindControl(idWithType);
if (btn != null)
{
Page.ClientScript.RegisterForEventValidation(btn.UniqueID);
bool clientSubmit = (wizard.CreateUserButtonType == ButtonType.Link);
PostBackOptions options = new PostBackOptions(btn, "", "", false, false, false, clientSubmit, true, wizard.ID);
string javascript = "javascript:" + Page.ClientScript.GetPostBackEventReference(options);
javascript = Page.Server.HtmlEncode(javascript);
WebControlAdapterExtender.WriteBeginDiv(writer, "AspNet-CreateUserWizard-CreateUserButtonPanel", "");
Extender.WriteSubmit(writer, wizard.CreateUserButtonType, wizard.CreateUserButtonStyle.CssClass, createUserBtnId, wizard.CreateUserButtonImageUrl, javascript, wizard.CreateUserButtonText);
if (wizard.DisplayCancelButton)
{
string cancelBtnId = btnParentCtrlId + "_CancelButton";
string cancelBtnIdWithType = WebControlAdapterExtender.MakeIdWithButtonType("CancelButton", wizard.CancelButtonType);
Control cancelBtn = btnParentCtrl.FindControl(cancelBtnIdWithType);
if (cancelBtn != null)
{
Page.ClientScript.RegisterForEventValidation(cancelBtn.UniqueID);
Extender.WriteSubmit(writer, wizard.CancelButtonType, wizard.CancelButtonStyle.CssClass, cancelBtnId, wizard.CancelButtonImageUrl, "", wizard.CancelButtonText);
}
}
WebControlAdapterExtender.WriteEndDiv(writer);
}
}
}
So now we can all get on and do the actual stuff we were trying to achieve before we ran into this problem
.
Regards,
Tana Isaac
Solintex Limited (NZ)
Golden Rule: Whoever has the gold makes the rules.