Радио опция GroupName проблема в динамической загрузке пользовательского элемента управления ASP.net - PullRequest
3 голосов
/ 28 февраля 2011

У меня есть пользовательский элемент управления

<table style="border-width: 0">
    <tr>
        <td style="vertical-align: middle;">
            <asp:RadioButton ID="rdOption" runat="server" Text="I m testing"  
                GroupName="Questions" oncheckedchanged="rdOption_CheckedChanged" 
                AutoPostBack="True"/>
        </td>
        <td style="vertical-align: middle; padding-left: 10px">
            <asp:TextBox ID="txtOthers" runat="server" CssClass="txtbox" Visible="false"></asp:TextBox>
        </td>
    </tr>
</table>

protected void Page_Load(object sender, EventArgs e)
    {
        rdOption.GroupName = "myGroup";
        rdOption.Text = Option.OptionDesc;
    }

на Survery.aspx. Я загружал этот пользовательский элемент управления динамически

 foreach (clsOptions option in _CurrentQuestion.Options)
        {
            UserControls_OptionField ctrl = Page.LoadControl("~/UserControls/OptionField.ascx") as UserControls_OptionField;
            ctrl.Option = option;
            pnlOption.Controls.Add(ctrl);
        }

Проблема заключается в том, что у каждой опции есть имя группы различных элементов, показанное ниже.Вот почему параметры не работают должным образом, и все параметры могут быть выбраны, в то время как в MCQ можно выбрать только один параметр.

<input id="ContentPlaceHolder1_ctl01_rdOption" type="radio" name="ctl00$ContentPlaceHolder1$ctl01$myGroup" value="rdOption">

<input id="ContentPlaceHolder1_ctl02_rdOption" type="radio" name="ctl00$ContentPlaceHolder1$ctl02$myGroup" value="rdOption">

enter image description here

Ответы [ 5 ]

4 голосов
/ 01 марта 2011

Как все советовали, это по замыслу и считается ошибкой позже.

Элемент управления, предложенный Джоэлем, великолепен, за исключением того, что он переопределяет всю логику рендеринга, поэтому любое улучшение в каркасе после записи этого элемента управления не используется.

Итак, я предлагаю заменить метод Render() в другом элементе управления на:

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        using (var stringWriter = new StringWriter())
        using (var htmlWriter = new HtmlTextWriter(stringWriter))
        {
            base.Render(htmlWriter);
            var tagText = stringWriter.ToString();

            tagText = Regex.Replace(tagText, "name=\"(\\S+)\"", "name=\"" + GroupName + "\"");

            writer.Write(tagText);
        }
    }

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

Обратите внимание, что вы можете:

  • Добавьте еще одно свойство в класс, чтобы сделать это другое поведение визуализации необязательным в зависимости от того, установлено ли свойство

  • Сделайте, чтобы все объявления <asp:RadioButton: ссылались на ваши пользовательские элементы управления, не изменяя их, через web.config:

  <system.web>
    <pages>
      <tagMapping>
        <add tagType="System.Web.UI.WebControls.RadioButton" mappedTagType="WebformsLibrary.CustomRadioButton" />
      </tagMapping>
    </pages>
  </system.web>

Где WebformsLibrary.CustomRadioButton - класс.

3 голосов
/ 01 марта 2011

Я думаю, что это ошибка , которая есть в ASP.Net начиная с 1.0 ( офигенно, они совершенно об этом забыли ^^ ).

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

Проблема в том, что ASP.Net отображает разные уникальные имена для разных NamingContainers, и поэтому RadioButtons получают разные имена групп.

http://weblogs.asp.net/joseguay/archive/2008/07/24/having-radiobuttons-on-a-repeater-or-datalist.aspx

Поместите это в раздел HEAD вашей страницы:

function SetUniqueRadioButton(nameregex, current)
{
      re = new RegExp(nameregex);
      for(i = 0; i < document.forms[0].elements.length; i++)
      {
            elm = document.forms[0].elements[i]
            if (elm.type == 'radio')
            {
                  if (re.test(elm.name))
                  {
                          elm.checked = false;
                  }
             }
      }
      current.checked = true;
}

Добавить клиентское событие onclick в RadioButtons с соответствующими параметрами:

string script = "SetUniqueRadioButton('rdOption.*myGroup',this)";
rdOption.Attributes.Add("onclick", script);

[не тестировалось]

0 голосов
/ 25 августа 2016

Я нашел это решение лучше.Это похоже на решение Тима Шмельтера , но я подумал, что будет проще установить имя таким, каким оно должно быть, так что это то, что вы ожидаете, когда используете его или смотрите на него, иВам не нужно вручную устанавливать, проверяется ли каждая радиокнопка при каждом нажатии.

function fixRadioButtons(s, e) {
    var re = /^(?:.*\$)?(.*)$/;
    for (i = 0; i < document.forms[0].elements.length; i++) {
        var elm = document.forms[0].elements[i];
        if (elm.type == 'radio') {
            var match = re.exec(elm.name);
            elm.name = match[1];
        }
    }
}

Затем вызывать функцию обратной передачи через JS - reference

// This code runs a function on postback
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(fixRadioButtons);

И / ИЛИ: в коде (VB.NET) - ссылка

ClientScript.RegisterStartupScript(Me.GetType(), "Javascript", "fixRadioButtons(null, null);", True)

Обратите внимание, что если вы хотите, чтобы он запускался каждый раз, а не только при обратной передаче, то, вероятно, вам нужно будет использовать ClientScript.RegisterStartupScript независимо.

0 голосов
/ 01 марта 2011

Как сказал Тим, это известная ошибка. Вот пользовательский контроль, который наследуется от RadioButton, но решает вашу проблему: http://www.codeproject.com/KB/webforms/How_group_RButtons.aspx.

0 голосов
/ 28 февраля 2011

Вам необходимо установить свойство «GroupName» на каждой из кнопок RadioButton одинаково.

РЕДАКТИРОВАТЬ: Если вы используете .net 4, то я думаю, что использование свойства ClientIDMode для управления идентификаторами будет работать,В противном случае то, что вы делаете, - это известная проблема в asp.net (обычно это проявляется в том, что переключатели переключаются в репитер / список).

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

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