在 Asp.net C# 中创建动态控件,并缓存控件并绑定数据
Posted
技术标签:
【中文标题】在 Asp.net C# 中创建动态控件,并缓存控件并绑定数据【英文标题】:Creating Dynamic Controls in Asp.net C#, and caching the controls and binding the Data 【发布时间】:2012-12-20 08:34:16 【问题描述】:我正在创建动态控件,例如 Page_Init
中的文本框、下拉菜单。创建控件后,我将数据绑定到控件。当页面回发发生时,我必须重新创建控件并重新绑定数据。
有什么方法可以缓存动态创建的控件,并将最新数据更新到该控件。例如我创建文本框然后将值设置为“abc”,当有回发时,我不想再次重新创建文本框,或者只是想从缓存中获取控制权并想更新最新值说“xyz”到那个文本框。
基本上是第一次创建控件,缓存控件并在回发时绑定最新数据到控件。
谢谢 尤格什
【问题讨论】:
【参考方案1】:在你的初始化方法中添加下面的代码
if(!IsPostBack)
//Put your control initzilation here and it will not be triggered on a PostBack
您将需要其他逻辑来更改需要更改的控件的 txt 值。
【讨论】:
【参考方案2】:在Page_OnInit
方法中创建控件应注意控件保留其数据。
如果您也在代码中设置数据,请确保将它们封装在
if (!Page.IsPostBack)
//set data here
这可确保仅在第一次设置数据时,而不是每次都覆盖。
编辑:
作为一个更完整的例子:
protected void Page_OnInit(object sender, EventArgs e)
TextBox txt = new TextBox();
//create more controls
if (!Page.IsPostBack)
txt.Text = "initial value";
Page.Controls.Add(txt);
//add other controls
【讨论】:
Page.IsPostback 不会有帮助,因为如果控件是像 ASPXcode <asp:Panel ID="Panel1" runat="server"> </asp:Panel> <asp:Button ID="Button1" runat="server" Text="Button" />
C# protected void Page_Init(object sender, EventArgs e) if (!IsPostBack) TextBox txt = new TextBox(); txt.Text = "yeeelo"; Panel1.Controls.Add(txt); else
那样动态创建的,在回发时它不会在页面上显示控件
@DonYogesh 你只应该在 !Page.IsPostBack 中设置数据,而不是创建控件并添加它。
其实我不想重新创建回发控制。控件应仅在第一次创建,下次应从缓存或会话中获取。这可能吗?
@DonYogesh 您可以在 !Page.IsPostBack 中执行 Session["txt"] = txt
,然后在 if 之后执行 Page.Controls.Add(Session["txt"] as TextBox);
。但我非常推荐 AGAINST 这样做:如果您将所有这些控件保持在会话中,您将对服务器 RAM 造成相当大的压力(因为只有在您这样做时它们才会被删除手动操作,否则用户超时。)由于使用 ViewState 存储变量的内容,每次再次创建控件可以减少服务器 RAM 的负载。
我的基本目标是让页面更快,因为创建动态控件和绑定数据需要很多时间。你有什么缓存技术可以让页面加载得更快【参考方案3】:
不是每次都必须创建它
我不知道,但我认为这是微软的错误或其他东西,但你必须每次都创建它
一些开发人员建议您必须在 page_Preinit 中创建它,但您不会获得任何静态表格或面板控件,那么您在哪里添加控件?
【讨论】:
以上是关于在 Asp.net C# 中创建动态控件,并缓存控件并绑定数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# Asp.Net 中从相当复杂的 Json 响应中创建 Dto
在 asp.net c# 中创建 iPhone 推送通知 Web 服务
如何在 C# Asp.net MVC 中创建 websocket 客户端?
如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