2016-06-25 65 views
0

我試圖將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 '%'[email protected]+'%'", 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

你是否試圖將隱藏文本「hdnSearchParam」的值傳遞給Web方法「GetAutoCompleteData」? –

+0

是的,這正是我的意思 – Ayman

+0

爲什麼你在你的下拉列表中使用href? –

回答

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 '%'[email protected]+'%'", 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

嘗試刪除從該行代碼的美元符號。

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

應該smthing這樣的:

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

他們沒有問題與Java腳本代碼我使用警報功能,它通過值 – Ayman

0

嘗試將數據參數改成這樣:

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

如果我改變它將需要像userid hdnSearchParam值它不會採取用戶輸入權 – Ayman

+0

嘗試更改您的值以刪除runat =「服務器」, 並將.search-panel click事件中的代碼更改爲$('#hdnSearchParam')。val(param); –