Javascript VB.Net的JS对象数组
这里有点乱。我有各种暴露于COM的系统,我已经在我的.net软件中实现了Google地图(v3)。我现在要做的是,当用户编辑多边形(定义区域)时,我会将所有路径点发送回.net以存储到数据库中 我的问题是.Net知道我传回的JS数组的大小是X个元素,但就我的一生而言,我不知道如何在遍历数组时引用这些值 下面是我在JS中使用的.NET(VB)方法,它带有Javascript VB.Net的JS对象数组,javascript,arrays,vb.net,google-maps-api-3,Javascript,Arrays,Vb.net,Google Maps Api 3,这里有点乱。我有各种暴露于COM的系统,我已经在我的.net软件中实现了Google地图(v3)。我现在要做的是,当用户编辑多边形(定义区域)时,我会将所有路径点发送回.net以存储到数据库中 我的问题是.Net知道我传回的JS数组的大小是X个元素,但就我的一生而言,我不知道如何在遍历数组时引用这些值 下面是我在JS中使用的.NET(VB)方法,它带有window.external Public Sub AreaPointMoved(ByRef obj As Object, ByVal s As
window.external
Public Sub AreaPointMoved(ByRef obj As Object, ByVal s As String)
MsgBox(s) ' contains a string of lat/lngs from JS
MsgBox(obj.length)
For i As Integer = 0 To obj.length
MsgBox(obj(i).lat & ", " & obj(i).lng) ' this doesn't work
'MsgBox(obj.lat & ", " & obj.lng) ' this doesn't work
Next
End Sub
以及在触发set_at
事件时发送内容的JS:
function DrawAreaOverlay(area, col)
{
var coordsString = "";
var areaCoords = [];
overlayLayer[overlayCount] = new Array();
for(var j=0; j<area.Count; j++)
{
areaCoords.push(new google.maps.LatLng(area.Item(j).lng, area.Item(j).lat));
}
var poly = new google.maps.Polygon({
paths: areaCoords,
strokeColor: col,
strokOpacity: 0.35,
strokeWeight: 2,
fillColor: col,
fillOpacity: 0.25,
geodesic: false,
editable: canEdit,
draggable: canDrag,
map: map
});
overlayLayer[overlayCount].push(poly);
poly.getPaths().forEach(function(path, index){
google.maps.event.addListener(path, 'set_at', function(){
var arrayOfPoints = new Array();
var g = new Array();
arrayOfPoints = poly.getPath();
coordsString = "";
for(var i=0; i<arrayOfPoints.length; i++)
{
//simpleArray[i] = poly.getPath().getAt(i).lat() + ", " + poly.getPath().getAt(i).lng();
geoObj = new Object();
geoObj.lat = poly.getPath().getAt(i).lat();
geoObj.lng = poly.getPath().getAt(i).lng();
g.push(geoObj);
coordsString += poly.getPath().getAt(i).lat() + ", " + poly.getPath().getAt(i).lng() + "|";
}
window.external.AreaPointMoved(g, coordsString);
//alert(path.getLength());
});
});
}
函数DrawAreaOverlay(区域,列)
{
var coordsString=“”;
var areaCoords=[];
overlayLayer[overlayCount]=新数组();
对于(var j=0;j,根据答案,您可以使用两个选项与非原始参数交互,调用ObjectForScripting
。表示您应该使用动态
作为参数类型
令我惊讶的是,我明白了。显然,选项严格关闭
和选项推断打开
达到了同样的目的:
选项严格关闭
选项推断
公共子区域点移动(ByRef obj作为对象,ByVal s作为字符串)
对于i,作为整数=0到obj.length
“延迟绑定到.lat和.lng现在应该可以工作了
'打开调试>窗口>立即
调试打印(obj(i).lat)
调试打印(obj(i).lng)
下一个
端接头
这是未经测试的,因为我无法轻松测试任何代码。如果这不起作用,第二个方法是调用属性:
Public Sub-AreaPointMoved(ByRef obj作为对象,ByVal s作为字符串)
双倍调暗lat
将液化天然气调暗为双倍
对于i,作为整数=0到obj.length
lat=obj(i).GetType().InvokeMember(“lat”,BindingFlags.InvokeMethod,Nothing,obj(i),Nothing)
lng=obj(i).GetType().InvokeMember(“lng”,BindingFlags.InvokeMethod,Nothing,obj(i),Nothing)
'在调试>窗口>即时窗口中查看
调试打印(lat)
调试打印(lng)
下一个
端接头
请原谅我的VB.NET的语法错误。我把C#翻译成VB.NET的技巧充其量也太生疏了
您是否考虑过使用一组双精度数组?您不应该只需要对象属性来传递坐标:
Public Sub-AreaPointMoved(ByVal坐标()()为双精度)
端接头
for(var i=0;i或可能通过Windows WebBrowser控件(它是Internet Explorer周围的COM互操作包装器)。使用基于Chromium over IE的浏览器,将Google Maps嵌入桌面应用程序将更加流畅。CEF和Awesomium都有更丰富的方法来实现.Net IL和Javascript之间的双向调用。您在使用窗口时遇到了困难。外部和网络浏览器。ObjectForScript
只需因为对于任何严重的问题,它都是一个蹩脚的API。如果在MsgBox上放置一个断点并检查其中的内容会怎么样?显示:System.\u COMObject-但不会让我看到任何字段或任何类型的属性。尝试使用obj[i]而不是obj(i)甚至不会编译。“需要标识符。”使用:obj[0].lat-我会用字符串解决它。老派的方式!我只是希望,因为在JS中获得一个可枚举数组很简单,所以从JS中返回和迭代一个数组会很容易。类似的q/A:stackoverflow.com/A/20943173/1768303。代码用C#编写,但是可以从VB.NET中使用相同的反射API。同意IE浏览器apper使用起来不太方便!但目前它主要是一个原型。感谢链接,我会看一看,看看我能做些什么。大部分繁重的工作都是在JS本身内完成的,所以希望它只是一个迁移控件和加载文件系统内容的不同方式的例子。干杯!+1