鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 232, 评论 - 5416, 引用 - 344
数据加载中……

解决WebControl的doPostBack参数传递问题

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

C# StringHelper Class

JavaScript StringHelper Class

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

posted on 2004-12-11 01:09 birdshome 阅读(5176) 评论(8)  编辑 收藏 所属分类: Asp.net控件开发

评论

#1楼    回复  引用  查看    

eventArgument应该是通过IPostBackEventHandler.RaisePostBackEvent的这个方法获得的吧
2005-03-07 19:28 | alittlefish      

#2楼    回复  引用  查看    

是的呀,有什么问题?!
2005-03-07 22:49 | birdshome      

#3楼 [楼主]   回复  引用  查看    

StringHelper.ArrayToString = function()
{
    
if ( arguments.length == 0 )
    {
        
throw 'Must have parameters for call me.';
    }
    
var args = arguments;
    
if ( args.length == 1 && __typeof__(args[0]) == 'Array' )
    {
        args 
= arguments[0];
    }
    
var strLengthLine = '';
    
var strStringLine = '';
    
for ( var i=0 ; i < args.length ; i++ )
    {
        
var str = '' + args[i];
        strLengthLine 
+= ':' + str.length;
        strStringLine 
+= str;
    }
    
return strStringLine + '$' + strLengthLine.substring(1);
};

     修复bug,原来那个版本居然不能接收Array作为参数,还叫ArrayToString,狂晕
 
     BTW: __typeof__参看这里
2005-03-16 18:24 | birdshome      

#4楼    回复  引用    

when client use escape function,
use URLdecode or UTF-8 decode at the server end would be easier.
2007-09-05 17:31 | z something [未注册用户]

#5楼    回复  引用    

werwe
2007-10-11 17:30 | kool [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-12-25 23:17 编辑过


相关链接: