One thing to note is that if you use WebMethods for Ajax, the response values will be returned wrapped in an object named 'd' for security reasons. You will have to unwrap that value, which is usually not a problem, unless you are using a component (such as the jqGrid plugin) that relies upon jquery ajax. To get around that, I just changed the code in the grid that called ajax and inserted a bit of code to unwrap. I do plan on sending in some code to the jquery crew to see if it can be accepted for future versions.
The next thing, as was mentioned previously, is the ids. If you have the time and inclination, I actually subclassed all of the HTML controls to make participating in the NamingContainer optional, like this:
protected override void RenderAttributes(HtmlTextWriter writer) {
HtmlControlImpl.RenderAttributes(this, writer);
}
And then the helper object (to prevent writing the same code in each object) looks like this:
public static void RenderAttributes(IFormControl cntrl, HtmlTextWriter writer) {
if (cntrl.ID != null) {
cntrl.Attributes.Remove("id");
cntrl.Attributes.Remove("name");
writer.WriteAttribute("id", cntrl.RenderedId);
writer.WriteAttribute("name", cntrl.RenderedName);
}
cntrl.Attributes.Render(writer);
HtmlContainerControl containerCntrl = cntrl as HtmlContainerControl;
if (containerCntrl == null)
writer.Write(" /");
}
public static string GetRenderedId(IFormControl cntrl) {
return cntrl.UseNamingContainer ? cntrl.ClientID : cntrl.ID;
}
public static string GetRenderedName(IFormControl cntrl) {
return cntrl.UseNamingContainer ? cntrl.UniqueID : cntrl.ID;
}