c# - los cuadros de texto pierden valor en la devolución de datos
javascript asp.net (7)
Los cuadros de texto
<input>
no guardarán su estado después de la devolución de datos. ASP.NET no maneja eso por ti.Si coloca el código en su evento Page_Load para establecer los valores de los cuadros de texto ASP.NET, los valores que se publicaron no se guardarán, ya que Page_Load ocurre después de que los estados de control secundarios se restauran en el ciclo de vida de la página ASP.NET . ASP.NET ya ha restaurado los valores, pero está sobrescribiendo sus valores restaurados.
Lo correcto para corregir el # 2 es verificar
Page.IsPostBack
antes de cargar su estado inicial, como esto:if ( !Page.IsPostBack ) { // set the textbox initial states from the database }
ACTUALIZAR:
Hay dos maneras de resolver el problema # 1. Una cosa que podría hacer es usar la colección Request.Form [] para recuperar el valor publicado de forma manual, como esto:
string strDate = Request.Form["id_of_input_element"].ToString();
La otra cosa que podría hacer, y esto es lo que recomendaría si pudiera, es cambiar el elemento <input>
a un cuadro de texto ASP.NET, y conectar cualquier evento de Javascript del lado del cliente a eso. Entonces ASP.NET manejará completamente su devolución de datos.
Tengo aproximadamente 4 cuadros de texto en mi página web ... algunos son asp: cuadros de texto mientras que otros son tipo de entrada = "texto".
el cuadro de texto de entrada se rellena a través de un control de calendario emergente javascript mientras que el cuadro de texto asp.net se rellena escribiendo. Los valores iniciales de estos cuadros de texto se recuperan de una base de datos.
Cuando un usuario cambia estos valores, no se guardan y los cuadros de texto se borran después de hacer clic en el botón Enviar. Por favor ayuda a resolver esta confusión. Gracias.
Gracias por su respuesta, pero todavía no funciona ...
He puesto este código en mi evento de carga de página
if (Page.IsPostBack)
{
if (ViewState["stock"] != null)
TextBoxMaterial.Text = ViewState["stock"].ToString();
if (ViewState["supplier"] != null)
TextBoxSupplier.Text = ViewState["supplier"].ToString();
if(ViewState["matTime"] != null)
TextBoxMatTime.Text = ViewState["matTime"].ToString();
if(ViewState["prodTime"] != null)
TextBoxProdTime.Text = ViewState["prodTime"].ToString();
if (ViewState["shipTime"] != null)
TextBoxShipTime.Text = ViewState["shipTime"].ToString();
if(ViewState["cmr"] != null)
cmrDue.Value = ViewState["cmr"].ToString();
if(ViewState["kc"] != null)
kcDue.Value = ViewState["kc"].ToString();
}
y también coloque el siguiente código en el evento onclick para el botón
ViewState["stock"] = TextBoxMaterial.Text;
ViewState["supplier"] = TextBoxSupplier.Text;
ViewState["matTime"] = TextBoxMatTime.Text;
ViewState["prodTime"] = TextBoxProdTime.Text;
ViewState["shipTime"] = TextBoxShipTime.Text;
ViewState["cmr"] = cmrDue.Value.ToString();
ViewState["kc"] = kcDue.Value.ToString();
string prodLine = DDProdLine.SelectedValue;
string stock1 = DDMaterial.SelectedValue;
string stock2 = ViewState["stock"].ToString();
string supplier = ViewState["supplier"].ToString();
string billet = RBBillet.SelectedValue;
string matTime1 = ViewState["matTime"].ToString();
string matTime2 = DDMatTime.SelectedValue;
string prodTime1 = ViewState["prodTime"].ToString();
string prodTime2 = DDProdTime.SelectedValue;
string shipTime1 = ViewState["shipTime"].ToString();
string shipTime2 = DDShipTime.SelectedValue;
CultureInfo cultureInfo = CultureInfo.CurrentCulture;
string format = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern.ToString();
string cmr = ViewState["cmr"].ToString();
string kc = ViewState["kc"].ToString();
string x = cmr.Substring(3, 2);
string y = cmr.Substring(0, 2);
string z = cmr.Substring(6, 4);
string x1 = kc.Substring(3, 2);
string y1 = kc.Substring(0, 2);
string z1 = kc.Substring(6, 4);
string finalCmr = x + "/" + y + "/" + z;
string finalKC = x1 + "/" + y1 + "/" + z1;
DateTime dt = DateTime.ParseExact(finalCmr, format, cultureInfo);
DateTime cr = DateTime.ParseExact(finalKC, format, cultureInfo);
string custDate = dt.ToString("dd/mm/yyyy");
string kcDate = cr.ToString("dd/mm/yyyy");
string id = Request.QueryString["id"];
bool success = true;
TextBoxProdComment1.Text = stock2 + "," + supplier + matTime1 + "," + prodTime1 + "," + shipTime1 + "," + custDate
+ "," + kcDate;
try
{
success = CRTopButtons.SaveProdTable(id, prodLine, stock1, supplier, billet, matTime1, matTime2, prodTime1,
prodTime2, shipTime1, shipTime2, custDate, kcDate);
}
catch (Exception e)
{
TextBoxProdComment2.Text = e.Message;
System.Diagnostics.Trace.Write(e.StackTrace);
}
los cuadros de texto aún se borran y ninguno de ellos es de solo lectura ..........
por favor ayuda
Encontré esto cuando buscaba una respuesta al mismo tipo de problema y ahora que encontré mi problema, pensé que podría ayudar a alguien más a ponerlo aquí.
en mi caso, tenía una etiqueta <form>
dentro de la <form>
de mis controles, así que, si no resolvió su problema con la búsqueda anterior, sugiero una pérdida de <form>
dentro de su <form>
.
Espero que sirva para algunos casos.
Otra cosa con la que me encontré ... Si está utilizando un control TextBox de ASP.NET (por ejemplo), y está READONLY o DISABLED, la devolución de datos no detectará el valor modificado.
Por mi problema, estaba cambiando el valor del control a través de javascript e incluso a pesar de que el navegador representaba el cambio, en la devolución, el control aún conservaba el valor original.
Parece un problema común también ... javascript inicia un control de calendario ASCX personalizado y el resultado es inyectado por javascript en el cuadro de texto. No se debe permitir a los usuarios modificar directamente el valor del cuadro de texto ...
string strDate = Request.Form["id_of_input_element"].ToString();
Finalmente utilicé lo anterior para um, "reinicié" el control, después de la devolución, a su valor cambiado.
Parece que tu viewstate está deshabilitado. Habilitar el viewstate en la directiva de página.
Si entiendo que estás pidiendo lo correcto, creo que estás tratando de hacer esos cuadros de texto de solo lectura. Si es así, tuve este problema antes y lo resolví haciendo que los cuadros de texto fueran de solo lectura utilizando C # no ASP.NET, solo agregué líneas como textboxName.Attributes.Add("readonly", "readonly");
en el Page_Load y funcionó bien. Esta solución encontré aquí en
Tuve un problema similar y la Solución a "La pérdida de datos modificados por javascript durante la devolución de datos" se describe mejor en este artículo ViewState y Readonly Property of Textbox
por ejemplo, digamos que tenemos este control de asp.net:
<asp:TextBox ID="txtName" runat="server" EnableViewState= "false" ReadOnly="true" />
si cambia el valor de este control a través de javascript en el lado del cliente, no se propagará a través de la devolución de datos en el servidor ... haga lo que haga con javascript a menos que elimine readonly = "true". Ahora hay una solución a este problema como se describe en el artículo anterior.
Simplemente pon esto en el evento PageLoad
if (!IsPostBack)
txtName.Attributes.Add("readonly","readonly");
y tu estas listo. Simplemente no olvides eliminar ReadOnly = "true" o Enable = "false" si tu intención era deshabilitar el control de la edición, solo usa el fragmento de código de arriba. No olvides eliminar Enable = "false" si lo pones.
en lugar de TextBoxPassword.Text=Password
utilizar
TextBoxPassword.Attributes["value"]=Password