0

Asp.net Web フォームを使用しています。テーブルとコンボ ボックスを含むフォームがあります。コンボ ボックスの選択項目が変わると、テーブルが変わります。コンボ ボックスは asp.net コントロールで、autopostback = true に設定しました。テーブルは asp.net コントロールでもあり、すべてのテーブル セルはサーバー側で作成/レンダリングされます。

ユーザーはテーブルに値を入力し、サーバーに送信します。

私が見つけた問題は、ユーザーがコンボ ボックスの選択した項目を変更すると、テーブルが変更され、Web ページが正しく表示されることです。次に、ユーザーはいくつかの値を入力し、送信をクリックします。サーバー側から取得した値は、ユーザー入力ではなく、テーブルのデフォルト値です。ユーザーが再度送信すると、サーバー側はユーザー入力を取得できます。

この問題を再現するために私が書いたコードを次に示します。デフォルトの Web フォーム プロジェクトを作成し、サイト マスターを継承する新しい Web を追加します。再現するには、次の手順を実行します。 1. ラジオ ボタンを 1 つ選択します。 2. 送信すると、ページの上部に選択内容に関するテキストが表示されます。3. コンボ ボックスの選択を変更します。 4. 別のラジオ ボタンを選択します。 5. 送信すると、バグが見つかります。6. 4 と 5 をやり直すと、テキストが正しいことがわかります。

 <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="PostBackUsingMasterPage.aspx.cs" Inherits="WebFormBug.PostBackUsingMasterPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">

    <asp:DropDownList ID="comboBox" runat="server" AutoPostBack="true" OnSelectedIndexChanged="UpdateTable">
                <asp:ListItem>Apple</asp:ListItem>
                <asp:ListItem>Beet</asp:ListItem>
                <asp:ListItem>Citron</asp:ListItem>

    </asp:DropDownList>
    <asp:Label ID="userInput" runat="server"></asp:Label>
    <asp:Table runat="server" ID="testTable"> </asp:table>
    <asp:Button ID="submit" runat="server" Text="Submit for validation" OnClick="SubmitButton_Click" />
</asp:Content>

aspx.csはこんな感じ

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace WebFormBug
{
    public partial class PostBackUsingMasterPage : Page
    {
        private string _scope; 
        protected void Page_Load(object sender, EventArgs e)
        {
            _scope = comboBox.SelectedValue ?? "Apple";
            PopUpTable(_scope);
        }

        private void PopUpTable(string item)
        {
            testTable.Rows.Clear();
            var row = new TableRow();
            row.Cells.Add(new TableCell {Text = item});
            row.Cells.Add(AddRadioButtons(item));
            testTable.Rows.Add(row);
        }

        private TableCell AddRadioButtons(string name)
        {
            var cell = new TableCell();
            var radioButtons = new HtmlInputRadioButton[5];
            for (var i = 0; i < 3; i++)
            {

                radioButtons[i] = new HtmlInputRadioButton { Name = name, Value = name + " " + i };

                cell.Controls.Add(radioButtons[i]);
                var label = new Label { Text = name + " " + i };
                cell.Controls.Add(label);
            }
            return cell;
        }

        protected void UpdateTable(object sender, EventArgs e)
        {
            PopUpTable(comboBox.SelectedValue);
        }

        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            int valueIndex = 1;
            for (int i = 0; i < testTable.Rows.Count; i++)
            {
                var row = testTable.Rows[i];
                string inputValue = null, inputName = null;
                foreach (var ctrl in row.Cells[valueIndex].Controls)
                {
                    if (ctrl is HtmlInputRadioButton)
                    {
                        var radioInput = (HtmlInputRadioButton) ctrl;
                        if (!radioInput.Checked) continue;
                        inputValue = radioInput.Value;
                        inputName = radioInput.Name;
                        break;
                    }
                }
                if (inputName != null && inputValue != null)
                {
                    userInput.Text = inputName + " " + inputValue;
                }
            }

        }
    }
}
4

3 に答える 3

1

ASP.NET WebForm の準備知識: 動的に追加されたテーブル データがフォーム ポストasp.net テーブルから欠落している 動的に行を追加しているテーブルがポストバック後に残らない. あなたのサンプルがそのケースです - テーブルデータを動的に構成しています。

動的なテーブル データをポスト バックするための解決策は、ページの Load メソッドでポストバックするたびにフォーム データを再作成することです。あなたのサンプルはこれを行っています(PopUpTableメソッドは常に で呼び出されPage_Loadます)。

ただし、テーブルの再作成を行う場所はコード内Page_Loadだけではなく、OnSelectedIndexChangedテーブル データを消去する場所でもあります。実際には、このイベントを登録する必要はありません。

したがって、解決策(コードを画像として添付して申し訳ありませんが、コードの大きなセグメントを添付するのは非常に難しいことがわかりました):

  1. 削除するOnSelectedIndexChanged ここに画像の説明を入力
  2. コードビハインドを次のように変更します。

ここに画像の説明を入力

于 2013-11-05T10:54:41.163 に答える
1

これを試してください:
ページの読み込み中:

if(!IsPostBack)
{
    // set data to table
}
于 2013-11-04T12:09:59.870 に答える
0

ドロップダウンで選択したインデックスを変更するとラジオボタンが更新される updatepanel があると思います。ドロップダウンのイベントハンドラを次のように変更してみてください。

protected void UpdateTable(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        PopUpTable(comboBox.SelectedValue);
    }
}
于 2013-11-05T10:25:00.313 に答える