<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
。我在创建新记录之前检查过,我在更新记录之前检查过。我结合了所有这些东西。我倒了他们。无论我尝试过什么,都会发生以下两种情况之一:
这个特定的问题实际上是一个更大问题的症状 - 我(有点)理解PostBack
是是什么,但是并不真正理解导致什么它。在这种情况下,什么导致PostBack,我什么时候需要检查它?
答案 0 :(得分:3)
在你的页面加载中,你应该检查它是否是使用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确实是唯一需要检查以查看它是否为回发的地方,因为按钮事件只能通过回发触发。
答案 1 :(得分:1)
在首次初始化表单之前检查页面加载是否为回发。
if (!Page.IsPostBack && Request.QueryString["Drug_INDEX"] != null)
我还建议阅读asp.net页面生命周期的工作原理。
答案 2 :(得分:1)
确实你有PostBack问题,当你第一次加载数据时,你必须放在!的IsPostBack。
if(!IsPostback)
{
//First Load
//Initialize Data
if (Request.QueryString["Drug_INDEX"] != null)
{
........
}
}
点击按钮后,您发布数据=&gt; (IsPostBack == true)=&gt; (!IsPostBack == false) =&GT;他没有通过这个初始化阶段