如何在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

你可能感兴趣的:(action)