将动态通用 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 为空(对象引用未设置为对象的实例)。由于某种原因,下拉列表实际上在第二次回发时被擦除,但不是第一次回发。
在尝试了其他所有方法后,我完全绝望地决定拨打确认方法......奇怪的是,错误消失了,我可以根据需要多次更新页面上的信息。
如果我将泛型控件静态添加到我正在处理的页面,并稍微更改我的方法,以便它不会动态地向窗体添加泛型控件,它只会在页面上找到泛型控件,这不会产生相同的错误。
如果我从页面中删除两个下拉列表或只是停止与它们交互,问题也会消失。
为什么向窗体添加动态控件会在回发时擦除我的下拉列表?
我认为您应该考虑在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);
}