【问题标题】:Removing dynamically created HTML table rows - Life Cycle / Viewstate problem删除动态创建的 HTML 表格行 - 生命周期/视图状态问题
【发布时间】:2020-05-13 07:00:52
【问题描述】:

所以我有一个动态添加的行和 ASP.NET 文本框的 HTML 表。如果 viewstate[dataonpage] = true,我在 page_load 上重新实例化了行和控件,并且我在添加行和控件的方法中将其声明为 true。 (我需要他们坚持其他回发)

问题是我现在添加了一个 CLEAR 按钮,该按钮在单击时会删除所有 html 行(不包括标题),并且对于某些原因在单击按钮时会出现索引错误,或者如果使用 Try/Catch 它只会删除一半的行(每隔一行)。我认为问题与 viewstate[dataonpage] 仍然“真实”有关,并且在页面加载时正在重新添加数据。如果我将 viewstate["dataonpage"] = "false" 添加到清除按钮方法中,也会发生同样的情况,但至少这样在第二次单击时它会删除后半行。

我理解这是因为按钮事件处理程序在 page_load 之后才被触发,这就是为什么它在第一次单击时不起作用的原因。但我不完全理解的是,为什么即使没有这个,我的清除按钮代码也不会首先清除所有行。

任何帮助理解为什么它不起作用,以及解决方法将不胜感激!

protected void Page_Load(object sender, EventArgs e)
        {
            if (Convert.ToString(ViewState["DataOnPage"]) == "true")
                {
                    Getmarketdata();
                }
        }
protected void Getdatabtn_Click(object sender, EventArgs e)
        {
            ViewState["DataOnPage"] = "true";
            Getmarketdata();
        }

以下是创建添加表行和控件的方法:

public void Getmarketdata()
        {
            String url = "https://api.rightmove.co.uk/api/rent/find?index=0&sortType=1&maxDaysSinceAdded=" + Dayssinceuploadtext.Text + "&locationIdentifier=OUTCODE%5e" + Outcodetext.Text + "&apiApplication=IPAD";
            Response.Write(url);

            using (var webclient = new WebClient())
            {
                String Rawjson = webclient.DownloadString(url);
                    ViewState["VSMarketDataJSONString"] = Rawjson;
                dynamic dobj = JsonConvert.DeserializeObject<dynamic>(Rawjson);
                int NoOfHouses = dobj["properties"].Count;
                Response.Write("<br />" + NoOfHouses);
                for (int i = 0; i < NoOfHouses; i++)
                {
                    System.Web.UI.HtmlControls.HtmlTableRow tRow = new System.Web.UI.HtmlControls.HtmlTableRow();
                    GeneratorTable.Rows.Add(tRow);
                    String RMlink = String.Format("https://www.rightmove.co.uk/property-to-rent/property-" + dobj["properties"][i]["identifier"].ToString()) + ".html";
                    HyperLink hypLink = new HyperLink();
                    hypLink.Text = dobj["properties"][i]["identifier"].ToString();
                    hypLink.Target = "_blank";
                    hypLink.NavigateUrl = RMlink;
                    using (System.Web.UI.HtmlControls.HtmlTableCell tb1 = new System.Web.UI.HtmlControls.HtmlTableCell())
                    {
                        tRow.Cells.Add(tb1);
                        tb1.Controls.Add(hypLink);
                    }
                    using (System.Web.UI.HtmlControls.HtmlTableCell tb2 = new System.Web.UI.HtmlControls.HtmlTableCell())
                    {
                        TextBox tbEPCe = new TextBox();
                        tRow.Cells.Add(tb2);
                        tb2.Controls.Add(tbEPCe);
                        String txtboxID = (("EPCETxtBox") + i);
                        tbEPCe.ID = txtboxID;
                        tbEPCe.Style.Add("background", "none"); tbEPCe.Style.Add("border", "1px solid black"); tbEPCe.Style.Add("border-radius", "2px");
                    }
                    using (System.Web.UI.HtmlControls.HtmlTableCell tb3 = new System.Web.UI.HtmlControls.HtmlTableCell())
                    {
                        TextBox tbEPCp = new TextBox();
                        tRow.Cells.Add(tb3);
                        tb3.Controls.Add(tbEPCp);
                        String txtboxID = (("EPCPTxtBox") + i);
                        tbEPCp.ID = txtboxID;
                        tbEPCp.Style.Add("background", "none"); tbEPCp.Style.Add("border", "1px solid black"); tbEPCp.Style.Add("border-radius", "2px");

                    }
                    using (System.Web.UI.HtmlControls.HtmlTableCell tb4 = new System.Web.UI.HtmlControls.HtmlTableCell())
                    {
                        TextBox tbBbl = new TextBox();
                        tRow.Cells.Add(tb4);
                        tb4.Controls.Add(tbBbl);
                        String txtboxID = (("BblTxtBox") + i);
                        tbBbl.ID = txtboxID;
                        tbBbl.Style.Add("background", "none"); tbBbl.Style.Add("border", "1px solid black"); tbBbl.Style.Add("border-radius", "2px");
                    }
                }
            }
        }

