【问题标题】:ASP Textbox not updating, when to check PostBack?ASP 文本框不更新,何时检查 PostBack?
【发布时间】:2012-08-02 23:23:28
【问题描述】:

问题

<asp:TextBox> 没有更新。

背景

我有一个名为Add_Edit_Drugs.aspx 的页面。可以通过以下两种方式之一访问此页面:用户可以单击Add Drug 按钮,该按钮会触发Response.Redirect("Add_Edit_Drugs.aspx") 命令。或者,他们可以点击一个超链接,将他们发送到同一个页面,如下所示:

<asp:HyperLinkField
            DataNavigateUrlFields="Drug_INDEX"
            DataNavigateUrlFormatString="Add_Edit_Drugs.aspx?Drug_INDEX={0}"
            DataTextField="Drug_Name"
            HeaderText="Drug Name"
            />

Page_Load 事件检查查询字符串是否存在,如果存在,则使用数据库中的信息填充字段,否则将其留空:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString["Drug_INDEX"] != null)
    {
        String sIndex = Request.QueryString["Drug_INDEX"].ToString();

        if (!Int32.TryParse(sIndex, out Drug_INDEX)) //Query String not a valid index
        {
            errorMessage.Text = "There was an error retrieving the record.";
            message.Text = "Please contact you IT administrator.";
        }
        else
        {

            Drug_IO dio = new Drug_IO();
            SqlDataReader drugDataReader = dio.Get_Drug(Drug_INDEX);
            if (drugDataReader.Read())
            {
                drugNameTxt.Text = drugDataReader["Drug_Name"].ToString();
                descriptionTxt.Text = drugDataReader["DrugDescription"].ToString();
                toxTxt.Text = drugDataReader["Toxicity"].ToString();
                hlTxt.Text = drugDataReader["HalfLife"].ToString();
                hlUnitsTxt.Text = drugDataReader["HalfLife_Units"].ToString();
                bindingTxt.Text = drugDataReader["ProteinBinding"].ToString();
                logPTxt.Text = drugDataReader["LogP"].ToString();
                molecularWeightTxt.Text = drugDataReader["MolecularWeight"].ToString();
                molecularFormTxt.Text = drugDataReader["MolecularFormula"].ToString();
                chemicalForumlaTxt.Text = drugDataReader["ChemicalFormula"].ToString();
            }
        }
    }
}

然后我有我的saveBtn_Click 方法:

protected void saveBtn_Click(object sender, EventArgs e)
{
    double halfLife;
    if (!Double.TryParse(hlTxt.Text, out halfLife))
        halfLife = Double.NaN;

    double logP;
    if (!Double.TryParse(logPTxt.Text, out logP))
        logP = Double.NaN;

    double moleWeight;
    if (!Double.TryParse(molecularWeightTxt.Text, out moleWeight))
        moleWeight = Double.NaN;

    if (-1 == Drug_INDEX) // New record to be inserted
    {
        Drug_Record dr = new Drug_Record(
            drugNameTxt.Text,
            descriptionTxt.Text,
            toxTxt.Text,
            halfLife,
            hlUnitsTxt.Text,
            bindingTxt.Text,
            logP,
            moleWeight,
            molecularFormTxt.Text,
            chemicalForumlaTxt.Text);

        if (dr.saveToDataBase())
        {
            Response.Redirect("List_Drugs.aspx");
        }
        else
        {
            message.Text = "An error occured saving the record.";
            errorMessage.Text = "Please contact your system admin.";
        }
    }
    else //record already exists in db, needs to be updated
    {
        Drug_Record dr = new Drug_Record(
            drugNameTxt.Text,
            descriptionTxt.Text,
            toxTxt.Text,
            halfLife,
            hlUnitsTxt.Text,
            bindingTxt.Text,
            logP,
            moleWeight,
            molecularFormTxt.Text,
            chemicalForumlaTxt.Text,
            Drug_INDEX);

        if (dr.updateRecord())
        {
            Response.Redirect("List_Drugs.aspx");
        }
        else
        {
            message.Text = "An error occur updating the record.";
            errorMessage.Text = "Please contact your system admin.";
        }
    }
}

