If you are using URL rewriting, the ASP.NET HTML form tag doesn't support it. You have to override the form tag in order to make it work. It was a bug in ASP.NET 1.x and still haven't been fixed in 2.0. Here is the class I use when doing URL rewriting.

using System;
using System.Web;
using System.Web.UI;

public class Form : System.Web.UI.HtmlControls.HtmlForm
{
 protected override void RenderAttributes(HtmlTextWriter writer)
 {
  writer.WriteAttribute("name", this.Name);
  base.Attributes.Remove("name");

  writer.WriteAttribute("method", this.Method);
  base.Attributes.Remove("method");

  this.Attributes.Render(writer);

  writer.WriteAttribute("action", HttpUtility.HtmlEncode(Context.Request.RawUrl));
  base.Attributes.Remove("action");

  writer.WriteAttribute("onsubmit", "if (typeof(WebForm_OnSubmit) == 'function') return WebForm_OnSubmit();");
  base.Attributes.Remove("onsubmit");

  if (base.ID != null)
  writer.WriteAttribute("id", base.ClientID);
 }
}

I just spend ½ hour trying to find out, why my client callbacks where executing code inside the if (!Page.IsPostBack) region of my Page_Load method. It turns out, the Page class in .NET 2.0 has now got a new property called IsCallback. I then changed my if (!Page.IsPostBack) to if (!Page.IsPostBack && !Page.IsCallback). You learn something every day. The client callback feature of .NET 2.0 is really well implemented. If you haven't tried it yet, you should. It works like a charm and the things you can do with it, is absolutely incredible. Thumbs up to the architects of that feature. The father of ASP.NET Scott Guthrie is probably one of them.