传递隐藏字段值的问题

时间:2016-06-25 02:29:17

标签: c# asp.net

我正在尝试将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>

3 个答案:

答案 0 :(得分:1)

您的信息页有几个问题。

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

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

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

第四,您使用的是服务器控件标记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控件)。

答案 1 :(得分:0)

尝试将数据参数更改为:

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

答案 2 :(得分:-1)

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

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

它应该是这样的:

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