现在,我相信您已经猜到了,在我的 else //record already exists 块中,当我从用户编辑中获取(假定)新值时,我实际得到的是从数据库中检索到的原始信息.我从我所读到的内容中知道,问题在于是否Page.IsPostBack 的问题。我签入了Page_Load。我签入了saveBtn_Click。我在创建新记录之前检查过,我在更新记录之前检查过。我结合了所有这些东西。我把它们倒过来了。无论我尝试了什么,都会发生以下两种情况之一:

  1. 我得到了旧信息。
  2. 什么都没有。

这个具体问题实际上是一个更大问题的症状 - 我(有点)了解 PostBack 是什么,但并不真正了解它的原因 .在这种情况下,是什么导致了 PostBack,我什么时候需要检查它?

【问题讨论】:

    标签: c# asp.net postback


    【解决方案1】:

    在您的页面加载中,您应该使用Page.IsPostBack 检查它是否是回发,如果不是回发,那么您应该对页面进行初始加载。如果是回发,则页面上的某个控件已启动服务器端事件,例如按钮单击。

    在您的按钮单击中,您可以更新标签或文本框。每次回发都会调用页面加载,因此请确保不要运行两次初始化代码。

    看起来您的页面加载正在为每个回发运行初始化,而您只想在初始加载时运行它。试试这个修改:

    protected void Page_Load(object sender, EventArgs e)
    {
    
        if (!Page.IsPostBack) {
    
            if (Request.QueryString["Drug_INDEX"] != null)
            {
                String sIndex = Request.QueryString["Drug_INDEX"].ToString();
    
                if (!Int32.TryParse(sIndex, out Drug_INDEX)) //Query String not a valid index
                {
                    errorMessage.Text = "There was an error retrieving the record.";
                    message.Text = "Please contact you IT administrator.";
                }
                else
                {
    
                    Drug_IO dio = new Drug_IO();
                    SqlDataReader drugDataReader = dio.Get_Drug(Drug_INDEX);
                    if (drugDataReader.Read())
                    {
                        drugNameTxt.Text = drugDataReader["Drug_Name"].ToString();
                        descriptionTxt.Text = drugDataReader["DrugDescription"].ToString();
                        toxTxt.Text = drugDataReader["Toxicity"].ToString();
                        hlTxt.Text = drugDataReader["HalfLife"].ToString();
                        hlUnitsTxt.Text = drugDataReader["HalfLife_Units"].ToString();
                        bindingTxt.Text = drugDataReader["ProteinBinding"].ToString();
                        logPTxt.Text = drugDataReader["LogP"].ToString();
                        molecularWeightTxt.Text = drugDataReader["MolecularWeight"].ToString();
                        molecularFormTxt.Text = drugDataReader["MolecularFormula"].ToString();
                        chemicalForumlaTxt.Text = drugDataReader["ChemicalFormula"].ToString();
                    }
                }
            }
        }
    }
    

    现在发生的情况是,当 PostBack 发生时,它不会运行初始化代码,它会继续执行您的按钮单击事件,您可以在其中更新文本框的值。在这种情况下,PageLoad 确实是您需要检查它是否是回发的唯一地方,因为按钮事件只能由回发触发。

    【讨论】:

      【解决方案2】:

      在第一次初始化表单之前检查页面加载是否是回发。

      if (!Page.IsPostBack && Request.QueryString["Drug_INDEX"] != null)
      

      我还建议阅读一下 asp.net 页面生命周期的工作原理。

      http://msdn.microsoft.com/en-us/library/ms178472.aspx

      【讨论】:

        【解决方案3】:

        是的,你确实有 PostBack 问题,当你第一次加载数据时,你必须放在 !是回传。

        if(!IsPostback)
        {
           //First Load
           //Initialize Data
            if (Request.QueryString["Drug_INDEX"] != null)
            {
               ........
        
            }
        }
        

        当您单击按钮时,您发布数据 => (IsPostBack == true) => (!IsPostBack == false) => 他没有经过这个初始化阶段

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-01
          • 2012-01-15
          • 1970-01-01
          • 2012-12-28
          相关资源
          最近更新 更多