我正在尝试将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>
答案 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);