2008-10-07 28 views
5

Tôi có CheckBoxList này trên một trang:Giá trị DataValueField cho một CheckBoxList được lưu trữ ở đâu?

<asp:checkboxlist runat="server" id="Locations" datasourceid="LocationsDatasource" 
    datatextfield="CountryName" datavaluefield="CountryCode" /> 

Tôi muốn lặp qua các yếu tố ô trống trên máy khách sử dụng Javascript và lấy giá trị của mỗi hộp kiểm tra, nhưng các giá trị dường như không được có sẵn ở phía khách hàng. Sản lượng HTML trông như thế này:

<table id="ctl00_Content_Locations" class="SearchFilterCheckboxlist" cellspacing="0" cellpadding="0" border="0" style="width:235px;border-collapse:collapse;"> 
<tr> 
    <td><input id="ctl00_Content_Locations_0" type="checkbox" name="ctl00$Content$Locations$0" /><label for="ctl00_Content_Locations_0">Democratic Republic of the Congo</label></td> 
</tr><tr> 
    <td><input id="ctl00_Content_Locations_1" type="checkbox" name="ctl00$Content$Locations$1" /><label for="ctl00_Content_Locations_1">Central African Republic</label></td> 
</tr><tr> 
    <td><input id="ctl00_Content_Locations_2" type="checkbox" name="ctl00$Content$Locations$2" /><label for="ctl00_Content_Locations_2">Congo</label></td> 
</tr><tr> 
    <td><input id="ctl00_Content_Locations_3" type="checkbox" name="ctl00$Content$Locations$3" /><label for="ctl00_Content_Locations_3">Cameroon</label></td> 
</tr><tr> 
    <td><input id="ctl00_Content_Locations_4" type="checkbox" name="ctl00$Content$Locations$4" /><label for="ctl00_Content_Locations_4">Gabon</label></td> 
</tr><tr> 
    <td><input id="ctl00_Content_Locations_5" type="checkbox" name="ctl00$Content$Locations$5" /><label for="ctl00_Content_Locations_5">Equatorial Guinea</label></td> 
</tr> 

Các giá trị ("cd", "cg", "ga", vv) là hư không để được tìm thấy. Họ ở đâu? Thậm chí có thể truy cập chúng trên máy khách hay tôi có cần tự xây dựng danh sách hộp kiểm này bằng bộ lặp hay cái gì đó không?

Trả lời

2

Được lưu trữ trong ViewState, bạn không thể truy cập chúng trên ứng dụng khách mà không cần some hacking.

+0

Cảm ơn. Tôi đoán tôi sẽ chỉ cần xây dựng danh sách kiểm tra với một bộ lặp. –

-1

Tôi đã tìm kiếm điều này trước đây và bạn có thể gần chút may mắn. Tôi nghĩ rằng tôi nhớ thấy rằng không có một mục danh sách hộp kiểm cho javascript, do đó, nó không hiểu nó. Bạn sẽ phải tìm kiếm các mục trên trang có loại hộp kiểm và kiểm tra xem nhóm nào (tôi nghĩ đó là thuộc tính) mà nó thuộc về.

tôi sẽ tìm kiếm mã của tôi và xem nếu tôi có thể tìm thấy những gì tôi đã làm ...


Tất nhiên, tôi không thể tìm thấy những gì tôi đã làm.

Tại sao bạn làm điều đó phía máy khách trong javascript? Tại sao bạn không làm một số AJAX và kiểm soát tất cả mọi thứ phía máy chủ?

+0

FYI: Java và JavaScript không giống nhau, chúng hoàn toàn là các ngôn ngữ khác nhau. –

+0

Đây không phải là câu trả lời, mà là một ý kiến. Cần được loại bỏ. – Fandango68

2

Để tránh hack danh sách hộp chỉ cần sử dụng một repeater như vậy:

<asp:Repeater ID="rptItems" runat="server" DataSourceID="odsDataSource"> 
<ItemTemplate> 
<input id="iptCheckBox" type="checkbox" runat="server" value='<%# Eval("Key") %>'><%# Eval("Value") %></input> 
</ItemTemplate> 
</asp:Repeater> 
6
<body> 
    <form id="form1" runat="server"> 
      <div> 
       <asp:CheckBoxList ID="CheckBoxList1" runat="server" DataTextField="tx" DataValueField="vl"> 
       </asp:CheckBoxList> 
      </div> 
      <input id="Button1" type="button" value="button" onclick="return Button1_onclick()" /> 
    </form> 
