asp.net 如何防止在服务器控件中的click事件之前发生回发

vwkv1x7d  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(102)

我有一个aspx页面,有两个ascx控件。第一个控件用于添加新数据,第二个控件用于显示该数据。

<div>
   <cc:EntryControl ID="MyEntryControl" runat="server" />
   <div>other stuff</div>
   <cc:ShowDataControl ID="ShowMyData" runat="server" />
</div>

EntryControl代码中有一个按钮单击事件:

protected void btnAddData_Click(object sender, EventArgs e) 
{
     //add data to db
}

问题是,添加数据的按钮会导致回发,首先加载页面和两个控件,然后触发按钮单击事件,这会给我留下现有的,以前添加的数据,但不是新添加的数据。数据被添加,但它只是不显示b/c的ShowDataControl回发已经发生。
我需要做什么才能显示新添加的数据?

izkcnapc

izkcnapc1#

正如这里的评论所指出的,一个简单的按钮点击将:
回邮页面。
页面加载事件将运行。
然后您的按钮代码存根将运行。
这意味着每次使用标准按钮时,页面回发将发生,页面加载事件将首先运行,每次单击按钮时都会运行(这是一个回发)。
这意味着在几乎每种情况下,100个网页中有99个需要一个!加载真实的第一页的IsPostBack代码存根。
一个很好的例子是加载一个列表的简单代码。
如果在每个按钮上单击重新加载下拉列表(组合框),那么当然,如果我每次都重新加载组合框,用户选择的内容就会丢失。
所以,页面上有一个这样的下拉列表:

<h3>Select Hotel to Edit</h3>

        <asp:DropDownList ID="cboHotels" runat="server"
            DataValueField="ID"
            DataTextField="HotelName"
            OnSelectedIndexChanged="cboHotels_SelectedIndexChanged"
            width="240px"
            AutoPostBack="true"
            >
        </asp:DropDownList>

现在,在页面加载事件中,我有这样的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LoadData();
        }
    }

    void LoadData()
    {
        string strSQL =
            @"SELECT * FROM tblHotelsA ORDER BY HotelName";

        cboHotels.DataSource = General.MyRst(strSQL);
        cboHotels.DataBind();
        cboHotels.Items.Insert(0, "Select Hotel");

    }

所以,请注意我是如何将设置代码和数据加载代码 Package 在!IsPostBack code stub.
因此,额外的按钮点击,或额外的回发的网页将不重要,因为与!IsPostBack代码存根,即数据代码的设置和加载将只在第一次运行,并在第一个真正的真实的页面加载。
由于设置和数据加载代码在!IsPostBack存根,那么额外的按钮点击和回发就不重要了,更重要的是不要覆盖组合框设置,因为每次重新加载和重新绑定组合框当然会导致该控件中当前选定值的丢失。
所以,虽然使用页面加载事件来加载数据是很好的,也很常见,但设置控件时要使用一些默认值等?
好吧,请记住,您的软件必须在每次回发时都触发页面加载,并在给定控制事件的代码存根运行之前运行。
因此,通过上面的方法,页面加载将运行多次并不重要,并且几乎一直运行,因为我们的数据加载和设置代码只在第一次真实的页面加载时运行,并且由于具有!IsPostBack code stub.
不用说,我会说,在我创建的最后200多个网页中,有199个肯定是!IsPostBack代码存根,事实上,如果没有它,您真的无法构建或设计一个工作的Web表单页面!页面加载事件中的IsPostBack代码存根。

相关问题