【问题标题】:dynamicaly loaded controls lose values (ASP.NET)动态加载的控件丢失值 (ASP.NET)
【发布时间】:2009-08-11 23:52:52
【问题描述】:

我遇到了一个关于在 asp.net 应用程序中动态加载控件的奇怪问题。

所以有一个控件,用户必须选择一些项目和/或进行一些文本输入(文本框)。该控件依赖于单个下拉列表元素。

所以用户 A 在这个下拉列表“controlselector”中选择某个值 -> 将加载许多控件。之后用户点击保存,然后它应该将其保存到数据库中。

问题在于并非每个项目都保存到数据库中。

我在每次 Page_Load 时创建并重新创建控件,我已在“controlselector”上重新打开自动发布,但控件正在 page_load 事件中加载。当试图保存元素是空的,但不是每个项目:(

MyCustomControl:
FillElements(someParameter)
{
  //fill some lists, dropdowns, checkboxes or whatever with some values from db
}

Foo Save()
{
   //Save selected input(also some textboxes)
  //and return an object
  return foo;
}

Page:
Page_Load()
{
   PlaceHolder.Clear();

  //with Createpath the path to the control is created and loaded
   PlaceHolder.Controls.Add(LoadControl(CreatePath(Selector.SelectedValue)));

   //some methods are started to fill some lists in the control
   ((MyCustomControl)PlaceHolder.Controls[0]).FillElements(someParameter);
}

Save_Button_Click()
{
    var myFoo = ((MyCustomControl)PlaceHolder.Controls[0]).Save();
    myFoo.DoSomethingElse();
}

似乎有时页面会记住值,有时却不记得……一切都很奇怪

谢谢

[编辑] 我看到的问题是,有 2 次动态填充动作。 1.) 决定哪个然后加载自定义控件 2.) 用参数填充自定义控件

【问题讨论】:

  • 您是否在 UserControl 中的所有控件上启用了视图状态?是否在页面的其余部分和整个 UserControl 本身上启用了 ViewState?
  • 是的,我在用户控件上启用了视图状态...

标签: asp.net .net-3.5 controls


【解决方案1】:

Page_Load 在生命周期中创建动态控件为时已晚,因为状态已恢复到控件在加载事件之前。这意味着您需要更早地创建控件,否则 ASP.Net 在恢复状态时将看不到它。尝试在 Init 事件中创建它们。或者,更好的是,尝试以下选项之一:

  • 创建一种自定义控件类型,可根据需要自行调整,并在页面上拥有该控件的普通实例。
  • 将所有控件放在页面上,但仅将您关心的控件的 Visible 设置为 true。

【讨论】:

  • 当我将创建移动到 page_init 或 oninit 事件时,似乎我的下拉列表决定需要加载哪个自定义控件,但还没有任何值.. 所以控件正在加载
  • 我也尝试了您的第二个选项,将控件放在页面上并设置它们是否可见......但问题仍然存在......我认为这是因为控件需要一些参数来填充他们的下拉列表 ((MyCustomControl)PlaceHolder.Controls[0]).FillElements(someParameter);
【解决方案2】:

如果您不想重新创建这些控件,则需要检查“IsPostBack”...它会杀死您在其中拥有的值等。

尝试将您的代码更改为类似的内容。

Page_Load()
{
  if(IsPostBack == false){
   PlaceHolder.Clear();

  //with Createpath the path to the control is created and loaded
   PlaceHolder.Controls.Add(LoadControl(CreatePath(Selector.SelectedValue)));

   //some methods are started to fill some lists in the control
   ((MyCustomControl)PlaceHolder.Controls[0]).FillElements(someParameter);
  }
}

【讨论】:

    【解决方案3】:

    感谢您的帮助,但问题出在完全不同的地方 动态加载到下拉列表中的项目也动态加载,有一些“\n”特殊字符,但不是每个项目 这就是为什么不是每件物品都丢失了几件

    我不知道我是否应该/可以将此标记为答案,因为问题出在其他地方

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      相关资源
      最近更新 更多