代码之家  ›  专栏  ›  技术社区  ›  nWorx

加载的动态控件丢失值(ASP.NET)

  •  0
  • nWorx  · 技术社区  · 15 年前

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

    因此有一个控件,用户必须在其中选择一些项和/或执行一些文本输入(文本框)。控件依赖于单个下拉列表元素。

    因此,用户A在此下拉列表“ControlSelector”中选择一个特定值,将加载许多控件中的“ControlSelector”->。之后,用户单击“保存”,然后将其保存到数据库。

    问题是,并非每个项都保存到数据库中。

    我在每次页面加载时创建并重新创建控件,我已将AutoPost重新打开“ControlSelector”,但控件正在页面加载事件中加载。尝试保存元素时,元素为空,但不是每个项:(

    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.)用参数填充自定义控件

    3 回复  |  直到 15 年前
        1
  •  3
  •   Joel Coehoorn    15 年前

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

    • 创建一个自定义控件类型,该类型根据需要自行调整,并在页面上具有该控件的常规实例。
    • 将所有控件放置在页面上,但仅设置 Visible 为了你所关心的人。
        2
  •  0
  •   YetAnotherDeveloper    15 年前

    如果不想重新创建这些控件,则需要检查“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
  •  0
  •   nWorx    15 年前

    谢谢你的帮助,但问题出在完全不同的事情上 动态加载到下拉列表中的项目,在下拉列表中也动态加载,它们具有一些\n“特殊字符,但不是每个项目 所以不是所有的东西都丢了,只有很少的东西

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