【问题标题】:What are the main differences of defining a control statically or creating it dynamically on page load?静态定义控件或在页面加载时动态创建控件的主要区别是什么?
【发布时间】:2010-09-13 05:34:03
【问题描述】:

我正在开发一个项目,该项目在 page_load 事件中为表单动态创建控件,从数据库中加载它们的当前值并在用户单击继续按钮时保存它们的值(使用 FindControl)。

当我在 .aspx 页面中静态添加一个控件并按照它们在页面加载中加载值并将其保存在按钮按下时的相同过程时,我发现该值无法正确保存。好像不会保存,因为在page_load之后触发了click事件,所以post back的page_load恢复了值,用户输入的值没有保存。

奇怪的是,通过将控件更改为动态创建,就像页面上的所有其他控件一样,并保持加载和保存相同,它现在可以工作了。即使页面加载仍然使用旧数据库值创建控件。

这似乎是一个非常基本的 asp .net 功能,但我只是不清楚发生了什么。我怀疑这与创建时间有关,也可能与视图状态启动时有关。

【问题讨论】:

  • 我想我可能已经破解了它。显然,在添加控件时,它会在添加时赶上。因为动态创建是创建对象,设置它的值然后将它添加到页面。通过将其添加到页面,它运行控件的初始化阶段并从视图状态中检索其值,替换刚刚加载的值。本文讲讲:codebetter.com/blogs/jeffrey.palermo/archive/2004/11/25/…

标签: asp.net


【解决方案1】:

静态页面控件的创建就像动态页面控件一样。差异可能出现在您的 Page_Load 中。每当您回发所有控件时,都会重新创建,这意味着它们是使用初始值创建的。发生这种情况是因为在创建控件后,asp.net 会丢弃控件/对象。

因此,当请求到来时,asp.net 所做的第一件事就是通过查看控件的定义(在设计器文件中)来重新创建控件。 在每次回发时,它们都会被创建并再次初始化,并在此过程中失去其状态。

但是在创建控件之后Asp.Net 会加载随请求一起发送的任何视图状态,这使人们认为状态总是保存在服务器上。

可能发生的情况是没有为您的控件启用视图状态(如果它们是在设计器中创建的),在这种情况下,您可以尝试使用 EnableViewState 属性为 true 的控制。

或者,当您执行 Page_Load 时,您正在强制重新初始化所有内容。并且在过程中丢失所有控制数据。如果你能把Page_Load的逻辑贴出来,可能会得到澄清。

【讨论】:

  • 我会假设 EnableViewState 默认启用,但您可能是正确的。我将再次尝试使用静态定义的控件并明确设置该属性。逻辑相当简单: page_load { createAndInitialiseControls() } buttonClick { Save(FindControl("control").Text) } 真的没有什么其他的了。所以我相信它一定与视图状态有关,你可能是正确的,它没有为我的静态控件加载。
  • 好的,我使用了 EnableViewState 属性,据我所知,它默认为 true,因此定义它没有帮助。但是我在回发时禁用了静态控件的值加载,这给了我想要的结果并且很有意义。因此,当它回发时,它不会从数据库中检索其值,而是从视图状态中获取它。但这一点都不让我感到惊讶,这就是为什么它与动态控件一起工作的原因让我很困惑。
【解决方案2】:

确保:

  • 您没有再次为 Page_Load 中的静态控件设置值。动态控件可能通过在生命周期的不同阶段获取 ViewState 和表单值来绕过它。
  • 动态控件添加在静态控件之后。或者至少它们被添加到不同的容器中。控件集合中的位置可能会影响 ViewState,尽管它看起来不像您的场景 / 因为您提到的内容似乎更多地与当前帖子中的值有关。
  • 在Page_Load响应相应事件之后进行保存。

【讨论】:

  • 您是正确的 eglasius,动态控件在添加到控件集合时从页面加载中的视图状态重新读取。不知道该给谁回答...
  • 选择您认为对您最有帮助的答案,我很高兴只需投票并知道您解决了它:)
【解决方案3】:

我过去遇到过类似的问题(实际上很多次),但对我帮助最大的是了解 ASP.NET 页面生命周期。

Microsoft 上面有 an article 描述得很好,但是 Solomon Shaffer 的 this post 确实澄清了一切。

我建议同时阅读它们,并在回来时提出有关特定状态、何时加载/保存数据等的其他问题。

希望这会有所帮助。

马尔科

【讨论】:

  • 谢谢,我去看看。
  • +1 用于了解 ASP.NET 页面生命周期。看起来他们确实在搞乱控件的生命周期,特别是当您遇到动态控件比静态控件更容易使用的情况时。
【解决方案4】:

请注意,您可能希望使用Page.IsPostBack 属性来避免重新初始化按钮单击和其他事件的值。

private void Page_Load()
{
    if (!this.IsPostBack)
    {
        // Assign values to the controls.
    }
}

【讨论】:

  • 很好的建议,但是因为创建和初始化逻辑在页面加载的同一部分中,所以在单击鼠标时,值不会被保存为回发,并且控件不会已创建。显然页面设计并不理想,但我正在使用我所拥有的:)
  • @James Hulse:我说的是控件不是动态创建的情况。这意味着控件仍将保留在此处,但不会在回发时重新初始化为其默认值。
  • 是的,你是对的,但我避免这样做是为了保持页面的当前结构相同。我不适合对逻辑进行大的改动。但是,是的,这将是一种解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2017-05-06
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多