C# 如何在C语言中获取Javascript变量值
我有两张长/宽的桌子,每张桌子有1000行。我想使用GoogleMapAPI计算两个纬度/经度之间的距离,并将距离存储在DB中。 代码运行良好,但关键是如何从javascript返回计算出的距离。我尝试使用隐藏字段来存储距离,因为我在页面加载中编写了以下代码,但它不起作用:C# 如何在C语言中获取Javascript变量值,c#,javascript,C#,Javascript,我有两张长/宽的桌子,每张桌子有1000行。我想使用GoogleMapAPI计算两个纬度/经度之间的距离,并将距离存储在DB中。 代码运行良好,但关键是如何从javascript返回计算出的距离。我尝试使用隐藏字段来存储距离,因为我在页面加载中编写了以下代码,但它不起作用: SqlConnection sql_con = new SqlConnection("Database=myDB;Server=mySever;User Id=myID;password=PWD");
SqlConnection sql_con = new SqlConnection("Database=myDB;Server=mySever;User Id=myID;password=PWD");
SqlCommand sql_cmd = new SqlCommand("select Zip,Latitude,Longitude from ZipCodes", sql_con);
SqlDataAdapter sql_adt = new SqlDataAdapter(sql_cmd);
DataSet dsZip = new DataSet();
sql_adt.Fill(dsZip);
sql_cmd = new SqlCommand("select * from MyPlaceLatLong", sql_con);
sql_adt = new SqlDataAdapter(sql_cmd);
DataSet dsStore = new DataSet();
sql_adt.Fill(dsStore);
for (int zcnt = 0; zcnt < dsZip.Tables[0].Rows.Count; zcnt++)
{
for (int i = 0; i < dsStore.Tables[0].Rows.Count; i++)
{
Page.ClientScript.RegisterClientScriptBlock(GetType(), "myScssript", "<script>" +
"var origin1 = new google.maps.LatLng("+dsZip.Tables[0].Rows[zcnt]["Latitude"].ToString()+","+ dsZip.Tables[0].Rows[zcnt]["Longitude"].ToString()+");" +
"var origin2 = new google.maps.LatLng(" + dsStore.Tables[0].Rows[i]["lat"].ToString() + "," + dsStore.Tables[0].Rows[i]["long"].ToString() + ");" +
//"var origin1 = new google.maps.LatLng(55.930385, -3.118425);" +
//"var origin2 = new google.maps.LatLng(51.483061, -0.004151);" +
"var service = new google.maps.DistanceMatrixService();" +
" alert('Made it to calculateDistances');" +
"service.getDistanceMatrix(" +
"{" +
"origins: [origin1]," +
"destinations: [origin2]," +
"travelMode: google.maps.TravelMode.DRIVING," +
"unitSystem: google.maps.UnitSystem.IMPERIAL," +
"avoidHighways: false," +
"avoidTolls: false" +
"}, callback);" +
"function callback(response, status)" +
"{" +
"if (status == google.maps.DistanceMatrixStatus.OK) { " +
"var origins = response.originAddresses; " +
"var destinations = response.destinationAddresses;" +
"for (var i = 0; i < origins.length; i++) {" +
"var results = response.rows[i].elements;" +
"for (var j = 0; j < results.length; j++) {" +
"var element = results[j];" +
"var distance = element.distance.text;" +
"var duration = element.duration.text; " +
"var from = origins[i];" +
"var to = destinations[j];" +
"alert('The distance:'+ distance);" +
"}}}}" +
"</script>");
}
}
您需要在JavaScript中设置隐藏字段的值,我不相信我在那里看到了。在ASP中声明字段,如下所示:
<input type="hidden" id="txtDistance" runat="server" />
然后在您的C代码中,您可以这样访问该值:
string cDistance = txtDistance.Value;
//原始文本为字符串cDistance=txtdestance.value
希望有帮助 这就是我成功使用的方法 为了提供更多细节,我基于标准WebBrowser编写了一个类。在这个类中,我添加了以下方法:
/// <summary>
/// Execute and get the returned value from the JavaScript into HTML page without appending it.
/// </summary>
/// <param name="strJS">JavaScript to execute.</param>
/// <returns>Dynamic result depending on JavaScript function code.</returns>
public dynamic JSExecuteAndReturnVal(string strJS)
{
dynamic dynResult = Document.InvokeScript("eval", new[] { strJS });
return dynResult;
}
诀窍是使用结构化对象返回值。在C代码方面,您确实需要记住这一点,以便正确地获得返回的值
使用此示例,您不需要在任何网页中隐藏任何HTML对象,然后从任何JavaScript函数中获取结果。当我执行最后一行,获取txtdestance.value时,我在WinForm app中发现一个错误:对象引用未设置为对象的实例。
/// <summary>
/// Execute and get the returned value from the JavaScript into HTML page without appending it.
/// </summary>
/// <param name="strJS">JavaScript to execute.</param>
/// <returns>Dynamic result depending on JavaScript function code.</returns>
public dynamic JSExecuteAndReturnVal(string strJS)
{
dynamic dynResult = Document.InvokeScript("eval", new[] { strJS });
return dynResult;
}
string strClassName = "whatever";
string strJS = "function JSDoIt(){objResult = document.getElementsByClassName('" + strClassName + "')[0]." +
"textContent; return { Result: objResult }; }; JSDoIt();";
dynamic dynJSResult = myWebBrowser.JSExecuteAndReturnVal(strJS);
decimal.TryParse(dynJSResult.Result.ToString(), out decimal nTotal);