C# ASP.NET 在服务器端产生一个byte[],要将它传到客户端,然后由javascript将它赋给一个ActiveX控件

C# ASP.NET 在服务器端产生一个byte[],要将它传到客户端,然后由javascript将它赋给一个ActiveX控件.请问该如何做呢????

服务端:Page.RegisterStartupScript("ggg", "<script>onclickUsb('" + files + "','" + ecgDataType + "','" + ecgFileName + "');</script>"); files为byte[] 其他两个为string 为什么 我传string不出错 byte[] 就不行
前台(JavaScript): function onclick(files,ecgDataType,ecgFileName)
{
var obj =document.getElementById('ECGVIEW');//控件
obj.ShowECGData(files,ecgDataType,ecgFileName);//控件函数
} 只要传入byte就行 后台传byte到前台 怎么做 谢谢
那能补充下我在控件里怎么去把string转化为原来的byte[]呢? 好像不是很好啊 会出错 (*^__^*) 嘻嘻…… 谢谢
最新回答
﹌傲似。表情帝╯▽╰

2024-05-14 09:52:02

在服务器端的
Page.RegisterStartupScript("ggg", "<script>onclickUsb(" + files + "," + ecgDataType + "," + ecgFileName + ");</script>");
这一句有问题,因为files是一个byte[],它没有重载适当的能与string对象相加的运算符,所以会出错。如果想把byte[]作为16进制数字符串来传递,可以这样:
StringBuilder str = new StringBuilder();
foreach (byte b in files)
{
str.AppendFormat("{0:X2}", b);
}
Page.RegisterStartupScript("ggg", "<script>onclickUsb(" + str.ToString() + "," + ecgDataType + "," + ecgFileName + ");</script>");

关键是要看客户端(前台)的JavaScript onclick函数中的files参数是什么形式的,如果是一串十六进制数字符串,那就对了。这里的files应当不会是byte数据类型的数组,因为IE所提供的Jscript5引擎并不支持byte数据类型。

===================================================================
如果控件是你自己写的,那就好办了,在C#中可以这样把一个十六进制数字字符串转换为byte数组:
// 设files为一串十六进制数字字符如:AABBCCDDFEA025
byte[] fileDatas = new byte[files.Length / 2];
for (int i = 0; i < files.Length / 2; i++)
{
fileDatas[i] = byte.Parse(files.Substring(i * 2, 2), NumberStyles.HexNumber);
}
// fileDatas就是你想要的byte[]

如果控件不是你自己写的,就要详细了解files参数的数据结构,才能在JavaScript中进行合适的转换。
ヤ偽妳變乖

2024-05-14 07:48:55

个人认为:把byte[]转换成string进行网页传递,在从控件中把string拎出来变成byte[]…… 可行! 但非常不安全 容易出错滴 现在传统的做法是:网站上再加个webservice 控件访问网站数据库返回byte[] 速度上就是一个提高……
http://blog.sina.com.cn/s/blog_3f01bd3901000bzr.html
这个是简单的webservice创建 看看就会了
笑忘书

2024-05-14 09:54:52

obj.ShowECGData(files,ecgDataType,ecgFileName);
这函数第一个参数是btye数组?还真不知道js里怎么表示byte[]。
我只知道你这个语句是有错误的
Page.RegisterStartupScript("ggg", "<script>onclickUsb('" + files + "','" + ecgDataType + "','" + ecgFileName + "');</script>");
你这样写的话,files是byte[]类型,与字符串进行+相连的话,会调用files.ToString()方法,也就相当于
Page.RegisterStartupScript("ggg", "<script>onclickUsb('" + files.ToString() + "','" + ecgDataType + "','" + ecgFileName + "');</script>");
而files.ToString()的结果是System.Byte[],所以你传递到JS函数里也就成了System.Byte[]了。
至于怎么传递byte[]还真是头疼了。。。
直接传貌似是不行了,我做了下试验:
string str = "helloo";
byte[] btArray = System.Text.Encoding.UTF8.GetBytes(str);
这时btArray数组里的元素是把h,e,l,l,o,o这六个字母的ASC码值给转换成byte类型了
所以我想可以这样写:
把你files里的每个元素都ToString,然后以"|"符号分隔组成一个字符串传递到JS的某个函数里。
然后再这个JS函数里通过split拆分获得一个字符串数组,这个字符串数组里的元素正是files里byte类型元素的字符串形式,但是怎样把这个字符串数组在JS里转化成byte[]数组就不知道了,因为JS里没有byte[]这种对象,所以我想你可以直接把这个字符串数组传递给ShowECGData方法,看看能否行得通。
--------------------------------------------------------------------
首先要明白的是,javascript里没有byte[]这种对象。都是以var来声明对象的,也就是弱类型。所以我建议你还是把string数组传递到ShowECGData里去,试试看能不能实现吧。
幽兰黛尔

2024-05-14 00:06:32

你把数据保存在SESSION()中试试
臣妾做不到

2024-05-14 05:53:46

为什么不用ajax?