解决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类,他们具有相同的方法和方法参数调用: 

#region C# StringHelper Class
public class StringHelper
{
    public StringHelper()
    {
    }


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

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

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


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

            else
            {
                strList[i] = Convert.ToString(list[i]);
            }

        }

        return ArrayToString(strList);
    }


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

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

        return list;
    }

}

#endregion

#region JavaScript StringHelper Class 
StringHelper = function() {}

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

StringHelper.StringToArray = function(strStringLine)
{
    var index = strStringLine.lastIndexOf('$');
    if ( index == -1 )
    {
        return [strStringLine];
    }
    var strLengthLine = strStringLine.substring(index+1);
    var aryLength = strLengthLine.split(':');
    var list = new Array(aryLength.length);
    var start = 0;
    for ( var i=0 ; i < list.length ; ++i )
    {
        var length = parseInt(aryLength[i]);
        list[i] = strStringLine.substr(start, length);
        start += length;
    }
    return list;
};
 #endregion

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


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。  

目录
相关文章
|
JSON 前端开发 数据格式
四种常见的参数传递方式
四种参数传递方式
215 0
|
3月前
|
设计模式 Python
学习函数的参数传递和返回值
在编写函数时,不可避免地会出现一些错误。通过调试代码,查看参数的值在函数内部的变化以及返回值是否符合预期,有助于更好地理解参数传递和返回值的机制。
|
4月前
|
Shell
参数传递
【10月更文挑战第16天】
31 3
|
4月前
|
存储 JavaScript 前端开发
参数传递方法
参数传递方法
23 2
|
4月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
44 0
|
8月前
|
安全 C++ 开发者
C++一分钟之-函数参数传递:值传递与引用传递
【6月更文挑战第19天】C++中函数参数传递涉及值传递和引用传递。值传递传递实参副本,安全但可能效率低,适合不变对象;引用传递传递实参引用,允许修改,用于高效修改或返回多值。值传递示例显示交换不生效,而引用传递示例实现交换。常量引用则防止意外修改。选择传递方式需考虑效率与安全性。
71 2
|
9月前
|
存储 Python
Python函数参数传递
Python函数参数传递
84 1
|
C++ Python
Python函数参数传递:传值还是传引用
Python函数参数传递:传值还是传引用
69 0
|
数据处理
参数传递是什么?参数传递的是什么?
避免代码冗长,防止代码的仿佛书写。前面的博客中有说明,这里不做过多赘述
|
JavaScript 前端开发
函数 定义,调用,传参,箭头函数、闭包
函数是一段可重复使用的代码块,可以接受参数(可选)并返回一个值(可选)。在JavaScript中,函数可以通过以下步骤进行定义、调用和传参。