URL太長致使參數被截斷的問題

    作Web開發時常常涉及到頁面之間的轉跳,頁面之間的轉跳就會涉及到頁面之間參數的傳遞,經過URL傳遞參數是經常使用的方法之一,可是微軟 說:"Maximum URL length is 2,083 characters in Internet Explorer",也就是說URL是有長度限制的。

    ASP.NET應用程序前臺與後臺的數據交換都是經過FORM表單來完成的,FORM表單提供了兩種數據傳輸方式:GET和POST,這個兩種數 據傳輸方式在實際傳輸中有很大的不一樣,但ASP.NET框架中已經屏蔽了兩者的一些差別。GET是用來從服務器上得到數據,而POST是用來向服務器提交 數據的。兩者 數據傳輸過程當中分別對應了HTTP協議中的GET和POST方法。

    GET方式是把參數數據隊列加到提交表單的ACTION屬性所指的URL後面,而且使用"?"隔開,值和表單內各個字段一一對應,在URL中能夠看到,它是FROM默認的提交方式,受URL長度的限制,它所能傳遞的數據量小。
    POST方式是把表單中的數據放在FORM載體中, 按照變量和值相對應的方式,傳遞到ACTION所指向URL,POST能夠傳遞大數據量的信息到服務器,一般文件上傳就是使用POST方式上傳。

    爲解決GET方式傳遞大數據量參數的問題,要使用POST方式進行數據提交,下面是一個用來代替window.open的方法
1.JavaScript
/*
 * PostNewWin
 * Author:ppchen
 
*/
var  PostNewWin  =   function (url){
    
var  urlArr  =  url.split( " ? " );
    
var  postUrl  =  urlArr[ 0 ];
    
var  postData  =  urlArr[ 1 ];
    
var  iframe  =  document.getElementById( " postData_iframe " );
    
if ( ! iframe){
        iframe 
=  document.createElement( " iframe " );
        iframe.id 
=   " postData_iframe " ;
        iframe.scr
=   " about:blank " ;
        iframe.frameborder 
=   " 0 " ;
        iframe.style.width 
=   " 0px " ;
        iframe.style.height 
=   " 0px " ;
        
        
var  form  =  document.createElement( " form " );
        form.id 
=   " postData_form " ;
        form.method 
=   " post " ;
        form.target 
=   " _blank " ;
        
        document.body.appendChild(iframe);
        iframe.contentWindow.document.write(
" <body> "   +  form.outerHTML  +   " </body> " );
    }
    iframe.contentWindow.document.getElementById(
" postData_form " ).innerHTML  =   " <input name='postData' id='postData' type='text' value=' "   +  postData  +   " '/> " ;
    iframe.contentWindow.document.getElementById(
" postData_form " ).action  =  postUrl;
    iframe.contentWindow.document.getElementById(
" postData_form " ).submit();
};
 
2.CSharp
///   <summary>
///  從Form中取得參數
///  Author:ppchen
///   </summary>
///   <returns> 參數集合 </returns>
private  NameValueCollection ParseFormData()
{
    NameValueCollection sQueryString 
=   new  NameValueCollection();
    
if  ( this .Request.Form.Count  >   0   &&   this .Request.Form[ " postData " !=   null )
    {
        
string  sPostData  =   this .Request.Form[ " postData " ].ToString();
        sPostData 
=  sPostData.Trim( new   char [] {  ' & ' '   '  });
        
if  ( ! string .IsNullOrEmpty(sPostData))
        {
            
string [] sParameterList  =  sPostData.Split( ' & ' );
            
for  ( int  i  =   0 ; i  <  sParameterList.Length; i ++ )
            {
                
string [] sParameter  =  sParameterList[i].Split( ' = ' );
                
for  ( int  j  =   0 ; j  <  sParameter.Length; j  =  j  +   2 )
                {
                    sQueryString.Add(sParameter[j], HttpUtility.UrlDecode(sParameter[j 
+   1 ]));
                }
            }
        }
    }
    
return  sQueryString; }
經過以上的JS代碼在客戶端打開頁面,經過以上的CS代碼在服務端取得參數,這樣使用了POST方式解決了GET方式中URL的長度限制,能夠傳遞大數據量的參數了:)
相關文章
相關標籤/搜索