Где хранятся значения DataValueField для CheckBoxList? - PullRequest
5 голосов
/ 08 октября 2008

У меня есть этот CheckBoxList на странице:

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

Я бы хотел пройтись по элементам флажка на клиенте, используя Javascript, и получить значение каждого флажка, но значения, по-видимому, недоступны на стороне клиента. Вывод HTML выглядит следующим образом:

<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>

Значений ("cd", "cg", "ga" и т. Д.) Нигде нет. Где они? Возможно ли получить к ним доступ на клиенте, или мне нужно создать этот список самостоятельно, используя ретранслятор или что-то в этом роде?

Ответы [ 9 ]

15 голосов
/ 22 февраля 2013

У меня наконец-то есть ответ, который я искал!

Элемент управления asp.net CheckboxList действительно фактически отображает атрибут value в HTML - он работает для меня на сайте Production уже более года! (У нас ВСЕГДА отключен EnableViewState для всех наших сайтов, и он все еще работает, без каких-либо настроек или хаков)

Однако внезапно он перестал работать однажды, и наши флажки CheckboxList больше не отображали свой атрибут value в HTML! WTF вы говорите? Мы тоже! Потребовалось время, чтобы понять это, но так как это работало раньше, мы знали, что должна быть причина. Причиной было случайное изменение нашего web.config!

<pages controlRenderingCompatibilityVersion="3.5">

Мы удалили этот атрибут из раздела конфигурации страниц, и это помогло!

Почему это так? Мы отразили код для элемента управления CheckboxList и нашли его в методе RenderItem:

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

Дорогие братья и сестры, не отчаивайтесь! ВСЕ ответы, которые я искал здесь, на Stackexchange, а остальная часть Интернета дали ошибочную информацию! Начиная с .Net 4.0 asp.net отображает атрибут value для флажков CheckboxList:

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

Возможно, практически бесполезно, Microsoft дала вам возможность добавить «controlRenderingCompatibilityVersion» в ваш web.config, чтобы отключить его, установив версию ниже 4, что для наших целей совершенно не нужно и фактически вредно, Код JavaScript основан на атрибуте значения ...

Мы получали chk.val () равным «on» для всех наших флажков, что изначально и предупредило нас об этой проблеме (используя jquery.val (), который получает значение флажка. out "on" - это значение флажка, который отмечен ... Узнайте каждый день).

6 голосов
/ 10 декабря 2009
<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);
        }
    }
}
2 голосов
/ 24 апреля 2012

Нужно было сделать что-то действительно противное, чтобы заставить это работать ..

        <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
2 голосов
/ 21 октября 2008

Чтобы избежать взлома списка флажков, просто используйте ретранслятор как таковой:

<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>
2 голосов
/ 08 октября 2008

Хранится в ViewState, вы не можете получить к ним доступ на клиенте без некоторого взлома .

0 голосов
/ 14 июня 2017
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.
0 голосов
/ 08 февраля 2016

Удаление <pages controlRenderingCompatibilityVersion="3.5"> вызвало проблему в каком-то старом коде, над которым я работал. Я получаю эту ошибку . Получив эту ошибку, я понял, что это слишком рискованно для изменения.

Чтобы исправить это, я в итоге расширил CheckBoxList и переопределил метод Render, чтобы добавить дополнительный атрибут, содержащий значение для каждого элемента списка:

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);
    }
}

Это отобразит атрибут data-value на внешнем теге span.

0 голосов
/ 23 августа 2010

swapna, ваш ответ абсолютно работает. Таким образом, чтобы проверить, установлен ли флажок в ASP.Net Checkboxlist, а затем собрать список в виде строки с разделителями-запятыми, вы можете сделать как

C # Code-behind

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); 
}

Тогда в Javascript сделай

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);
}
0 голосов
/ 08 октября 2008

Я искал это раньше, и вам может быть почти не повезло. Думаю, я помню, что не вижу пункта списка флажков для javascript, поэтому он не понимает этого. Вам нужно будет найти элементы на странице, которые имеют тип флажка, и проверить, к какой группе (я думаю, что это свойство) тоже принадлежит.

Я найду свой код и посмотрю, смогу ли я найти то, что сделал ...


Конечно, я не могу найти то, что сделал.

Почему вы делаете это на стороне клиента в javascript? Почему бы вам не выполнить AJAX и не контролировать все на стороне сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...