【问题标题】:Run the button event handler before page_load在 page_load 之前运行按钮事件处理程序
【发布时间】:2023-04-05 20:53:02
【问题描述】:

我有一张表,里面有我数据库中的所有对象。我将它们加载到我的 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
        }

【问题讨论】:

  • 你不能在page_load之前有点击事件,但我不明白这个问题是如何通过使用IsPostBack解决的?
  • 是的,但是如果我有 12 个按钮调用呢?然后,我将拥有 12 个 if 子句,而不是 12 个函数。
  • 真的不明白,你将只有一个 if:IsPostBack,如果为 true,则不要在 OnLoad 中执行代码,而按钮单击事件将完成它的业务。按钮点击事件仍然会发生
  • 如果我不执行该函数,我将如何再次用数据库中的数据填充表?
  • 好吧,我没有看到你所有的代码,但如果你填充像 gridview 这样的控件,可能不需要这样做,因为它们会在视图状态中维护这些数据。或者您可以调用填充按钮单击事件。无意冒犯,但您应该熟悉 ASP.NET Web 表单中的常见模式:asp.net/web-forms。或者更好的是尝试 ASP.NET MVC

标签: c# asp.net


【解决方案1】:

也许您应该尝试在 PreRender 期间加载数据而不是加载

    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 :没有完整的代码很难回答。我假设“从 DB 加载数据”还包括数据绑定部分(设置控件 DataSource 并调用 DataBind)如果您在加载期间仍然执行部分绑定。它行不通。此外,预渲染不会在不可见的控件上触发。
  • 我在我的 LoadData 函数(你的 Page_PreRender 函数)中进行绑定
【解决方案2】:

您可以检查事件目标并执行您需要的操作:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
         string eventTarget = Page.Request.Params["__EVENTTARGET"];
         if(whatever)
         {
             //do your logic here
         }
    }
}

Get control name in Page_Load event which make the post back

【讨论】:

    【解决方案3】:

    使用Page_PreRenderComplete 事件检索您的表。这样一来,在所有用户事件触发后,您的页面将始终拥有可用的最新数据。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        一个老问题,但我在我的 C#/ASP.NET 网站的主/内容页面中遇到了同样的问题:单击主页面上的链接应该更改内容页面上网格视图的查询参数。正如您所说,按钮单击事件在 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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 2011-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-02
          • 1970-01-01
          相关资源
          最近更新 更多