ASP文本框未更新,何时检查PostBack?

4

问题

<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?我什么时候需要检查它呢?

3个回答

4
在页面加载时,您应该使用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是您需要检查是否为postback的唯一位置,因为按钮事件只能由postback触发。

1

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

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

我建议您也可以阅读一下关于asp.net页面生命周期的相关知识。

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


1

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

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

    }
}

当您点击按钮时,您会提交您的数据 => (IsPostBack == true) => (! IsPostBack == false) => 他不会经过初始化阶段。

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