7

我有一个 Web 表单,允许用户使用提交按钮修改某些字段(主要是 TextBox 控件,带有几个 CheckBox、DropDownList 和一个 RadioButtonList 控件)中的数据以保存更改。很标准的东西。问题是,我需要跟踪他们修改了哪些字段。所以我使用 ASP.NET HiddenField 控件来存储原始值,然后在提交时将其与相应的 TextBox(例如)控件的值进行比较以确定哪些字段已被修改。

但是,当我提交表单并进行比较时,即使我更改了 TextBox 的内容,后面代码中 TextBox 控件的值仍然反映了原始值,因此它没有注册更改。以下是我的 ASP.NET 表单中一组 TextBox/HiddenField 配对的示例(在本例中为姓氏、名字、中间名):

<div id="editName" class="editField" style="display: none">
    <asp:TextBox ID="tbxLName" runat="server" class="editable"></asp:TextBox>,
    <asp:TextBox ID="tbxFName" runat="server" class="editable"></asp:TextBox>
    <asp:TextBox ID="tbxMName" runat="server" class="editable"></asp:TextBox>
    <asp:HiddenField ID="hdnLName" runat="server" />
    <asp:HiddenField ID="hdnFName" runat="server" />
    <asp:HiddenField ID="hdnMName" runat="server" />
</div>

我在后面的代码中的 PageLoad 上设置了所有这些控件的原始值(TextBox 控件的“.Text”,HiddenField 控件的“.Value”)。

这是我在提交表单时进行比较的示例(如果值不同,我将字段名称、旧值和新值添加到 List<string> 对象):

if (tbxLName.Text != hdnLName.Value)
{
    changes.Add("ConsumerLastName");
    oldVal.Add(hdnLName.Value);
    newVal.Add(tbxLName.Text);
}

但是当我在 TextBox 控件中输入一个新值并单击提交时:

在文本框中输入新值

然后单步调试调试器中的代码,它显示控件的值仍然是旧值:

调试器中 TextBox 的旧值

为什么当我单击提交按钮时,即使新值存在,也会与 TextBox 的原始值进行比较?

更新:@David 对此表示赞赏,尽管他没有将其作为答案发布——我忘记在检查 IsPostBack 时附上用于预填充控件原始值的方法;我真的应该知道更好,我已经这样做了很长一段时间了!

4

4 回答 4

17

您是否在 Page_Load 中检查 IsPostback 以便不覆盖 Postback 中发送的值?

于 2013-06-25T15:32:23.360 回答
2

确保您没有覆盖Page_Load方法中的值:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        someTextField = "Some Value";
    }
}

我花了一段时间才知道该Page_Load方法可以用作“在任何事情发生之前”方法,而不仅仅是当您访问带有GET.

于 2016-04-10T06:48:35.287 回答
0

确保您没有覆盖页面初始化中某处的文本框的值,或者在不检查 IsPostback 标志的情况下加载。

于 2013-06-25T15:33:40.137 回答
0

它可能由于回发而发生。如果您为未设置的文本框编码,!isPostBack则将其放入。

IE

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        tbxLName.Text="anything";
    }
}
于 2014-05-13T07:42:38.460 回答