c#asp web应用中视图状态下动态元素表的存储/恢复

c#asp web应用中视图状态下动态元素表的存储/恢复,c#,asp.net,C#,Asp.net,我对具有动态内容的web应用程序的概念很陌生。 我正在创建一个简单的应用程序,它从数据库中获取信息(测试步骤),并将行添加到表中(每行包含两个标签、两个单选按钮和文本字段) 它的工作原理如下: 1.我有一个带有文本框和按钮的页面, 2.我输入测试ID来检索测试步骤,然后单击submit按钮 3.根据步骤数,我为每个步骤向表中添加一行,因此我的表如下所示: [Label.text="Step1"][RadioButtonPass][RadioButtonFail][Label.Text="Comm

我对具有动态内容的web应用程序的概念很陌生。 我正在创建一个简单的应用程序,它从数据库中获取信息(测试步骤),并将行添加到表中(每行包含两个标签、两个单选按钮和文本字段)

它的工作原理如下: 1.我有一个带有文本框和按钮的页面, 2.我输入测试ID来检索测试步骤,然后单击submit按钮 3.根据步骤数,我为每个步骤向表中添加一行,因此我的表如下所示:

[Label.text="Step1"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
[Label.text="Step2"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
[Label.text="Step3"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
etc.
  • 当用户按下每个单选按钮时,他可以单击submitResult按钮并将数据发送到db
  • 页面生成正确,但我在动态内容方面遇到问题,因为当我点击submitResult按钮时,表再次为空(此时submitResult按钮不执行任何操作)。我读过这篇文章,我想我需要将表存储到视图状态。我怎么做

    我试着把桌子存起来

    ViewState[table.ID] = table;
    
    在PopulateTable方法的末尾,然后在

    protected void Page_Load(object sender, EventArgs e)
            {
                if (IsPostBack)
                {
                    if (ViewState[TableForMethods.ID] != null)
                    {
                        TableForMethods = (Table)ViewState[TableForMethods.ID];
                    }
        }
    }
    
    但这不起作用

    我的代码如下所示:

    [Label.text="Step1"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
    [Label.text="Step2"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
    [Label.text="Step3"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
    etc.
    
    *.aspx

    <body style="height: 510px">
        <form id="form1" runat="server">
             <p>
                Put test case ID and submit
            </p>
            <asp:TextBox ID="TextBoxId" runat="server">1804673290</asp:TextBox>
            <asp:Button ID="ButtonRetriveId" runat="server" OnClick="ButtonSubmitId_Click" Text="Submit" Width="81px" />
            <p>
                &nbsp;
            </p>
             <p>
                <asp:Label ID="LabelMethods" runat="server"></asp:Label>
            </p>
            <p>
                <asp:Table ID="TableForMethods" runat="server">
                </asp:Table>
            </p>
            <div style="text-align: right">
                <asp:Button ID="ButtonSubmitResults" runat="server" Text="Submit result" OnClick="ButtonSubmitResults_Click" Visible="False" />
            </div>
    
            <div style="text-align: right; position: absolute; bottom: 0px">
            <asp:Label ID="LabelStatus" runat="server"></asp:Label>
            </div>
    
        </form>
    
        <script>
            var trPassArray = $("tr input[id*='RadioButtonPass']").click(function () {
                this.closest("tr").setAttribute("bgcolor", "yellowgreen");
                console.log("zmien na green");
                console.log(closest("tr"));
            });
    
            var trFailArray = $("tr input[id*='RadioButtonFail']").click(function() {
                this.closest("tr").setAttribute("bgcolor", "orangered");
                console.log("zmien na red");
                console.log(this.closest("tr"));
            });
    
            console.log(trPassArray);
            console.log(trFailArray);
        </script>
    </body>
    
    
    
    放置测试用例ID并提交
    

    1804673290

    var trPassArray=$(“tr输入[id*='RadioButtonPass'])。单击(函数(){ 这个.trest(“tr”).setAttribute(“bgcolor”、“黄绿色”); console.log(“zmien na green”); 控制台日志(最近的(“tr”); }); var trFailArray=$(“tr输入[id*='RadioButtonFail'])。单击(函数(){ 这个.recest(“tr”).setAttribute(“bgcolor”、“oranged”); console.log(“zmien na red”); console.log(this.closest(“tr”)); }); 控制台日志(trPassArray); console.log(trFailArray);
    *.aspx.cs

         protected void Page_Load(object sender, EventArgs e)
            {
            }
    
            protected void ButtonSubmitId_Click(object sender, EventArgs e)
            {
               this.PopulateTable(TableForMethods, value);
               ButtonSubmitResults.Visible = true;
            }
    
        protected void ButtonSubmitResults_Click(object sender, EventArgs e)
        {
        }
    
       private void PopulateTable(Table table, string value)
            {
                string[] sep = { "<br>" };
                var words = value.Split(sep, StringSplitOptions.RemoveEmptyEntries);
    
                for (int iterator = 1; iterator <= words.Count(); iterator++)
                {
                    var tRow = new TableRow { ID = "Row" + iterator };
                    table.Rows.Add(tRow);
    
                    var tCell = new TableCell();
    
                    var myLabel = new Label
                    {
                        Text = words[iterator - 1],
                        ID = "Label " + iterator
                    };
    
                    var radiobuttonPass = new RadioButton
                    {
                        Text = "Pass ",
                        ID = "RadioButtonPass " + iterator,
                        GroupName = "passFailGroup" + iterator,
                    };
    
                    radiobuttonPass.CheckedChanged += passRadioButton_CheckedChanged;
    
                    var radiobuttonFail = new RadioButton
                    {
                        Text = "Fail ",
                        ID = "RadioButtonFail " + iterator,
                        GroupName = "passFailGroup" + iterator,
                    };
    
                    radiobuttonFail.CheckedChanged += failRadioButton_CheckedChanged;
    
                    var upPassFail = new UpdatePanel { UpdateMode = UpdatePanelUpdateMode.Conditional };
                    upPassFail.ContentTemplateContainer.Controls.Add(radiobuttonPass);
                    upPassFail.ContentTemplateContainer.Controls.Add(radiobuttonFail);
    
                    var passTrigger = new AsyncPostBackTrigger
                    {
                        ControlID = radiobuttonPass.ID,
                        EventName = "CheckedChanged"
                    };
                    upPassFail.Triggers.Add(passTrigger);
    
                    var failTrigger = new AsyncPostBackTrigger
                    {
                        ControlID = radiobuttonFail.ID,
                        EventName = "CheckedChanged"
                    };
                    upPassFail.Triggers.Add(failTrigger);
    
                    var labelComment = new Label
                    {
                        Text = " Comment:",
                        ID = "LabelComment " + iterator.ToString()
                    };
    
                    TextBox textBoxComment = new TextBox { ID = "TextBoxComment " + iterator.ToString() };
    
                    tCell.Controls.Add(myLabel);
                    tCell.Controls.Add(radiobuttonPass);
                    tCell.Controls.Add(radiobuttonFail);
                    tCell.Controls.Add(labelComment);
                    tCell.Controls.Add(textBoxComment);
                    tRow.Cells.Add(tCell);
                }
            }
    
    受保护的无效页面加载(对象发送方,事件参数e)
    {
    }
    受保护的无效按钮提交单击(对象发送者,事件参数e)
    {
    this.PopulateTable(TableFormMethods,value);
    ButtonsSubmitResults.Visible=true;
    }
    受保护的无效按钮提交结果\u单击(对象发送方,事件参数e)
    {
    }
    私有void PopulateTable(表、字符串值)
    {
    字符串[]sep={“
    ”}; var words=value.Split(sep,StringSplitOptions.RemoveEmptyEntries);
    for(int iterator=1;iterator您尝试执行的操作无效。
    ViewState
    由服务器应用程序用于在请求之间存储信息

    • 在页面加载或回发过程中,服务器修改页面或其控件的状态
    • 当你回帖时,如果没有办法“记住”所做的事情,所有这些更改都将丢失。这就像是第一次加载页面一样
    • ASP.NET通过在表单字段(
      ViewState
      )中写入控件的详细信息来解决此问题。这样,每次回发时,您都会将数据发送回服务器,告诉服务器页面和控件的状态,以便它可以重新创建
    您正在对客户端上的HTML进行更改。此时页面已呈现,包括
    ViewState
    。它只跟踪服务器的更改,而不跟踪客户端上发生的任何更改。因此服务器永远不会知道这些更改发生了

    有几种方法可以解决这个问题(不止两种,但这些都是显而易见的)

  • 无论修改该表需要做什么更改,都要在服务器上进行。如果用户与某个对象交互,请向服务器回发。服务器修改该表,并且假设为该表启用了
    ViewState
    ,则这些更改已写入
    ViewState
    ,并将其持久化
  • 避免回发。如果没有服务器控件,那么在页面加载后,它的行为就像普通的HTML页面一样,您可以在客户端执行任何您想要的操作
  • 这有点混乱:在客户端上存储客户端更改。当您在客户端上更新表时,您可以将其存储在
    localStorage
    中。当页面刷新时,您可以使用客户端脚本检查
    localStorage
    并恢复存储在那里的任何客户端内容。将其视为与一样de>ViewState
  • ,但恰恰相反。
    ViewState
    在往返之间存储服务器端数据。
    localStorage
    在往返之间存储客户端数据。问题是,在某些回发上,您可能会完全更改表(如新数据或其他内容)您必须有一种方法来区分它,以便在这种情况下,您不会从
    localStorage
    刷新它 将WebForms与客户端代码混合在一起可能有点令人沮丧。我们开始学习所有这些整洁的客户端工具,但它们并不总是能很好地处理WebForms的行为。客户端代码希望更改页面上的内容。WebForms希望刷新整个页面


    就我个人而言,如果可能的话,我会选择选项1或选项2,而不是尝试交叉繁殖两者的行为。

    嗨,谢谢你的详细回答,选项1看起来最好。我该怎么做?我在PopulateTable方法的末尾添加了ViewState[table.ID]=table,但更改不是持久的,我这样做正确吗?什么是“加载”状态的正确方法?