using System.IO; using System.Web; using System.Web.UI; using System.Web.UI.Adapters; /// /// FormRewriter 的摘要说明 /// namespace SiteCore.URLRewriter { public class FormRewriterControlAdapter : ControlAdapter { protected override void Render(HtmlTextWriter writer) { base.Render(new RewriteFormHtmlTextWriter(writer)); } } public class RewriteFormHtmlTextWriter : HtmlTextWriter { public RewriteFormHtmlTextWriter(HtmlTextWriter writer) : base(writer) { base.InnerWriter = writer.InnerWriter; } public RewriteFormHtmlTextWriter(TextWriter writer) : base(writer) { base.InnerWriter = writer; } public override void WriteAttribute(string name, string value, bool fEncode) { //If the attribute we are writing is the "action" attribute, and we are not on a sub-control, //then replace the value to write with the raw URL of the request - which ensures that we'll //preserve the PathInfo value on postback scenarios if (name == "action") { HttpContext context = HttpContext.Current; if (context.Items["ActionAlreadyWritten"] == null) { //We will use the Request.RawUrl property within ASP.NET to retrieve the origional //URL before it was re-written. value = context.Request.RawUrl; //Indicate that we've already rewritten the
's action attribute to prevent //us from rewriting a sub-control under the control context.Items["ActionAlreadyWritten"] = true; } } base.WriteAttribute(name, value, fEncode); } } }