【问题标题】:Issue with passing hiddenfield value传递隐藏字段值的问题
【发布时间】:2016-08-12 15:36:49
【问题描述】:

我正在尝试将 HiddenField 值传递给 WebMethod GetAutoCompleteData 以根据选定的搜索字段在文本框中启用自动完成。

我尝试使用代码隐藏传递 HiddenField 值,但没有成功。

javascript 代码没有问题。

注意:我尝试在另一种方法中使用 HiddenField 值,并且它有效,因此我确信 HiddenField 正在使用 JavaScript 代码获取值。

代码隐藏:

public static string hdnvalue { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
   hdnvalue = hdnSearchParam.Value;
}

[WebMethod]
public static List<string> GetAutoCompleteData(string value)
{
    string hiddenfiedlvalue = hdnvalue; 
    List<string> result = new List<string>();

     string strConnString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
     using (SqlConnection con = new SqlConnection(strConnString))
    {
        using (SqlCommand cmd = new SqlCommand("select @hiddenfiedlvalue from Users where @hiddenfiedlvalue LIKE '%'+@SearchText+'%'", con))
        {
            con.Open();
            cmd.Parameters.AddWithValue("@SearchText", value);
            cmd.Parameters.AddWithValue("@hiddenfiedlvalue", hiddenfiedlvalue);

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                result.Add(string.Format("{0}", hiddenfiedlvalue));
            }
            return result;
        }
    }
}

用于将下拉菜单中的选定值传递到 HiddenField 的代码:

<script type="text/javascript">
    $(document).ready(function (e) {
        $('.search-panel .dropdown-menu').find('a').click(function (e) {
            e.preventDefault();
            var param = $(this).attr("href").replace("#", "");
            var concept = $(this).text();
            $('.search-panel span#search_concept').text(concept);
            $('[id$=hdnSearchParam]').val(param);

        });
    });
</script>

自动补全代码:

<script type="text/javascript">
    $(function () {
        SearchText();
    });
    function SearchText() {
        $(".autosuggest").autocomplete({
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "Default.aspx/GetAutoCompleteData",
                    data: "{'value':'" + $('#txtSearch').val() + "'}",
                    dataType: "json",
                    success: function (data) {
                        if (data.d.length > 0) {
                            response($.map(data.d, function (item) {
                                return {
                                    label: item.split('/')[0],
                                    val: item.split('/')[1]
                                }
                            }));
                        }
                        else {
                            response([{ label: 'No Records Found', val: -1 }]);
                        }
                    },
                    error: function (result) {
                        alert("Error");
                    }
                });
            },
        });
    }
</script>

ASPX:

<asp:HiddenField ID="hdnSearchParam" runat="server" />
<div class="col-xs-8">
    <div class="input-group">
        <div class="input-group-btn search-panel">
            <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
                <span id="search_concept">Filter by</span> <span class="caret"></span>
            </button>

            <ul class="dropdown-menu" role="menu">
                <li><a href="#UserID">User ID</a></li>
                <li><a href="#TypeName">User Type</a></li>
                <li><a href="#UserName">User Name</a></li>
                <li><a href="#FirstName">First Name</a></li>
                <li><a href="#LastName">Last Name</a></li>
                <li><a href="#Email">Email</a></li>
            </ul>


        </div>
        <input type="hidden" name="search_param" value="all" id="search_param">
        <asp:TextBox ID="txtSearch" CssClass="autosuggest form-control"  runat="server"></asp:TextBox>

        <span class="input-group-btn"></span>
    </div>
</div>

【问题讨论】:

  • 您是否尝试将隐藏文本“hdnSearchParam”的值传递给网络方法“GetAutoCompleteData”?
  • 是的,我就是这个意思
  • 为什么在下拉列表中使用 href?
  • 获取选定的搜索字段
  • 为什么不用html select?

标签: c# asp.net


【解决方案1】:

您的页面有几个问题。

首先,您为什么要为此使用隐藏字段?为什么不直接将下拉值作为 Ajax 请求中的第二个参数传递?

其次,在您后面的代码中,您仅在页面加载时读取隐藏值,并且该值永远不会随着每个 Ajax 请求而更新(Page_Load 不会再次执行)。您使用 hdnvalue 制作了 static 技巧只是为了使其编译,但它不起作用。此外,将其设为静态可以在所有使用该页面的 Web 客户端之间共享

第三,为什么要将下拉值也存储在其 href 中?您可以使用 span 甚至是简单的文本。

第四,您使用的是服务器控件标记 ID 而不是 ClientID,这可能因您使用的 .NET 框架而异。更好地保持安全并始终使用ClientID

第五,如果使用jQuery你通过ID选择,只需使用ID,不需要使用任何其他类选择器。当然,你不应该有重复的 ID!

第六,不能使用参数化变量作为列名。您必须使用动态查询。有关here 的更多信息。此外,阅读器工作不正常(仅添加隐藏字段),最好将 ExecuteReader 包含在 using 块中。

总结一下,用这个:

protected void Page_Load(object sender, EventArgs e)
{
}

[WebMethod]
public static List<string> GetAutoCompleteData(string value, string filterBy)
{
    string strConnString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(strConnString))
    {
        con.Open();
        string command = string.Format("select {0} from Users where {0} LIKE '%'+@SearchText+'%'", filterBy);
        using (SqlCommand cmd = new SqlCommand(command, con))
        {
            cmd.Parameters.AddWithValue("@SearchText", value);

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                List<string> result = new List<string>();
                while (dr.Read())
                {
                    result.Add(dr.GetString(0));
                }
                return result;
            }
        }
    }
}


<script type="text/javascript">
    $(document).ready(function (e) {
        $('.search-panel .dropdown-menu').find('a').click(function (e) {
            e.preventDefault();
            var concept = $(this).text();
            $('#search_concept').text(concept);
        });
    });
</script>

重要提示:如果您害怕 SQL 注入,您可能需要先使用filterBy 进行一些验证。

在您的 Javascript 中,仅修复此行:

 data: "{'value':'" + $('#<%= txtSearch.ClientID %>').val() + "','filterBy':'" + $('#search_concept').text() + "'}",

最后,去掉两个隐藏字段(用户控件和 html 控件)。

【讨论】:

    【解决方案2】:

    尝试将数据参数更改为:

    data: "{'value':'" + $('#hdnSearchParam').val() + "'}",
    

    【讨论】:

    • 如果我更改了它,它将采用 hdnSearchParam 值,如 userid 它不会采用用户输入权
    • 尝试更改您的值以删除 runat="server", 并将 .search-panel 点击事件中的代码更改为 $( '#hdnSearchParam').val(param);
    【解决方案3】:

    尝试从这行代码中删除美元符号。

     $('[id$=hdnSearchParam]').val(param);
    

    应该是这样的:

    $('[ID="hdnSearchParam"]').val(param);
    

    【讨论】:

    • 他们的 java 脚本代码没有问题,我使用了警报函数,它传递了值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多