解决WebControl的doPostBack参数传递问题

    这些天做了一个WebControl,Control支持复杂的交互,有很多的参数通过调用 __doPostBack(id, eventArgument)来和控件交互。doPostBack的用法是,id: 服务器控件的ClientID,eventArgument: 传回服务器的参数。这个参数在服务器端通过IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)来读取,本来事情就这么简单,可是后来由于eventArgument里是任意的数据,就出现了$:#%等字符情况,这就把我开始用“:”来分隔的eventArguemnt里的多过个参数搞faint了emsad.gif
    于是我就想,把字符串编码一下的了,把分隔符转掉就行了呗,可是后来发现有些数据需要在Client端由JavaScript去读取处理,然后再PostBack,这样就要在服务器端实现JavaScript的escapeunescape两个函数,真是麻烦。后来想,反正就是为了组合和切分字符串嘛,干脆把字符串线性排好,记下每个字串的length。分解的时候使用length来分解出每个字符子串,这样就再也不用care字符串的内容了,也比编码的效率高些。这个方法的原理和数据压缩里的行程码有点类似,只是我这里不能压缩而已。
    于是我在控件和脚本里分别实现了一个StringHelper类,他们具有相同的方法和方法参数调用: 

ContractedBlock.gif ExpandedBlockStart.gif C# StringHelper Class #region C# StringHelper Class
InBlock.gif
public class StringHelper
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
public StringHelper()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
// if list = {'a', 'bc', 'def', 'ghij'}; then return "abcdefghijkl$1:2:3:4"
InBlock.gif
    public static string ArrayToString(params string [] list)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if ( list.Length <= 0 )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return string.Empty;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
string strLengthLine = String.Empty;
InBlock.gif        
string strStringLine = String.Empty;
InBlock.gif        
for ( int i= 0 ; i < list.Length ; i++ )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            strLengthLine 
+= ":" + list[i].Length;
InBlock.gif            strStringLine 
+= list[i];    
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return strStringLine + '$' + strLengthLine.Substring(1);            
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static string ArrayToString(params object [] list)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
string [] strList = new string [list.Length];
InBlock.gif        
for ( int i=0 ; i < list.Length ; ++i )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if ( list[i] is string )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                strList[i] 
= (string)list[i];
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                strList[i] 
= Convert.ToString(list[i]);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
return ArrayToString(strList);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
// if strStringLine = "abcdefghijkl$1:2:3:4" then return {'a', 'bc', 'def', 'ghij'}.
InBlock.gif
    public static string [] StringToArray(string strStringLine)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
int index = strStringLine.LastIndexOf('$');
InBlock.gif        
if ( index == -1 )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
return new string [] dot.gif{strStringLine};
ExpandedSubBlockEnd.gif        }

InBlock.gif        
string strLengthLine = strStringLine.Substring(index+1);
ExpandedSubBlockStart.gifContractedSubBlock.gif        
string [] aryLength = strLengthLine.Split(new char [] dot.gif{':'});
InBlock.gif        
string [] list = new string [aryLength.Length];
InBlock.gif        
int start = 0;
InBlock.gif        
for ( int i=0 ; i < list.Length ; ++i )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
int length = int.Parse(aryLength[i]);
InBlock.gif            list[i] 
= strStringLine.Substring(start, length);
InBlock.gif            start 
+= length;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return list;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
#endregion

ContractedBlock.gif ExpandedBlockStart.gif JavaScript StringHelper Class #region JavaScript StringHelper Class 
None.gifStringHelper = function() {}
None.gif
None.gifStringHelper.ArrayToString 
= function()
None.gif{
None.gif    
if ( arguments.length == 0 )
None.gif    {
None.gif        
throw 'Must have parameters for call me.';
None.gif    }
None.gif    
var strLengthLine = '';
None.gif    
var strStringLine = '';
None.gif    
for ( var i=0 ; i < arguments.length ; i++ )
None.gif    {
None.gif        
var str = '' + arguments[i];
None.gif        strLengthLine 
+= ':' + str.length;
None.gif        strStringLine 
+= str;
None.gif    }
None.gif    
return strStringLine + '$' + strLengthLine.substring(1);
None.gif};
None.gif
None.gifStringHelper.StringToArray 
= function(strStringLine)
None.gif{
None.gif    
var index = strStringLine.lastIndexOf('$');
None.gif    
if ( index == -1 )
None.gif    {
None.gif        
return [strStringLine];
None.gif    }
None.gif    
var strLengthLine = strStringLine.substring(index+1);
None.gif    
var aryLength = strLengthLine.split(':');
None.gif    
var list = new Array(aryLength.length);
None.gif    
var start = 0;
None.gif    
for ( var i=0 ; i < list.length ; ++i )
None.gif    {
None.gif        
var length = parseInt(aryLength[i]);
None.gif        list[i] 
= strStringLine.substr(start, length);
None.gif        start 
+= length;
None.gif    }
None.gif    
return list;
None.gif};
 #endregion

 
   完成了这两个Helper后,我发现还有很多新的用途,有的时候我们需要在ViewState里放上一些多dimension的字符串数组数据的时候,我们也可以用n次(n和数组维度一样)StringHelper.ArrayToString来serialize数据。当然我们也可以序列化对象放到ViewState里,单纯的string的substring操作,效率上比binaryformat要高很多吧。特别是对于ViewState字符串本身就200,300K的页面来说,能省点是点吧emsmile.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值