ASP.NET RadioButton возиться с именем (имя группы) - PullRequest
35 голосов
/ 18 декабря 2008

Я получил шаблонный элемент управления (повторитель), в котором перечислены некоторые тексты и другая разметка. С каждым элементом связан радиокнопка, позволяющая пользователю выбрать ОДИН из элементов, созданных ретранслятором.

Повторитель записывает радиокнопку, устанавливая ее идентификатор и имя, сгенерированные в соответствии с соглашением об именах ASP.NET по умолчанию, делая каждую радиокнопку полной группой. Это означает, что все радиокнопки независимы друг от друга, что, к сожалению, означает, что я могу выбрать все радиокнопки одновременно. Радиокнопка имеет умный атрибут «имя группы», используемый для установки общего имени, поэтому они группируются вместе и, следовательно, должны быть зависимыми (поэтому я могу выбрать только одно за раз). Проблема в том, что это не работает, ретранслятор удостоверяется, что идентификатор и, следовательно, имя (которое управляет группировкой) различаются.

Поскольку я использую ретранслятор (это мог быть просмотр списка или любой другой шаблонный элемент управления с привязкой к данным), я не могу использовать RadioButtonList. Так, где это оставляет меня?

Я знаю, у меня была эта проблема раньше, и я решил ее. Я знаю, что почти каждый программист ASP.NET должен был иметь его, так почему я не могу найти Google и найти надежное решение проблемы? Я столкнулся с решениями для принудительной группировки с помощью JavaScript (некрасиво!) Или даже для обработки радиокнопок как несерверных элементов управления, что заставило меня сделать Request.Form[name] для чтения статуса. Я также попытался поэкспериментировать с переопределением атрибута имени в событии PreRender - к сожалению, страница-владелец и главная страница снова переопределяют это имя, чтобы отразить полное имя / имя, поэтому я получаю тот же неправильный результат.

Если у вас нет лучшего решения, чем то, что я написал, вы все равно можете поделиться своими мыслями - по крайней мере, я буду знать, что мой друг «Джек» прав насчет того, как иногда портится ASP.NET;)

Ответы [ 14 ]

1 голос
/ 03 февраля 2011

Я также был озадачен этой ошибкой и решил просто отбросить ретранслятор в пользу динамического построения таблицы с элементами управления внутри. В вашем пользовательском элементе управления или на вашей странице просто добавьте следующие элементы:

<asp:Table ID="theTable" runat="server">
    <asp:TableHeaderRow runat="server">
        <asp:TableHeaderCell runat="server" Text="Column 1"/>
        <asp:TableHeaderCell runat="server" Text="Column 2"/>
        <asp:TableHeaderCell runat="server" Text="Column 3"/>
    </asp:TableHeaderRow>
</asp:Table>

Затем добавьте строки данных в коде с помощью переключателей и других необходимых элементов управления. Конечно, вы можете сделать то же самое с другими элементами, такими как DIV:

<div runat="server" ID=theDiv">
</div>

Но давайте все же надеемся, что команда ASP.NET найдет способ исправить эту неудачную проблему с помощью повторителей и списков. Мне все еще нравится управление повторителем, и я использую его всегда, когда это возможно.

0 голосов
/ 04 января 2017

Я использовал ту же технику, чтобы снять отметку с другого радио с помощью jquery, пожалуйста, найдите ниже код

<asp:RadioButton ID="rbSelectShiptoShop" runat="server" onchange="UnCheckRadio(this);" CssClass="radioShop" />

и скрипт ниже

function UnCheckRadio(obj) {
           $('.radioShop input[type="radio"]').attr('checked', false);
           $(obj).children().attr('checked', true);
       }
0 голосов
/ 10 февраля 2016

Пользовательский элемент управления / переопределение для обхода метода HtmlInputControl.RenderAttributes() путем игнорирования свойства RenderedNameAttribute:

/// <summary>
/// HACK:  For Microsoft&apos;s bug whereby they mash-up value of the "name" attribute.
/// </summary>
public class NameFixHtmlInputRadioButton : HtmlInputRadioButton
{
    protected override void RenderAttributes(HtmlTextWriter writer)
    {
        // BUG:  Usage of 'HtmlInputControl.RenderedNameAttribute'
        // writer.WriteAttribute("name", this.RenderedNameAttribute);
        writer.WriteAttribute(@"name", Attributes[@"Name"]);

        Attributes.Remove(@"name");

        var flag = false;
        var type = Type;

        if (! string.IsNullOrEmpty(type))
        {
            writer.WriteAttribute(@"type", type);
            Attributes.Remove(@"type");
            flag = true;
        }

        base.RenderAttributes(writer);

        if (flag && DesignMode)
        {
            Attributes.Add(@"type", type);
        }

        writer.Write(@" /");
    }
}
0 голосов
/ 18 марта 2010

Возможно, это не идеальное решение для всех, но я сделал следующее, используя jQuery.

<asp:RadioButton ID="rbtnButton1" groupName="Group1" runat="server" /> <asp:RadioButton ID="rbtnButton2" groupName="Group1" runat="server" />

etc...

Затем добавьте следующий код на свою главную страницу. (или все ваши страницы)

$(function() {
//This is a workaround for Microsoft's GroupName bug.  
//Set the radio button's groupName attribute to make it work.
$('span[groupName] > input').click(function() {
    var element = this;
    var span = $(element).parent();
    if (element.checked) {
        var groupName = $(span).attr('groupName');
        var inputs = $('span[groupName=' + groupName + '] > input')
        inputs.each(function() {
            if (element != this)
                this.checked = false;
        });
    }
});

});

...