我今天遇到了一些奇怪的行为,我希望有人可以为我揭开它,因为我感到困惑。
我使用了几种与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失败,我在页面加载中的绑定为空(对象引用未设置为对象的实例)。实际上,在第二次回发中,下拉列表已被删除,但不是第一次。
在尝试其他所有事情之后绝望的时候,我决定取消对确认方法的调用......奇怪的是,错误消失了,我可以多次更新页面上的信息。
如果我静态地将一个通用控件添加到我正在处理的页面上,并稍微改变我的方法,以便不是动态地向表单添加通用控件,而是在页面上找到通用控件,没有产生同样的错误。
如果我从页面中删除两个下拉列表或者只是停止与它们交互,问题也会消失。
为什么在表单上添加动态控件会在回发时擦除我的下拉列表?
答案 0 :(得分:1)
我认为您应该考虑使用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);
}