2011-05-03 11 views
17

tengo alrededor de 4 cuadros de texto en mi página web ... algunos son asp: cuadros de texto, mientras que otros son de tipo de entrada = "texto".Los cuadros de texto pierden valor en la devolución de datos

el cuadro de texto de entrada se rellena a través de un control de calendario de javascript popup mientras que el cuadro de texto de asp.net se completa tecleando. 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 está funcionando .....

He puesto este código en mi página de evento de carga

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 poner 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 sigue siendo clara y nada de eso es de sólo lectura ..........

por favor ayuda

+1

¿Cómo está usted tratando de salvarlos? ¿Puedes reproducir el problema con un código mínimo y compartir ese código aquí? – David

+3

son los controles de entrada estándar ejecutados en el servidor (es decir, runat = "servidor")? – Curt

+0

¿Está habilitado ViewState? ¿Puedes agregar el código de JavaScript y el código de carga de la página? – Ivo

Respuesta

-1

Parece que su viewstate está deshabilitado. Habilite viewstate en la directiva de la página.

+1

¿Seguro que el problema es estado de visualización? –

+0

Para mí, parece ser un problema con viewstate. Bec viewstate es directamente responsable de recuperar los datos en la devolución de datos. De manera similar, si tenemos viewstate activado, datatable no necesita volverse a enlazar cada vez, por lo que no hará ping a la base de datos en cada devolución. Pero mantener ViewState puede ser desastroso, así como existe toda la información en la página, por lo tanto, la página se recupera tarde si el estado de viewstate –

+0

contiene mucha información. Consulte mis códigos y dígame qué estoy haciendo mal ... gracias – bee

5
  1. Los <input> cuadros de texto no va a salvar su estado después de la devolución de datos. ASP.NET no maneja eso por ti.

  2. Si coloca el código en su evento Page_Load para establecer los valores de las cajas de texto ASP.NET, los valores que se enviaron de nuevo no se guardarán, porque Page_Load ocurre después de que se restablecen los estados de control secundario en ASP.NET page lifecycle. Los valores ya están restaurados por ASP.NET, pero está sobrescribiendo sus valores restaurados.

  3. Lo que se debe hacer para solucionar # 2 es comprobar Page.IsPostBack antes de cargar a su estado inicial, de esta manera:

    if (!Page.IsPostBack) 
    { 
        // set the textbox initial states from the database 
    } 
    

ACTUALIZACIÓN:

Hay dos maneras de resolver un problema # 1. Una cosa que podría hacer es utilizar la colección Request.Form [] para recuperar el valor publicado de vuelta 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 me gustaría recomendar si puede, es cambiar el elemento <input> a un cuadro de texto ASP.NET y conectar cualquier evento Javascript del lado del cliente a eso. Entonces ASP.NET manejará completamente su devolución de datos.

+0

¡Wow! muchas gracias, me ayudaste, estaba muy frustrado tratando de descubrir por qué todos los valores de mi formulario estaban en blanco en la devolución de datos. Usé la variable Page.IsPostBack y eso resolvió el problema. Inicialmente, no me di cuenta de que incluso en postback ASP.net llamará nuevamente al método "Page_Load". Tenía un método que borraba el formulario automáticamente al cargar la página y esto también borraba el formulario en la devolución de datos también. Muchas gracias! – hypervisor666

+1

Mi problema se resolvió de manera similar al verificar este problema/condición. Olvidé configurar AutoPostBack en uno de mis controles DropDownList y sobrescribió el valor de TextBox cuando hice clic en el botón porque, en ese momento, estaba intentando llenar el cuadro de texto borrando los cambios que realizó el usuario. – cjbarth

3

encontré esto cuando busco 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 de que tuviera una etiqueta dentro de la <form><form> de mis controles, por lo que, si es que aún no ha resolver su problema con los anteriores me sugest buscar un <form> perdido dentro de su <form>.

espero que ayude en algunos casos.

8

Otra cosa con la que me encontré ... Si está usando un Control de TextBox ASP.NET (por ejemplo), y está READONLY o DISABLED, la devolución de datos no captará el valor modificado.

Según mi problema, estaba cambiando el valor del control a través de javascript y aunque el navegador realizó el cambio, en la devolución de datos, 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. Los usuarios no se les debe permitir modificar directamente el valor de texto ...

string strDate = Request.Form["id_of_input_element"].ToString(); 

en última instancia, he utilizado la anterior para um, "reset" el control, después de la devolución de datos, a la que ha cambiado el valor!

21

tuve un problema similar y la solución a "La pérdida de los datos modificados por javascript durante la devolución de datos" se describe mejor por este artículo ViewState and Readonly Property of Textbox

por ejemplo, digamos que tenemos este control 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 serverside ... cualquier cosa que hagas con javascript menos que se quite de sólo lectura = "true" . Ahora hay una solución a este problema como se describe en el artículo anterior.

En pocas palabras esto en el caso pageLoad

if (!IsPostBack) 
    txtName.Attributes.Add("readonly","readonly"); 

y ya está. Simplemente no se olvide de eliminar ReadOnly = "true" o Enable = "false" si su intención era deshabilitar el control de la edición solo use el fragmento de arriba. No olvides eliminar Enable = "false" si lo pones.

+2

Usted señor acaba de hacer mi día. Esto me estaba volviendo loco. +1 – PoweredByOrange

+0

¿Hmm no debería ser txtName.Attribute.Add ("readonly", "true");? – Fandango68

+0

Cambiar el nombre 'Attribute' a' Attributes'. – Jess

0

Si recibo que está preguntando por la derecha, creo que está tratando de hacer esos cuadros de texto de solo lectura. Si es así, tuve este problema antes y lo resolví haciendo que las cajas de texto solo se utilizaran con C#, no ASP.NET, simplemente agregué líneas como textboxName.Attributes.Add("readonly", "readonly"); en Page_Load y funcionó bien. Esta solución que encontré aquí en Stackoverflow

0

en lugar de TextBoxPassword.Text=Password

uso

TextBoxPassword.Attributes["value"]=Password 
Cuestiones relacionadas