无法使用ASP/C#动态地向表中添加多行
本文关键字:添加 动态 ASP | 更新日期: 2023-09-27 18:20:57
我有一个web应用程序,里面有HTML表,其中到处都有输入框。我希望能够从C#方面向这些表添加行。为了实现这一点,我使用了一个调用以下方法的asp按钮:
private void AddRow()
{
HtmlTableRow tRow = new HtmlTableRow();
HtmlTableCell cell = new HtmlTableCell();
HtmlTableCell cell2 = new HtmlTableCell();
HtmlTableCell cell3 = new HtmlTableCell();
HtmlTableCell cell4 = new HtmlTableCell();
cell.InnerHtml = "<input type='"text'" size='"29'">";
tRow.Cells.Add(cell);
cell2.InnerHtml = "<input type='"text'" size='"9'" class='"units commas'" />";
cell2.Attributes.Add("class", "leftBorder textCenter");
tRow.Cells.Add(cell2);
cell3.InnerHtml = "<input type='"text'" size='"8'" class='"value commas'" />";
cell3.Attributes.Add("class", "leftBorder textCenter");
tRow.Cells.Add(cell3);
cell4.InnerHtml = "<input type='"text'" size='"11'" readonly='"readonly'" tabindex='"-1'" class='"totalA1 autoTotal'" /> ";
cell4.Attributes.Add("class", "leftBorder rightBorder textRight");
tRow.Cells.Add(cell4);
someTable.Rows.Add(tRow);
}
这个效果很好。。。正好一行。我可以点击按钮,它会添加一行。如果我再次单击它,它不会起任何作用。更具体地说,我怀疑它删除了当前添加的行,将文档恢复到"默认"状态,然后添加了一行(实际上什么都没做)。
假设我是对的,我需要能够以某种方式将一行附加到另一个动态创建的行中,而不是仅仅替换它。如果我不是对的,那么我只需要一种能够在按下按钮时不断添加行的方法。
我该怎么做?
编辑:我应该具体说明,所有这些都可以在一个循环中完成,一次完成。为了测试,我希望它能在按下按钮时工作,但它可以整齐地塞进某种循环中。我已经成功地把它放在了一起。
做您需要的事情的最佳方式是客户端,而不是服务器端。对于您正在做的事情,每次插入新行时都将其发布回服务器是没有意义的(在我看来)。您必须执行此服务器端(C#)操作是否有特定原因?
单击按钮后,使用Javascript(jQuery)将新行动态插入到表中。页面不会刷新,速度更快,用户体验更好。
我假设您熟悉Javascript,但您可以将客户端事件与服务器端按钮联系起来——只需添加onclientclick="insertRow();"
,其中onclientclick
是按钮控件的属性,insertRow()
是页面中<script></script>
标记之间定义的Javascript方法。
如果你需要我写一个如何做到这一点的例子,请告诉我,我可以编辑我的答案。
其他答案表达的观点是完全正确的,因为这个体系结构非常有缺陷(它的工作方式与2000年代中期,也就是一生之前的网络)。也就是说,你有约束,你不能改变它们。以下是我要检查的两件事,其中一件已经在评论中提出:
-
Postback正在干扰表初始化。当访问者第一次加载您的aspx页面时,浏览器将对您的页面执行HTTPGET请求。aspx页面类的IsPostback属性将为false。当用户点击你的按钮时,他们会向你的aspx页面发出POST请求,如果他们在浏览器上修改了页面的当前状态,则传递一组变量,以及一组特定于.NET的属性,指示按下了什么以及服务器应该执行什么事件处理程序(在您的情况下,将调用调用AddRow的事件处理程序,但仅在首先执行page_Load之后)。这就是为什么他们建议将Page_Load逻辑封装在if(!IsPostback){}中。
-
没有为HtmlTable控件启用ViewState。ViewState是一种特定于.NET的实现,它将服务器对HTML(输入框等)的所有了解序列化到输出HTML中的隐藏字段中。如果你想让.NET记住各种HTML标记的状态(它们包含什么,用户在每个标记中填写了什么,等等),那么它们需要在ViewState中有一个条目,该条目从回发传递到回发。不过,请注意,一旦有人在没有点击按钮或使用浏览器上的后退和前进按钮的情况下刷新页面(因为记住它们对应于HTTP GET请求,而不是HTTP POST请求),视图状态无论如何都会被重新初始化。唯一的解决办法就是在会话中填充内容。如果您对此满意,那么要启用视图状态,请在HtmlTable控件上使用.EnableViewState()方法,但请记住,这会增加web应用程序的页面大小,因为.NET会将表中包含的内容序列化为字符串,并将其放在隐藏的输入变量中。这将使编写所有服务器端逻辑变得"容易",但如果表变得很大,则会付出巨大的代价。
现在看来,阻力最小的途径可能是让现有的基础设施发挥作用,但相信我,你正在承担越来越多的技术债务,你或其他人将不得不偿还这些债务。我强烈建议改用客户端的添加行方法,这是绕过webforms中这种回发视图状态模型疯狂的唯一方法。