отключение клиентского режима

У меня такой Repeater

    <asp:Repeater runat="server" DataSourceID="HeaderFooterSqlDataSource">
        <HeaderTemplate>
            <table border="0" width="100%">
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td>
            <input runat="server" id="SelectRadio" type="radio" 
 name="HeaderFooter" onclick='SelectAndSetHeaderFooter(this);" %>' />
                </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>

Теперь, когда этот Repeater визуализируется, атрибут name моего input radio "SelectRadio" генерируется автоматически, но атрибут name для всех радиокнопок в моем репитере должен быть таким же, чтобы они могли работать как группа и автоматически проверяться / сниматься с отметки в соответствии с другими элементами в этой группе , Так как я могу побороть эту ситуацию ??

Изменить

Я получил решение самостоятельно. На самом деле я определил свой входной радиоуправление как runat="server", потому что думал, что иначе Eval() привязка не будет работать, но я ошибался Eval() привязка работает без runat="server", поэтому, когда я удаляю это имя атрибута, не создается автоматически и теперь все хорошо, но спасибо всем за то, что уделили время моему вопросу.


person yogi    schedule 03.07.2012    source источник


Ответы (4)


Вместо взлома вы должны использовать встроенный RaidoButtonList.

<asp:RadioButtonList id="RadioButtonList1" runat="server">
    <asp:ListItem>Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
    <asp:ListItem>Item 4</asp:ListItem>
    <asp:ListItem>Item 5</asp:ListItem>
    <asp:ListItem>Item 6</asp:ListItem>
</asp:RadioButtonList>
person Candide    schedule 03.07.2012
comment
На самом деле мне не нужно показывать только текст рядом с переключателем, у меня есть больше столбцов в этом Repeater, которые я здесь не размещал, In Short Repeater обязательно. - person yogi; 03.07.2012

Вы хотите изучить элемент управления asp:RadioButton (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.radiobutton.aspx).

В частности, свойство GroupName этого элемента управления может использоваться для «указания группы переключателей для создания взаимоисключающего набора элементов управления».

Итак, грубо говоря:

<asp:RadioButton runat="server" id="SelectRadio"
 GroupName="HeaderFooter" %>' />

Изменить: Похоже, что в этой конкретной ситуации GroupName не выполняет то, для чего она предназначена. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.radiobutton.groupname.aspx обсуждает это в конце сообщества, но все сводится к тому, что текущий NamingContainer используется как часть его имя, а не просто использовать имя группы, которое вы ему дали. Спасибо таинственному пользователю 1429080 за то, что обратил на это мое внимание в комментариях.

person Chris    schedule 03.07.2012
comment
В репитере работать не будет. Повторитель будет генерировать новое имя для каждой радиокнопки. - person user1429080; 03.07.2012
comment
Если выбрано GroupName, оно должно использовать одно и то же имя для всех из них. Подтвердили ли вы описываемое поведение? Похоже, у вас могут возникнуть проблемы, если они не являются дочерними элементами одного и того же контейнера именования, но в приведенном выше примере это должно работать, потому что GroupName проверяется во внутреннем свойстве UniqueGroupName Radiobutton, где генерируется входное имя. - person Chris; 03.07.2012
comment
Шаблон элемента репитера - это контейнер именования. Я протестировал его, и он действительно генерирует новое имя для каждого переключателя. Я думаю, что это неправильно, но это то, что он делает ... - person user1429080; 03.07.2012
comment
О Конечно. Я думал, что повторитель будет шаблоном именования, и забыл, что это будет шаблон элемента. Глупый я. Должен признаться, я очень удивлен, что он вообще использует имя контейнера именования, поскольку это действительно противоречит его сути, но вы правы, что в данном случае это не сработает. Интересно, считается ли это известной ошибкой ... - person Chris; 03.07.2012

Причина, по которой ваши переключатели не работают как группа, заключается в том, что у вас есть runat = "server", что приведет к добавлению атрибутов name и id с идентификаторами родителей. Следующее приведет к тому, что переключатели будут работать как единая группа (обратите внимание на отсутствие runat = "server"):

код ascx:

<asp:Repeater ID="uxRadioSelections" runat="server">
        <HeaderTemplate>
          <table border="0" width="300px">
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
              <td>
                <input type="radio" value='<%# Eval("Name") %>' name="HeaderFooter" onclick="alert(this.value);"><%# Eval("Name") %></input>
              </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
          </table>
        </FooterTemplate>
    </asp:Repeater>

код позади:

protected void Page_Load(object sender, EventArgs e)
{
   string[] names = new string[] {"Alvin", "Simon", "Theodore"};
   uxRadioSelections.DataSource = names.Select(x => new { Name = x });
   uxRadioSelections.DataBind();
}

