这些天做了一个WebControl,Control支持复杂的交互,有很多的参数通过调用 __doPostBack(id, eventArgument)来和控件交互。doPostBack的用法是,id: 服务器控件的ClientID,eventArgument: 传回服务器的参数。这个参数在服务器端通过IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)来读取,本来事情就这么简单,可是后来由于eventArgument里是任意的数据,就出现了$、:、#、%等字符情况,这就把我开始用“:”来分隔的eventArguemnt里的多过个参数搞faint了
。
于是我就想,把字符串编码一下的了,把分隔符转掉就行了呗,可是后来发现有些数据需要在Client端由JavaScript去读取处理,然后再PostBack,这样就要在服务器端实现JavaScript的escape和unescape两个函数,真是麻烦。后来想,反正就是为了组合和切分字符串嘛,干脆把字符串线性排好,记下每个字串的length。分解的时候使用length来分解出每个字符子串,这样就再也不用care字符串的内容了,也比编码的效率高些。这个方法的原理和数据压缩里的行程码有点类似,只是我这里不能压缩而已。
于是我在控件和脚本里分别实现了一个StringHelper类,他们具有相同的方法和方法参数调用:
#region C# StringHelper Class
public class StringHelper
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
public StringHelper()
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
// if list = {'a', 'bc', 'def', 'ghij'}; then return "abcdefghijkl$1:2:3:4"
public static string ArrayToString(
params string [] list)
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
if ( list.Length <= 0 )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
return string.Empty;
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
string strLengthLine = String.Empty;
string strStringLine = String.Empty;
for (
int i= 0 ; i < list.Length ; i++ )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
strLengthLine += ":" + list[i].Length;
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
strStringLine += list[i];
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
return strStringLine + '$' + strLengthLine.Substring(1);
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
public static string ArrayToString(
params object [] list)
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
string [] strList =
new string [list.Length];
for (
int i=0 ; i < list.Length ; ++i )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
if ( list[i]
is string )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
strList[i] = (
string)list[i];
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
else ![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
strList[i] = Convert.ToString(list[i]);
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
return ArrayToString(strList);
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
// if strStringLine = "abcdefghijkl$1:2:3:4" then return {'a', 'bc', 'def', 'ghij'}.
public static string [] StringToArray(
string strStringLine)
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
int index = strStringLine.LastIndexOf('$');
if ( index == -1 )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
return new string [] {strStringLine};
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
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 )
![ExpandedSubBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
int length =
int.Parse(aryLength[i]);
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
list[i] = strStringLine.Substring(start, length);
![InBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
start += length;
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
return list;
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
![ExpandedSubBlockEnd.gif](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
}
#endregion
#region JavaScript StringHelper Class
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
StringHelper =
function() {}
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
StringHelper.ArrayToString =
function()
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
{
if ( arguments.length == 0 )
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
{
throw 'Must have parameters
for call me.';
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
}
var strLengthLine = '';
var strStringLine = '';
for (
var i=0 ; i < arguments.length ; i++ )
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
{
var str = '' + arguments[i];
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
strLengthLine += ':' + str.length;
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
strStringLine += str;
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
}
return strStringLine + '$' + strLengthLine.substring(1);
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
};
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
StringHelper.StringToArray =
function(strStringLine)
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
{
var index = strStringLine.lastIndexOf('$');
if ( index == -1 )
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
{
return [strStringLine];
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
}
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 )
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
{
var length = parseInt(aryLength[i]);
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
list[i] = strStringLine.substr(start, length);
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
start += length;
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
}
return list;
![None.gif](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
};
#endregion
完成了这两个Helper后,我发现还有很多新的用途,有的时候我们需要在ViewState里放上一些多dimension的字符串数组数据的时候,我们也可以用n次(n和数组维度一样)StringHelper.ArrayToString来serialize数据。当然我们也可以序列化对象放到ViewState里,单纯的string的substring操作,效率上比binaryformat要高很多吧。特别是对于ViewState字符串本身就200,300K的页面来说,能省点是点吧
。
本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。