首页 > 解决方案 > 将变量从 Javascript 传递到 C# 以在 SQL SELECT 中使用,然后将结果传递回 Javascript

问题描述

我试图在我的代码后面运行一些代码来查询我的 SQL Server(使用 JavaScript 变量),然后将结果作为整数传递回我的 Javascript。

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

但是,每次我运行代码时,refreshHTML(),隐藏字段(文本框)值都是空白的,它返回值 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;
            }
        }          
    }
}

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

        //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>

标签: javascriptc#asp.nethidden-field

解决方案


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

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

编辑2:

因为你想做服务器之旅以获得最新ucount价值。你可以试试看PageMethods

您可以将ucount逻辑移动到method喜欢GetUCount并给出[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!");
}

推荐阅读