Однако следующие группы НЕ будут работать как сплоченная группа:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    Test
    <asp:Repeater ID="uxRadioSelections" runat="server">
        <HeaderTemplate>
          <table border="0" width="300px">
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
              <td>
                  <asp:RadioButton Text='<%#Eval("Name") %>' runat="server" />
              </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
          </table>
        </FooterTemplate>
    </asp:Repeater>
</asp:Content>

Из-за упомянутых вами соглашений об именах эти отдельные переключатели не найдут друг друга. ASP.NET использует RadioButtonLists, чтобы преодолеть это:

код ascx:

<asp:RadioButtonList ID="uxRadioButtons" runat="server">
</asp:RadioButtonList>

код позади:

    protected void Page_Load(object sender, EventArgs e)
    {
        string[] names = new string[] {"Alvin", "Simon", "Theodore"};
        uxRadioButtons.DataTextField = "Name";
        uxRadioButtons.DataValueField = "Name";
        uxRadioButtons.DataSource = names.Select(x => new { Name = x });
        uxRadioButtons.DataBind();
    }

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

person Jaime Torres    schedule 03.07.2012
comment
Я думаю, вы поняли здесь, что атрибут NAME моего входного радиоуправления генерируется автоматически, потому что он находится в элементе управления привязкой данных (Repeater), из-за чего все экземпляры этого радиоуправления получают уникальное имя, поэтому из-за этой уникальности они Я не веду себя как группа, и я могу проверять несколько переключателей за раз, что неправильно, потому что я хочу, чтобы один переключатель переключался за раз, что является нормальным поведением. - person yogi; 03.07.2012
comment
Это не то поведение, которое вы должны испытывать. Имя / идентификатор генерируется только для элементов управления на основе runat = server, клиентские элементы управления (например, ‹input type = radio /›) не обрабатываются таким же образом и, таким образом, останутся сгруппированными, как вы закодировали. Если вы удалите runat = server в своем примере, ваш код будет работать как группа. Если вам нужна серверная обработка вашего выбора, но все же нужна гибкость, могу ли я предложить либо вызовы jQuery ajax, либо __doPostBacks старой школы? - person Jaime Torres; 03.07.2012
comment
Обновленный ответ, чтобы уточнить для будущих пользователей. Рад, что вы сами нашли решение. - person Jaime Torres; 03.07.2012
comment
@JTorres: Чтобы исправить ваш комментарий, ASP.NET использует RadioButtonLists, чтобы преодолеть это: это не совсем так. RadioButtonLists - это один из способов сделать это, но RadioButton вполне способны сделать это сами, просто используя имя группы. Я бы предположил, что различия в том, что при использовании GroupName переключатели не обязательно должны быть рядом друг с другом, тогда как я ожидал бы, что RadioButtonList будет иметь более приятные способы поиска выбранной радиокнопки без необходимости запрашивать их все ... - person Chris; 03.07.2012
comment
@Chris Возможно, я мог бы быть более ясным, но то, о чем я имел в виду, создавало группу радиокнопок на основе одного источника данных, поскольку это казалось обязательным. Насколько мне известно, RadioButtonList - единственный способ сделать это с помощью элементов управления OOTB. - person Jaime Torres; 03.07.2012
comment
@JTorres: Я не понимаю, почему вы не могли сделать это с помощью элемента управления RadioButton. Вы просто помещаете элемент управления radioButton, как в своем втором имени, но вставляете GroupName="LinkedButtons", и все элементы управления будут иметь это имя группы и, следовательно, иметь необходимое взаимоисключающее свойство. - person Chris; 03.07.2012
comment
Комментарии к моему ответу объяснили, почему это на самом деле не работает, несмотря на то, что документация предполагает, что это, вероятно, должно быть. :( - person Chris; 03.07.2012

Другой вариант - установить ClientIDMode как «статический», который установит его значение равным указанному идентификатору. Поскольку это элемент управления повторителем, все сгенерированные элементы будут иметь один и тот же сгенерированный идентификатор. Итак, вы просто устанавливаете:

<asp:RadioButton runat="server" id="SelectRadio" GroupName="HeaderFooter" ClientIDMode="static">' />

Это означает, что для всех сгенерированных элементов управления будет указан один и тот же идентификатор, то есть «SelectRadio». Это может быть или не быть проблемой, и вы должны быть осторожны, чтобы это было именно то, что вам нужно.

Замечу, что ClientIDMode - это функция ASP.Net 4.0. Дополнительная информация здесь: ClientIDMode в ASP.NET 4.0 и здесь: MSDN. Надеюсь, это поможет.

Обновление 1. Вы можете получить больше информации из этот вопрос, заданный ранее на StackOverflow. (Хотя это jQuery).

person Wilbur Omae    schedule 12.03.2017