【问题标题】:Button Submit calls Onload first!按钮提交首先调用 Onload!
【发布时间】:2011-03-31 12:27:10
【问题描述】:

我的网络表单有问题。

我的目标:最初,当页面加载时,它必须将每个文本框都加载为空。填写完信息点击提交后,必须提交(UpdatePaymentInfo())

问题:这里,当用户填写信息并点击提交时,它甚至在提交按钮之前调用onload函数并将所有文本框清空。

代码如下:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    string QueryStringupdatecreditcard1 = Request.QueryString.ToString();

    if (String.Equals(QueryStringupdatecreditcard1, "tabID=B"))
    {
        divTitle.Visible = false;
        trmain.Visible = false;
        tdOrderSummary.Visible = false;
        trCCandBilling.Visible = true;
        trtest2.Visible = false;
        divUpdatecreditcard.Visible = true;
        trusecompaddress.Visible = false;

        txtFirstName.Text = "";
        txtLastName.Text = "";
        txtAddress1.Text = "";
        txtAddress2.Text = "";
        txtCity.Text = "";
        txtZip.Text = "";
        txtCardNo.Text = "";
        txtVccNumber.Text = "";
        trAmountCharged.Visible = false;
    }
}

protected void imgbtnSubmit_Click(object sender, ImageClickEventArgs e)
{
    try
    {
        UpdatePaymentInfo();
    }
}

【问题讨论】:

  • 欢迎来到令人讨厌的 Web 表单世界 :) 有时可以查看 MVC 的 ASP .NET 实现,它比 Web 表单更有意义。 (我评论而不是回答,因为已经有很多答案,所有这些都说明了将代码包装在条件句中并假装没问题的推荐“解决方案”。)

标签: c# asp.net


【解决方案1】:

将 OnLoad 方法的当前内容包装在:

if (!Page.IsPostBack)
{
    // Code in here will only be executed when the page is *not* being loaded by a postback
}

这是因为,根据ASP.NET Page Life Cyle,您在此实例中关心的事情按此顺序发生:

Load - 在加载期间,如果当前请求是回发,则控制 属性加载了信息 从视图状态和控制中恢复 状态。

回发事件处理 - 如果请求是回发,则控制事件 处理程序被调用。在那之后, 所有验证器的验证方法 控件被调用,它设置 个人的 IsValid 属性 验证器控件和页面。

所以会发生什么(稍微简化):

  1. 点击图片按钮,触发回发。
  2. 表单中的数据已加载到您的控件中。
  3. 您的 OnLoad 方法会覆盖控件中的值以清除它们。
  4. 您的点击处理程序已运行,但由于第 3 步,它看到了空值。

正如其他人所提到的某种,在您执行此操作时重构您的 OnLoad 方法不一定是坏事。目前你似乎让它做两件不同的事情:

  • 清除文本字段
  • 设置字段的可见性

可能值得将其分成一两个(取决于可见性设置和字段清除是否独立完成)单独的方法并调整您的 OnLoad 方法,使其看起来像这样:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (!Page.IsInPostBack)
    {
        SetFieldVisibility();
        ClearFields();
    }
}

【讨论】:

    【解决方案2】:

    Page_Load 总是发生。

    请参阅Page Lifecycle 上的文档

    您需要做的是检查 Page_Load 是否由 Postback 触发。

    private void Page_Load(object sender, System.EventArgs e)
    {
        if(!Page.IsPostBack)
        {
           ///do stuff in here that you want to occur only on the first lad.
        }
        else
        }
           // code that you want to execute only if this IS a postback here.
        {
    
     }
    
    // do stuff you want to do on Page_Load regardless of postback here.
    }
    

    【讨论】:

    • +1 来自我(往复时间 =),提到页面生命周期,它提示我添加它,加上相关位和我的答案的“演练”=)
    • 在代码 sn-p.. =) 正上方的行中还有一个小错字
    【解决方案3】:

    如果是这种情况,您可能会使用数据绑定控件并将其设置为插入模式

    【讨论】:

      【解决方案4】:

      您考虑过使用IsPostBack 页面变量吗?

      protected override void OnLoad(EventArgs e)
      {
         if(!IsPostBack){
            //all your logic here.
         }
      }
      

      【讨论】:

        【解决方案5】:

        您是否尝试过将表单重置代码包装在检查页面是否为回发页面中?

        if(!Page.IsPostback) {
            // Do form reset here
        }
        

        【讨论】:

          【解决方案6】:

          您可以使用页面的IsPostBack属性如下:

          protected override void OnLoad(EventArgs e) {
            if (!Page.IsPostBack) { 
              EmptyTextBoxes();
            }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-18
            • 2013-12-21
            • 2021-09-29
            • 2013-10-01
            • 1970-01-01
            • 2011-09-05
            • 2016-10-11
            • 2017-05-17
            相关资源
            最近更新 更多