将动态通用 html 控件添加到页面会销毁绑定下拉列表

本文关键字:下拉列表 绑定 动态 html 添加 控件 | 更新日期: 2023-09-27 18:30:34

我今天遇到了一些奇怪的行为,我希望有人能为我提供一些启示,因为我很困惑。

我有几种方法用于与 UI 交互,其唯一目的是向用户显示错误/成功/警告消息。

这是其中之一

        public static void Confirm(string text)
    {
        var page = (Page)HttpContext.Current.Handler;
        var uiConfirm = new HtmlGenericControl("div")
        {
            ID = "uiNotify",
            InnerHtml = text
        };
        uiConfirm.Attributes.Add("class", "ui-confirm");
        page.Master.FindControl("form1").Controls.AddAt(2, uiConfirm);
    }

除了我今天早上遇到的一个细微差别之外,这工作得很好,我希望有人能为我提供一些启示。

我正在处理您的工厂配置文件编辑页面。在此页面中,我在页面加载时绑定了几个下拉列表(国家,省/州)。我在底部有一个提交和一个点击事件,该事件触发以更新信息,然后调用上面的方法来通知用户他们的信息已成功更新。这在您第一次单击提交按钮时有效;页面回发,数据库中的信息更新,动态添加的div弹出,确认消息显示,一切正常。但是,如果再次单击提交按钮,它将失败,指出我在页面加载中绑定的下拉列表中的 SelectedItem 为空(对象引用未设置为对象的实例)。由于某种原因,下拉列表实际上在第二次回发时被擦除,但不是第一次回发。

在尝试了其他所有方法后,我完全绝望地决定拨打确认方法......奇怪的是,错误消失了,我可以根据需要多次更新页面上的信息。

如果我将泛型控件

静态添加到我正在处理的页面,并稍微更改我的方法,以便它不会动态地向窗体添加泛型控件,它只会在页面上找到泛型控件,这不会产生相同的错误。

如果我从页面中删除两个下拉列表或只是停止与它们交互,问题也会消失。

为什么向窗体添加动态控件会在回发时擦除我的下拉列表?

将动态通用 html 控件添加到页面会销毁绑定下拉列表

我认为您应该考虑在MasterPage中使用PlaceHolder类,AddAt(2, uiConfirm)会咬您,可能是:

标记:

.......
<asp:PlaceHolder id="PlaceHolder1" 
           runat="server"/>
......

代码隐藏:

public static void Confirm(string text)
{
    var page = (Page)HttpContext.Current.Handler;
    var uiConfirm = new HtmlGenericControl("div")
    {
        ID = "uiNotify",
        InnerHtml = text
    };
    uiConfirm.Attributes.Add("class", "ui-confirm");
    //may need to change depending on where you put your placeholder
    Control placeHolder = page.Master.FindControl("PlaceHolder1"); 
    placeHolder.Controls.Clear();
    placeHolder.Controls.Add(uiConfirm);
}