输入文本控件在回发时消失

时间:2013-03-27 01:49:31

标签: c# asp.net user-controls updatepanel postback

我有一些输入控件(文本)以这种方式在代码隐藏中创建,作为动态RadiobuttonList的一部分(以便文本框位于单选按钮旁边):

RadioButtonList radioOption = new RadioButtonList();

 radiobuttonlist.Items.Add(new ListItem(dt.Rows[i][9].ToString() + " <input id=\"" + name + "\" runat=\"server\" type=\"text\" value=\"Enter text\" />")

所有控件都在UpdatePanel中。

每次有回发时,输入控件中的文本都会消失。

如何保留输入文本值?

有什么想法吗?非常感谢!

1 个答案:

答案 0 :(得分:2)

必须在每次回发时重建控制树,包括部分回发 - 或者让它通过ControlState / ViewState重建。在这种情况下,在后续回发中,Items集合不会被重建(或被清除),并且在渲染阶段是空的。

对于这样的情况,我会将其视为:

  1. 在RadioButtonList 上启用ViewState,确保不迟于Load 1 添加,或者<; li>
  2. 将相应Collection的ViewState存储在容器控件上,然后将DataBind存储到使用控件 - 请参阅GenericDataSourceControl以获得设置它的简洁方法。我更喜欢这种方法,因为它一致,可预测且易于控制。

  3. 1 这个应该可以工作,但可能没有。我常常对哪些控件真正支持ViewState以及在多大程度上因为使用总是让我感到困惑而感到困惑。在任何情况下,如果禁用ViewState,将不会工作 - 请记住,禁用页面(或父控件)的ViewState会一直禁用ViewState。此外,控件必须在适当的时间加载到控制树中,并使用相同的控制路径/ ID(通常为Init或Load),以便它能正常运行请求ViewState。


    #2的粗略想法:

    将视图状态保存在包含的用户控件中(必须为此控件启用ViewState):

    // ListItem is appropriately serializable and works well for
    // automatic binding to various list controls.
    List<ListItem> Names {
        // May return null
        get { return (List<ListItem>)ViewState["names"]; }
        set { ViewState["names"] = value; }
    }
    

    在GenericDataSourceControl中(将GDS放入Markup以便它有一个很好的ID)选择事件:

    void SelectEvent(sender e, GenericSelectArgs args) {
       args.SetData(Names);
    }
    

    动态添加RadioButtonList(例如,在Control.OnLoad中):

    // Unless this NEEDS to be dynamic, move it into the declarative markup.
    // The dynamic control must be added to the *same location* it was before the
    // postback or there will be ugly invalid control tree creation exceptions.
    var radioList = new RadioButtonList();
    someControl.Controls.Add(radioList);
    // To minimize problem with Control Tree creation this should be unique and
    // consistent for dynamic controls.
    radioList.ID = "radioList";
    
    // Binding to the DS "declarative" usually works better I've found
    radioList.DataSourceID = "idOfTheGDS";
    // You -may- need to DataBind, depending upon a few factors - I will usually call
    // DataBind in PreRender, but generally in the Load is OK/preferred.
    // If it already binds, don't call it manually.
    radioList.DataBind();
    

    如果DataBinding工作正常,则应该可以禁用 RadioButtonList的ViewState ..但有时候ViewState应该在ControlState应用时使用,所以请确保它按照需要运行。