簡體   English   中英

如何在 C# 中獲取 Javascript 變量值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM