按钮提交呼叫先加载!

时间:2010-08-18 11:56:51

标签: c# asp.net

我遇到网络表单问题。

我的目标:最初加载页面时,必须将每个文本框加载为空。填写信息并单击提交后,必须提交(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();
    }
}

6 个答案:

答案 0 :(得分:9)

将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,您在此实例中关注的事情按此顺序发生:

  

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

     

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

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

  1. 单击图像按钮,触发回发。
  2. 表单中的数据会加载到您的控件中。
  3. 您的OnLoad方法会覆盖控件中的值以清除它们。
  4. 您的点击处理程序已运行,但由于步骤3,它会看到空值。
  5. 正如其他人提到 sort-of 一样,在你这样做时重构你的OnLoad方法并不一定是件坏事。目前你似乎做了两件不同的事情:

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

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

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
    
        if (!Page.IsInPostBack)
        {
            SetFieldVisibility();
            ClearFields();
        }
    }
    

答案 1 :(得分:3)

Page_Load总是会发生。

请参阅Page Lifecycle

上的文档

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

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.
}

答案 2 :(得分:1)

您可以使用Page的IsPostBack属性,如下所示:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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