【问题标题】:Passing a variable from Javascript into C# for use in SQL SELECT, then passing result back to Javascript将变量从 Javascript 传递到 C# 以在 SQL SELECT 中使用,然后将结果传递回 Javascript
【发布时间】:2019-12-17 05:05:27
【问题描述】:

我正在尝试在我的 Code Behind 中运行一些代码来查询我的 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 事件上触发的 JavaScript 函数 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>

【问题讨论】:

  • 您是否查看过浏览器开发者工具的“网络”选项卡?什么数据来回传输? SQL 语句本身是否按预期返回?
  • SQL 语句永远不会运行,问题是隐藏字段(文本框(值是 NULL。虽然当我运行应用程序时,文本框显示为已填充。
  • 顺便说一句,在 SQL 命令/查询中使用非参数化变量是一种不好的做法,而且很危险——你会让自己很容易受到 SQL 注入攻击
  • 另外,为什么不使用可为空的 int 而不是返回 999999999?

标签: javascript c# asp.net hidden-field


【解决方案1】:

var jsucount = '&lt;%=this.ucount%&gt;'; 替换为var jsucount = document.getElementById('&lt;%= invoicenumberhidden.ClientID %&gt;').value;

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

编辑 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!");
}

【讨论】:

  • 感谢 Karan,但我要返回的不是 invoicenumberhidden 值。该值被发送到后面的代码并用作 SQL 语句的一部分。我要返回的值是 SQL 语句的 COUNT 结果,它是从函数 ucount 返回的 int
  • 更新了我的答案。希望PageMethods可以解决你的问题。
  • 谢谢 PageMethods 是我所需要的 :)
猜你喜欢
  • 2014-01-17
  • 2018-11-14
  • 1970-01-01
  • 2011-04-02
  • 2011-11-14
  • 2017-06-03
  • 2013-07-17
  • 2016-09-12
  • 2016-03-29
相关资源
最近更新 更多