将变量从 Javascript 传递到 C# 以供在 SQL SELECT 中使用,然后将结果传递回 Javascript

Passing a variable from Javascript into C# for use in SQL SELECT, then passing result back to Javascript

我正在尝试 运行 我的代码隐藏中的一些代码来查询我的 SQL 服务器(使用 JavaScript 变量),然后将结果作为整数传递回我的Javascript.

我试图做到这一点,最初 运行 宁一些 Javascript 来获取 SQL SELECT 语句的变量,然后将其传递给隐藏ASP 字段(目前是用于测试目的的文本框)。

但是每次我 运行 代码 refreshHTML() 时,隐藏字段(文本框)的值都是空的,它 returns 值 999999999。

当我 运行 应用程序时,我可以看到文本框填充了正确的值。

这是我的 C# 隐藏代码

    public int ucount
    {
    get
    {
        if (String.IsNullOrEmpty(invoicenumberhidden.Text))
        {
            return 999999999;
        }

        else { 

        int invoicenumber = int.Parse(invoicenumberhidden.Text);

        string commandText = "SELECT COUNT(*) AS distinct_count FROM (SELECT DISTINCT [inv_section],[invoice_number], [cust_po] FROM [Indigo].[dbo].[invoice_items] WHERE invoice_number=" + invoicenumber + ") AS I;";
        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Indigo2.Properties.Settings.Constr"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connectionString))
            using (SqlCommand cmd = new SqlCommand(commandText, conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
                int uniquecount = (Int32)cmd.ExecuteScalar();
                conn.Close();
                return uniquecount;
            }
        }          
    }
}

这是我的 JavaScript,它是在 ASP OnClientClick 事件上触发的 函数 refreshHtml()

        //Get Primary Key from Grid1
        var grid = jQuery("#<%= JQGrid1.ClientID %>");
        var rowKey = grid.getGridParam("selrow");

        document.getElementById('<%= invoicenumberhidden.ClientID %>').value = rowKey;

        var jsucount = '<%=this.ucount%>';
        alert(jsucount);

这是我的相关 ASP 代码

<div hidden> <asp:Button ID="btnDownload" runat="server" OnClientClick="refreshHtml();" OnClick="btnDownloadButton_Click" Text="Export PDF"></asp:Button></div>
<asp:TextBox ID="invoicenumberhidden" runat="server"></asp:TextBox>

var jsucount = '<%=this.ucount%>'; 替换为 var jsucount = document.getElementById('<%= invoicenumberhidden.ClientID %>').value;

您遇到此问题是因为在您的 html 页面中您将拥有 var jsucount = 999999999。在此处获取 999999999 值,因为 .net 在将页面发送到您的浏览器时将设置 '<%=this.ucount%>' 值。它不会反映在服务器上进行的任何进一步更改。

编辑 2:

因为你想进行服务器访问以获取最新的 ucount 值。你可以试试PageMethods

您可以像 GetUCount 一样将 ucount 逻辑移动到 method 并给出 [WebMethod] 注释。但是你不能在这里使用控件,所以你需要在参数中传递隐藏字段的值。并且还需要在 javascript 中进行一些更改,如下所述。

后面的代码:

[WebMethod]
public int GetUCount(string invoicenumberhidden)
{       
    if (String.IsNullOrEmpty(invoicenumberhidden))
    {
        return 999999999;
    }

    else 
    { 

        int invoicenumber = int.Parse(invoicenumberhidden);

        string commandText = "SELECT COUNT(*) AS distinct_count FROM (SELECT DISTINCT [inv_section],[invoice_number], [cust_po] FROM [Indigo].[dbo].[invoice_items] WHERE invoice_number=" + invoicenumber + ") AS I;";
        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Indigo2.Properties.Settings.Constr"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connectionString))
            using (SqlCommand cmd = new SqlCommand(commandText, conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
                int uniquecount = (Int32)cmd.ExecuteScalar();
                conn.Close();
                return uniquecount;
            }
    }               
}

Javascript:

function refreshHtml() {
    //Get Primary Key from Grid1
    var grid = jQuery("#<%= JQGrid1.ClientID %>");
    var rowKey = grid.getGridParam("selrow");

    document.getElementById('<%= invoicenumberhidden.ClientID %>').value = rowKey;

    PageMethods.GetUCount(rowKey, onSuccess, onFailure);        
}

function onSuccess(result) {
    alert(result);
}

function onFailure(result) {
    alert("Failed!");
}