如何在URL重写后,form标记中的Action值也用虚拟地址?

http://blog.joycode.com/dotey/archive/2005/03/10/45572.aspx?Pending=true

http://blog.joycode.com/scottgu/archive/2007/03/01/94004.aspx

综合以上讨论,首先建立/App_Browsers/Form.broswer文件,其内容为:
<browsers>
    
<browser refID="Default">
        
<controlAdapters>
            
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
                        adapterType
="FormRewriterControlAdapter" />
        
</controlAdapters>
    
</browser>

</browsers>

再建立FormRewriterControlAdapter类:
    public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        
protected override void Render(HtmlTextWriter writer)
        {

            
if (writer is System.Web.UI.Html32TextWriter)
            {
                writer 
= new FormFixerHtml32TextWriter(writer.InnerWriter);
            }
            
else
            {
                writer 
= new FormFixerHtmlTextWriter(writer.InnerWriter);
            }

            
base.Render(writer);
        }
    }

    
#region FormFixerHtml32TextWriter
    
internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
    {
        
private string _url; // 假的URL

        
internal FormFixerHtml32TextWriter(TextWriter writer)
            : 
base(writer)
        {
            _url 
= HttpContext.Current.Request.RawUrl;
        }

        
public override void WriteAttribute(string name, string value, bool encode)
        {
            
// 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
            if (_url != null && string.Compare(name, "action"true== 0)
            {
                value 
= _url;
            }
            
base.WriteAttribute(name, value, encode);
        }
    }
    
#endregion

    
#region FormFixerHtmlTextWriter
    
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
    {
        
private string _url;
        
internal FormFixerHtmlTextWriter(TextWriter writer)
            : 
base(writer)
        {
            _url 
= HttpContext.Current.Request.RawUrl;
        }

        
public override void WriteAttribute(string name, string value, bool encode)
        {
            
if (_url != null && string.Compare(name, "action"true== 0)
            {
                value 
= _url;
            }

            
base.WriteAttribute(name, value, encode);
        }
    }
    
#endregion
posted @ 2007-09-03 10:10  大洋  阅读(431)  评论(0编辑  收藏  举报