Получение значений обратной передачи динамически созданного RadioButtonList не работает - PullRequest
2 голосов
/ 23 декабря 2011

Ситуация следующая: Я создаю опрос, где есть X вопросов, и на каждый вопрос можно ответить с помощью шести вариантов. Поскольку разрешен только один выбор, я использую RadioButtonList, а поскольку есть вопросы X, я использую повторитель ASP.NET для создания RadioButtionList.

ASPX код:

<asp:Repeater runat="server" ID="ActualSurvey">
    <HeaderTemplate>
        <table>
            <tr>
                <th class="headLeftCol leftCol headerCol">
                    Bank
                </th>
                <th class="headerCol">
                    1
                </th>
                <th class="headerCol">
                   2
                </th>
                <th class="headerCol">
                    3
                </th>
                <th class="headerCol">
                   4
                </th>
                <th class="headerCol">
                    5
                </th>
                <th class="headerCol">
                    6
                </th>
            </tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr class="even">
            <td class="leftCol">
                <%# ((ReliabilityMeter.DataAccessLayer.Bank)Container.DataItem).DisplayName %>
            </td>
            <td class="midCol" colspan="6">
                <asp:RadioButtonList ID="rbl1" runat="server" CssClass="radioButtonList" RepeatDirection="Horizontal">
                    <asp:ListItem data-rating="1" />
                    <asp:ListItem data-rating="2"/>
                    <asp:ListItem data-rating="3"/>
                    <asp:ListItem data-rating="4"/>
                    <asp:ListItem data-rating="5"/>
                    <asp:ListItem data-rating="6" Selected="True" />
                </asp:RadioButtonList>
            </td>
        </tr>
    </ItemTemplate>
    <AlternatingItemTemplate>
        <tr class="odd">
            <td class="leftCol">
                <%# ((ReliabilityMeter.DataAccessLayer.Bank)Container.DataItem).DisplayName %>
            </td>
            <td class="midCol" colspan="6">
                <asp:RadioButtonList ID="rbl2" runat="server" CssClass="radioButtonList" RepeatDirection="Horizontal">
                    <asp:ListItem data-rating="1"/>
                    <asp:ListItem data-rating="2"/>
                    <asp:ListItem data-rating="3"/>
                    <asp:ListItem data-rating="4"/>
                    <asp:ListItem data-rating="5"/>
                    <asp:ListItem data-rating="6" Selected="True" />
                </asp:RadioButtonList>
            </td>
        </tr>
    </AlternatingItemTemplate>
</asp:Repeater>
<tr class="footerRow">
    <td colspan="7">
        <asp:Button ID="SubmitButton" runat="server" Text="Insturen" OnClick="SubmitButton_Click" />
    </td>
</tr>
</table>

Когда я отправляю сообщение, я получил следующий код: Код C # позади

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ActualSurvey.DataSource = new BankManager().GetBanks();
            ActualSurvey.DataBind();
        }
    }

protected void SubmitButton_Click(object sender, EventArgs e)
    {
        //Check if the page is valid and the request is valid
        if (Page.IsValid && IsValidRequest)
        {
            //Iterate through each repeater item to find the RadioButtonList
            foreach (RepeaterItem repeaterItem in ActualSurvey.Items)
            {
                var bank = repeaterItem.DataItem as Bank;
                RadioButtonList radioButtons = repeaterItem.Controls.FindControl<RadioButtonList>();
                var rating = FindRating(radioButtons);
            }
        }
    }

При SubmitButton_Click ActualSurvey.Items заполнен, но пуст внутри, я думаю, что он имеет какое-то отношение к странице Lifecylebut. Я не могу понять это ... Также Page.Request.Forms не содержит значений.

Любая помощь будет оценена.

С уважением

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Ваши определения ListItem кажутся мне странными.

<asp:ListItem data-rating="1"/>
<asp:ListItem data-rating="2"/>

Вы пытались изменить их, как показано ниже

<asp:ListItem Value="1"/>
<asp:ListItem Value="2"/>
0 голосов
/ 23 декабря 2011

DataItem действителен только до визуализации элементов, например, в событии DataBinding. После обратной отправки репитер восстанавливает содержимое из ViewState.

Один из способов сохранить это свойство действительным - выполнить привязку данных в событии Repeater.Init

ASPX:

<asp:Repeater runat="server" ID="ActualSurvey" OnInit="ActualSurvey_Init"> 
 ...
</asp:Repeater>

....

CS:

void ActualSurvey_Init(object sender, EventArgs e)
{
      object banks = Cache["ActualSurvey_Banks"];
      if (banks == null)
      {
         banks = new BankManager().GetBanks();
         Cache.Insert("ActualSurvey_Banks", banks);
      }

      ActualSurvey.DataSource = banks;
      ActualSurvey.DataBind(); 
}
...