¿Por qué ASP.NET envía el valor original de un control TextBox cuando se han cambiado los contenidos?

Tengo un formulario web que permite al usuario modificar datos en ciertos campos (en su mayoría controles de TextBox, con un par de controles CheckBox, DropDownList y un control RadioButtonList) con un botón de envío para guardar los cambios. Cosas bastante estándar. El problema es que necesito hacer un seguimiento de los campos que modificaron. Por lo tanto, estoy usando los controles HiddenField de ASP.NET para almacenar el valor original y luego enviarlo comparándolo con el valor del control TextBox correspondiente (por ejemplo) para determinar qué campos se han modificado.

Sin embargo, cuando envío el formulario y hago la comparación, el valor del control TextBox en el código subyacente aún refleja el valor original, aunque haya cambiado el contenido del TextBox, por lo que no está registrando el cambio. Este es un ejemplo de un conjunto de emparejamientos TextBox / HiddenField (en este caso, último, primer nombre, segundo nombre) en mi formulario ASP.NET:

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

Estoy configurando los valores originales de todos estos controles (".Text" para los controles TextBox, ".Value" para los controles HiddenField) en PageLoad en el código que está detrás.

Aquí hay un ejemplo de dónde estoy haciendo la comparación cuando envío el formulario (estoy agregando el nombre del campo, el valor antiguo y el nuevo valor a los objetos List <string> si los valores son diferentes):

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

Pero cuando introduzco un nuevo valor en el control TextBox y hago clic en Enviar:

Luego paso a través del código en el depurador, me muestra que el valor del control sigue siendo el valor antiguo:

¿Por qué ocurre la comparación con el valor original del TextBox aunque el nuevo valor está ahí cuando hago clic en el botón de envío?

Actualización: @David recibe el crédito por esto, a pesar de que no lo publicó como una respuesta. Me olvidé de incluir el método para el llenado previo de los valores originales de los controles en un cheque para IsPostBack; Debería haberlo sabido mejor, ¡he estado haciendo esto durante bastante tiempo!

Respuestas a la pregunta(4)

Su respuesta a la pregunta