[英]how to get Javascript variable value in C#
我有兩個緯度/長表,每個表 1000 行。 我想使用 Google Map API 計算兩個緯度/經度之間的距離並將距離存儲在 DB 中。 代碼工作正常,但問題是如何從 javascript 返回計算出的距離。 我嘗試使用隱藏字段來存儲距離,因為我在頁面加載中編寫了以下代碼,但它不起作用:
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" />
在您的 JavaScript 中,將其添加到“函數回調(響應,狀態)”的末尾:
document.getElementById("txtDistance").value = distance;
然后在你的 C# 代碼中,你可以像這樣訪問這個值:
string cDistance = txtDistance.Value;
//原始文本為字符串 cDistance = txtDistance.value;
希望有幫助。
這是我完全成功的使用方法。
https://stackoverflow.com/a/44570554/7991036
為了提供更多細節,我編寫了一個基於標准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;
}
每次我需要從 JavaScript 代碼中獲取一些值時,只要類導航到相關網頁,我就會使用此方法。 該方法接受任何類型的純 JavaScript 代碼,因此它可以直接根據代碼返回任何類型的值。
以下是如何使用該方法的示例:
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);
訣竅是使用結構化對象來返回值。 在 C# 代碼方面,您確實需要牢記這一點才能正確獲得返回的值。
使用此示例,您無需在任何網頁中隱藏任何 HTML 對象,然后從任何 JavaScript 函數獲取結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.