我正在尝试制作评论页面。我以前从数据库中获得了评论,并且有一个文本框供新评论提交。因此,为了显示数据库中的旧评论,必须动态添加它们,对吧?起初我使用类似:TheContainerControl.Controls.Add(TheComment),但事实证明,当页面被回发(提交新评论或其他内容)时,我动态添加的所有内容都消失了!为了解决这个问题,我改用了 TheContainerControl.InnerHtml("[html]") 。这样,当页面被回发时,我动态添加的控件不会丢失。但是,我现在已经搜索了将近九到十个小时,以寻找一种将事件处理程序添加到我通过 .InnerHtml 添加的控件的方法,但我没有找到任何东西:(我可以' 根本不引用它们, .FindControl() 返回一个空引用。我还尝试手动插入会触发事件的代码/脚本,但惨遭失败(我是 jQuery 新手,我对 javascript 知之甚少)。如果可以的话请帮忙。
3 回答
在向页面动态添加控件时,您在 Asp.net 中必须牢记的是页面生命周期。何时可以添加控件并在下一次回发后仍然保留它们是非常特别的。或者您可以添加控件并让它们渲染到多晚。
人们动态构建页面的常见趋势是刚开始将他们的代码放在 Page_Load() 中,但这在生命周期中为时已晚。您可能想尝试Init(或 Page_Init)。
正如其他人所建议的那样,您也可以考虑根本不动态添加控件,而是使用一些内置的 Asp.net 内容控件来管理页面的动态状态。当来自其他 Web 框架/技术时,您可以动态构建页面,Asp.net 可能看起来有点复杂。请记住——一旦您学会了利用页面生命周期和 Asp.net 控件,您就不必自己手动管理页面上所有元素的状态。
您在页面上添加回的这些旧评论,这些 UI 元素是响应 DOM 事件(如单击等)还是它们只是用于显示的标签?如果它们只是用于显示,那么正如 Brian 上面所说,您最好使用 Repeater r GridView 或 ListView 而不是动态控件。
实际上,即使它们是控件元素,您仍然可以将它们放在 GridView 的模板列中并让它处理分页等。您可以使用 jQuery 实时事件来处理这些控件。
或者,使用 ASP.NET Ajax 和更新面板仅刷新页面中绝对需要在回发时刷新的部分,而其他部分保持不变。
如果您可以发布一些代码,那将会很有帮助。
使用像Repeater、GridView 或ListView 这样的控件会更容易,这些控件是为显示动态数量的评论而构建的。
需要在每次回发时将动态控件添加回页面。
我不确定你的意思是什么:“我一直在寻找近九到十个小时来寻找一种将事件处理程序添加到我通过 .InnerHtml 添加的控件的方法,但我没有找到任何东西 :( 我可以”根本不引用它们,.FindControl() 返回一个空引用。我还尝试手动插入会触发事件的代码/脚本,但惨遭失败“ - JQuery 如何适应这一点,你是否试图这样做客户端还是服务器?
HTH。