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[]呢? 好像不是很好啊 会出错 (*^__^*) 嘻嘻…… 谢谢
在服务器端的 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为一串十六进制数字字符如:AABBCCDDFEA025byte[] 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中进行合适的转换。
个人认为:把byte[]转换成string进行网页传递,在从控件中把string拎出来变成byte[]…… 可行! 但非常不安全 容易出错滴 现在传统的做法是:网站上再加个webservice 控件访问网站数据库返回byte[] 速度上就是一个提高……http://blog.sina.com.cn/s/blog_3f01bd3901000bzr.html 这个是简单的webservice创建 看看就会了
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里去,试试看能不能实现吧。