</body> 
<script type="text/javascript"> 

function Button1_onclick() 
{ 
var itemarr = document.getElementById("CheckBoxList1").getElementsByTagName("span"); 
var itemlen = itemarr.length; 
    for(i = 0; i <itemlen;i++) 
    { 
      alert(itemarr[i].getAttribute("dvalue")); 
    } 
return false; 
} 


</script> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("tx"); 
     dt.Columns.Add("vl"); 
     DataRow dr = dt.NewRow(); 
     dr[0] = "asdas"; 
     dr[1] = "1"; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr[0] = "456456"; 
     dr[1] = "2"; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr[0] = "yjryut"; 
     dr[1] = "3"; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr[0] = "yjrfdgdfgyut"; 
     dr[1] = "3"; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr[0] = "34534"; 
     dr[1] = "3"; 
     dt.Rows.Add(dr); 
     CheckBoxList1.DataSource = dt; 
     CheckBoxList1.DataBind(); 
     foreach (ListItem li in CheckBoxList1.Items) 
     { 
      li.Attributes.Add("dvalue", li.Value); 
     } 
    } 
} 
0

Swapna, câu trả lời của bạn hoàn toàn hoạt động. Vì vậy, để kiểm tra xem hộp kiểm trong ASP.Net CheckBoxList được kiểm tra và sau đó tích lũy trong danh sách như là một chuỗi dấu phẩy phân cách, bạn có thể làm như

C# Code-đằng sau

ChkboxList1.DataSource = dsData; 
ChkboxList1.DataTextField = "your-display-column-name"; 
ChkboxList1.DataValueField = "your-identifier-column-name"; 
ChkboxList1.DataBind(); 

foreach (ListItem li in ChkboxList1.Items) 
{ 
    li.Attributes.Add("DataValue", li.Value); 
} 

Sau đó, trong javascript làm

var selValues = ""; 
var ChkboxList1Ctl = document.getElementById("ChkboxList1"); 
var ChkboxList1Arr = null; 
var ChkboxList1Attr= null; 

if (ChkboxList1Ctl != null) 
{ 
    ChkboxList1Arr = ChkboxList1Ctl.getElementsByTagName("INPUT"); 
    ChkboxList1Attr = ChkboxList1Ctl.getElementByTagName("span"); 
} 
if (ChkboxList1Arr != null) 
{ 
    for (var i = 0; i < ChkboxList1Arr.length; i++) 
    { 
     if (ChkboxList1Arr[i].checked) 
      selValues += ChkboxList1Attr[i].getAttribute("DataValue") + ","; 
    } 
    if (selValues.length > 0) 
     selValues = selValues.substr(0, selValues.length - 1); 
} 
2

Đã phải làm điều gì đó thực sự khó chịu để có được điều này để làm việc ..

 <asp:Repeater ID="rptItems" runat="server"> 
      <ItemTemplate> 
       <input ID="iptCheckBox" type="checkbox" runat="server" value='<%# Eval("your_data_value") %>' /> 
       <label ID="iptLabel" runat="server"><%# Eval("your_data_field") %></label> 
       <br /> 
      </ItemTemplate> 
     </asp:Repeater> 

codebehind:

Private Sub rptItems_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptItems.ItemDataBound 
    Dim checkBox As HtmlInputCheckBox = DirectCast(e.Item.FindControl("iptCheckBox"), HtmlInputCheckBox) 
    Dim label As HtmlControl = DirectCast(e.Item.FindControl("iptLabel"), HtmlControl) 

    label.Attributes.Add("for", checkBox.ClientID) 
End Sub 
15

cuối cùng tôi đã có câu trả lời tôi đã tìm kiếm!

Điều khiển danh sách kiểm tra asp.net hiện trong thực tế làm cho thuộc tính giá trị thành HTML - nó đã hoạt động cho tôi trong một trang web sản xuất trong hơn một năm nay!(Chúng tôi luôn có EnableViewState tắt cho tất cả các trang web của chúng tôi và nó vẫn hoạt động, mà không cần bất kỳ điều chỉnh hoặc hack)

Tuy nhiên, tất cả các hộp kiểm tra CheckboxList không còn được hiển thị thuộc tính giá trị của chúng trong HTML! WTF bạn nói? Chúng tôi cũng vậy! Phải mất một lúc để tìm ra điều này, nhưng vì nó đã được làm việc trước đây, chúng tôi biết phải có một lý do. Lý do là một sự thay đổi ngẫu nhiên đối với web.config của chúng tôi!

