在页面加载之前运行按钮事件处理程序

5
我有一个包含所有数据库对象的表格。我在Page_Load函数中加载它们。我有一个文本字段和一个按钮,当点击按钮时,我希望单击处理程序将一个新对象放入具有文本字段中名称的数据库中。
现在,我希望单击后发生的是页面重新加载,并在表格中添加新项。问题在于,按钮事件处理程序在Page_Load函数之后运行。
解决此问题的方法是在Page_Load中使用IsPostBack或使用预加载函数。问题是,如果我有3个不同的按钮,我必须区分它们而不是拥有3个不同的便捷函数。
有没有不会出现这个问题的解决方案?
代码:
protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["userId"] == null)
                Response.Redirect("Login.aspx");

            // LOAD DATA FROM DB
        }

        protected void CreateObject(object sender, EventArgs e)
        {
            // SAVE THE NEW OBJECT
        }

3
在页面加载之前无法有点击事件,但我不明白如何使用IsPostBack无法解决这个问题? - Antonio Bakula
这是可以的,但如果我有12个按钮调用怎么办?那么我将不是有12个函数,而是有12个if语句。 - Vadiklk
真的不理解,你只会有一个if:IsPostBack,如果为true,则不执行OnLoad中的代码,而按钮单击事件将完成其业务。按钮单击事件仍将发生。 - Antonio Bakula
1
如果我不执行函数,我该如何再次从数据库中填充表格数据? - Vadiklk
虽然我没有看到你的所有代码,但如果你填充像GridView这样的控件,也许就不需要。它们将在视图状态中维护此数据。或者,您可以在按钮单击事件中调用填充操作。请别介意,但你应该熟悉ASP.NET Web Forms中的常见模式:http://www.asp.net/web-forms。更好的选择是尝试ASP.NET MVC。 - Antonio Bakula
5个回答

9
也许你应该在 PreRender 而不是 Load 期间尝试加载数据。
    protected void Page_Load(object sender, EventArgs e)
    {
        this.PreRender += Page_PreRender
        if (Session["userId"] == null)
            Response.Redirect("Login.aspx");
    }

    protected bool reloadNeeded {get; set;}

    protected void CreateObject(object sender, EventArgs e)
    {
        // SAVE THE NEW OBJECT
        reloadNeeded = true;
    }


    protected void Page_PreRender(object sender, EventArgs e)
    {
        if(reloadNeeded || !IsPostBack)
        // LOAD DATA FROM DB
    }

我喜欢你的解决方案,但似乎它并不能正常工作。它进入了函数,但是没有在表格中显示数据,即使是第一次也没有。也许是因为我调用了 Page_PreRender、LoadData? - Vadiklk
@Vadiklk:没有整个代码很难回答。我假设“从数据库加载数据”也包括数据绑定部分(设置控件数据源并调用DataBind)。如果您仍然在Load期间执行部分绑定,它将无法正常工作。此外,预呈现不会触发不可见控件上的操作。 - jbl
我在我的LoadData函数中进行绑定(即您的Page_PreRender函数)。 - Vadiklk

2
您可以检查事件目标,然后执行所需的操作:
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
         string eventTarget = Page.Request.Params["__EVENTTARGET"];
         if(whatever)
         {
             //do your logic here
         }
    }
}

获取 Page_Load 事件中导致回发的控件名称


0
一个老问题,但我在我的C#/ASP.NET网站中遇到了同样的问题:在主/内容页面上单击链接应该更改内容页面上gridview的查询参数。正如您所述,按钮单击事件是在Page_Load之后处理的。但它是在Page_LoadComplete之前处理的(请参见ASP.NET Page Life Cycle的信息),因此您可以在那里更改页面内容。
在我的情况下,我通过在主页面的单击事件中设置会话变量,在内容页面的Page_LoadComplete事件中获取此变量,并基于此进行数据绑定来解决了这个问题。 主页面:
<asp:LinkButton ID="Btn1" runat="server" OnCommand="LinkCommand" CommandArgument="1" >Action 1</asp:LinkButton>
<asp:LinkButton ID="Btn2" runat="server" OnCommand="LinkCommand" CommandArgument="2" >Action 2</asp:LinkButton>

protected void LinkCommand(object sender, CommandEventArgs e)
{
  HttpContext.Current.Session["BindInfo", e.CommandArgument.ToString());
}

内容页面:

protected void Page_LoadComplete(object sender, EventArgs e)
{
  string BindInfo = HttpContext.Current.Session["BindInfo"].ToString();
  YourBindDataFunction(BindInfo);
}

0
使用Page_PreRenderComplete事件来检索您的表格。这样,当所有用户事件都触发后,您的页面将始终具有最新的可用数据。

0
为什么不将你在点击事件中的内容移动到一个新方法中,然后在页面加载时将该方法作为第一行调用呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接