1

我今天遇到了一些奇怪的行为,我希望有人能为我解释一下,因为我很困惑。

我有几种方法用于与 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 为空(对象引用未设置为对象的实例)。由于某种原因,下拉菜单实际上在第二个被擦除回发,但不是第一次。

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

如果我将一个通用控件静态添加到我正在处理的页面中,并稍微更改我的方法,以便它不会动态地将通用控件添加到表单中,而是在页面上找到通用控件,这不会产生相同的错误.

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

为什么要在表单中添加动态控件以在回发时擦除我的下拉列表?

4

1 回答 1

1

我认为你应该考虑PlaceHolder在你的 中使用这个类MasterPage,这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);
}
于 2012-04-10T16:48:10.667 回答