<pages controlRenderingCompatibilityVersion="3.5"> 

Chúng tôi đã xóa thuộc tính này khỏi phần cấu hình trang và đã thực hiện thủ thuật!

Tại sao lại như vậy? Chúng tôi đã phản ánh mã cho kiểm soát CheckboxList và tìm thấy điều này trong phương thức RenderItem:

if (this.RenderingCompatibility >= VersionUtil.Framework40) 
{ 
    this._controlToRepeat.InputAttributes.Add("value", item.Value); 
} 

Các anh chị em thân yêu nhất đừng thất vọng! TẤT CẢ các câu trả lời tôi đã tìm kiếm ở đây trên Stackexchange và phần còn lại của trang web đã cung cấp thông tin sai lệch! Tính đến Net 4,0 asp.net ám chỉ rằng thuộc tính giá trị của các hộp kiểm của một CheckBoxList:

<input type="checkbox" value="myvalue1" id="someid" /> 

Có lẽ không thực tế hữu ích, Microsoft đã cho bạn khả năng thêm một "controlRenderingCompatibilityVersion" vào web.config của bạn để tắt chức năng này tắt bằng cách đặt thành phiên bản thấp hơn 4, cho mục đích của chúng tôi là hoàn toàn không cần thiết và thực tế có hại, vì mã javascript dựa vào thuộc tính giá trị ...

Chúng tôi đã nhận được chk.val() bằng "bật" cho tất cả các hộp kiểm của chúng tôi, đó là những gì ban đầu đã cảnh báo cho chúng tôi về vấn đề này ngay từ đầu (sử dụng jquery.val() nhận giá trị của hộp kiểm. Bật "on" là giá trị của hộp kiểm được chọn ... Tìm hiểu một số điều mỗi ngày).

+0

XIN VUI LÒNG không yêu cầu mọi người bỏ phiếu/chấp nhận câu trả lời của bạn. [Bài đăng meta liên quan đến gắn cờ các nhận xét đó] (http://meta.stackexchange.com/questions/167155/comments-asking-for-upvotes) –

+2

Tôi biết đây là câu hỏi cũ, nhưng được lưu trên đầu của tôi. Tôi đã rách tóc trong 4 giờ vì điều này. Nhờ sự thay đổi nhỏ bé này, mọi thứ đều hoạt động. Đây là câu trả lời tốt nhất cho câu hỏi này! – Misiu

+1

không loại bỏ thuộc tính controlRenderingCompatibilityVersion có bất kỳ tác dụng phụ nào trên các thành phần .NET khác không? –

0

Xóa <pages controlRenderingCompatibilityVersion="3.5"> đã gây ra sự cố ở một số mã cũ mà tôi đang thực hiện. Tôi đã nhận được this error. Một khi tôi nhận được lỗi đó, tôi nhận ra rằng nó quá mạo hiểm với một sự thay đổi.

Để sửa lỗi này, tôi đã kết thúc kéo dài CheckBoxList và trọng phương pháp Render để thêm một thuộc tính bổ sung có chứa các giá trị cho mỗi mục:

public class CheckBoxListExt : CheckBoxList 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     foreach (ListItem item in this.Items) 
     { 
      item.Attributes.Add("data-value", item.Value); 
     } 

     base.Render(writer); 
    } 
} 

Điều này sẽ làm cho thuộc tính data-value trên ngoài span thẻ.

0
Easy Way I Do It. 

//First create query directly From Database that contains hidden field code format (i do it in stored procedure) 

SELECT Id,Name + '<input id="hf_Id" name="hf_Id" value="'+convert(nvarchar(100),Id)+'" type="hidden">' as Name FROM User 

//Then bind checkbox list as normally(i bind it from dataview). 

cbl.DataSource = dv; 
cbl.DataTextField = "Name"; 
cbl.DataValueField = "Id"; 
cbl.DataBind(); 

//Then finally it represent code as follow. 

<table id="cbl_Position" border="0"> 
<tbody> 
<tr> 
<td> 
<input id="cbl_0" name="cbl$0" type="checkbox"> 
<label for="cbl_0"> 
ABC 
<input id="hf_Id" name="hf_Id" value="1" type="hidden"> 
</label> 
</td> 
</tr> 
</table> 

This way you can get DataValueField as inside hiddenfield and also can get it value from client side using javascript. 
Các vấn đề liên quan