处理回送数据(Postback)
当在ASP.NET中使用URL重写方法的时候,经常引发一个潜在的问题:在一个页面回送数据给服务器的时候,原先干净的输入URL通常不会被保存。举个例子来说,你使用诸如“~/Movies/Action.aspx”之类的简洁URL输入了一个网址,但是当你点击一个按钮执行回送数据给服务器的时候,这个网址将会变回实际的URL——“~/Movies.aspx?MovieType= Action”。
问题的根源在于<form runat="server"> 标签Action动作的属性,它使用真实的URL而不是输入的网址。
解决这个问题的一个简单的办法是通过扩展继承已有的form标签来实现你自己的form标记版本。然后你可以设置其action为输入的URL而不是重写的那个。参看以下示例:
代码清单4:定制的form标记可以处理URL重写的数据回送
public class RewriteForm : HtmlForm {
protected override void
RenderAttributes(System.Web.UI.HtmlTextWriter writer) {
// Name
writer.WriteAttribute("name", this.Name);
base.Attributes.Remove("name");
// Method
writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");
this.Attributes.Render(writer);
// Action
String action = Context.Request.RawUrl;
if (action != null) {
writer.WriteAttribute("action", action);
}
base.Attributes.Remove("action");
// ID
if (base.ID != null) {
writer.WriteAttribute("id", base.ClientID);
}
}
}
使用以上代码,你现在可以使用<MyTags:RewriteForm ID="form1" runat="server"> 标记,而不用使用标准的<form id="form1" runat="server"> 标记,这样即使在数据回送过程中,也将保持网址不变。