下面是清除表格行的方法:(这是行不通的)

public void ClearTableRows()
        {
            System.Web.UI.HtmlControls.HtmlTable Htmlgeneratortable = ((System.Web.UI.HtmlControls.HtmlTable)GeneratorTable);
            int NoOfRows = Htmlgeneratortable.Rows.Count;
            for (int j = 1; j < NoOfRows; j++)
            {
                try
                {
                    Htmlgeneratortable.Rows.RemoveAt(j);
                }
                catch
                { }
            }
        }

【问题讨论】:

  • 看起来您正在将属于 front-end 的逻辑放在应用程序的 back-end 上。如果您重新更新 UI 并且不显示全新的网页,您应该在前端执行此操作。听起来,你只需要清空一个&lt;table&gt;,这是你可以很容易地在前端使用 JavaScript 做的事情。否则,您最终会陷入混乱。例如,GeneratorTable 是什么?这是会员吗?您不应该使用成员,因为GeneratorTable 将存在于 所有 客户端,而不是 每个 客户端。
  • @user1538301 感谢您的回复。我对此很陌生,老实说,我认为我需要学习 Javascript 和客户端的东西。但是,GeneratorTable 是在 HTML 中静态创建的 HTML 表的 ID。这些行在后面的代码中动态添加到其中。我假设如果我同时有多个客户端请求动态对象,并且 ViewState 不会从一个会话影响到另一个会话?我的所有代码都依赖于存储在动态创建的 asp.net 文本框中的信息,这些信息被放入 HTML 表 Generatortable 中。
  • 所以GeneratorTable 是一个字符串?考虑到您将其转换为 System.Web.UI.HtmlControl,这似乎不太可能。

标签: c# asp.net html-table lifecycle viewstate


【解决方案1】:

我将解释发生了什么,因为您现在已经编写了代码;我不相信我有能力提供答案,包括要进行的确切代码更改,所以这是您当前方法的问题:

您的表 GeneratorTable 存在于所有客户端。这并不意味着每次有人导航到您的网站时都会生成一个表格,这意味着存在 一个 表格,并且每个登录的客户都会获得该 一个 表格.

因此,如果您为一个客户端添加行,然后将表发送到另一个客户端,两个客户端将看到同一个表(添加了行)。

问题是清空表是与后端服务器无关的逻辑。您的服务器没有理由处理清空表格,您的服务器应该只处理页面导航和 AJAX 调用,它不应该改变网页的外观,因为服务器只能响应每个客户端 one 时间。

GeneratorTable 响应客户端然后在服务器上更新GeneratorTable 有什么意义?除非从服务器重新发送,否则客户端将永远不会看到对表所做的更新。

你说你是新手,需要学习 JS 和客户端,这个练习应该作为一个例子,说明为什么你需要把某些代码放在前端,一些代码放在后端,因为仅使用服务器并没有一种优雅的方式来完成您想要做的事情。

【讨论】:

  • 谢谢你的解释,我明白了。令人恼火的是,在了解我的大部分代码应该在 Javascript 客户端完成之前,我已经深入到项目中。
  • 虽然这不是正确的做法——否则我已经完成了这个项目。我实际上认为即使它是每个客户端的生成器表也会有所不同,因为我虽然将行添加到服务器端,但表是在 HTML 中静态创建的,并且添加行的方法使用来自 ASP 的值.NET 文本框,哪个存储在客户端?所以每个客户端都会有不同的行,因为他们将有自己的 ASP.NET 文本框值,他们已经输入?我说的对吗?
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多