Текстовые поля теряют ценность при обратной передаче

У меня есть около 4 текстовых полей на моей веб-странице... некоторые из них asp: textboxes, а другие - тип ввода = "текст".

входное текстовое поле заполняется с помощью элемента управления календаря javascript, в то время как текстовое поле asp.net заполняется путем ввода. Исходные значения этих текстовых полей извлекаются из базы данных.

Когда пользователь изменяет эти значения, они не сохраняются и текстовые поля очищаются после нажатия кнопки отправки. Пожалуйста, помогите решить эту путаницу. Спасибо.

спасибо за ваш ответ, но он все еще не работает.....

Я поместил этот код в событие загрузки страницы

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();

}

а также поместите код ниже в событии onclick для кнопки

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);
            }

текстовые поля все еще очищаются, и ни одно из них не является readonly..........

пожалуйста, помогите

Ответы

Ответ 1

У меня была аналогичная проблема, и решение "Потеря данных была изменена javascript во время обратной передачи" лучше всего описывается в этой статье Свойство ViewState и Readonly для текстового поля

например, скажем, у нас есть это управление asp.net:

<asp:TextBox ID="txtName" runat="server" EnableViewState= "false" ReadOnly="true" /> 

если вы измените значение этого элемента управления через javascript на стороне клиента, он не будет распространяться через postback на сервере... что бы вы ни делали с javascript, если вы не удалите readonly = "true". Теперь есть решение этой проблемы, как описано в статье выше.

Проще говоря, это в событии PageLoad

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

и все готово. Просто не забудьте удалить ReadOnly = "true" или Enable = "false", если ваше намерение было отключить элемент управления от редактирования, просто используйте фрагмент выше. Не забудьте удалить Enable = "false", если вы положите его.

Ответ 2

Еще одна вещь, с которой я столкнулся... Если вы используете элемент управления TextBox ASP.NET(например), и он READONLY или DISABLED, postback не поймает измененное значение.

В моей проблеме я менял значение элемента управления через javascript, и даже несмотря на то, что браузер сделал это изменение, после обратной передачи элемент управления все еще сохранил исходное значение.

Кажется, тоже распространенная проблема... javascript запускает пользовательский элемент управления календарем ASCX, а результат вводится javascript в текстовое поле. Пользователям не разрешается напрямую изменять значение текстового поля...

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

В конечном итоге я использовал вышеописанное значение um, "reset", после обратной передачи ему было изменено значение!

Ответ 3

  • Текстовые поля <input> не сохраняют свое состояние после обратной передачи. ASP.NET не обрабатывает это для вас.

  • Если вы поместите код в свое Page_Load событие для установки значений текстовых полей ASP.NET, значения, которые были отправлены назад, не будут сохранены, потому что Page_Load происходит после восстановления дочерних состояний управления в Жизненный цикл страницы ASP.NET. Значения уже восстановлены ASP.NET, но вы перезаписываете их восстановленные значения.

  • Правильная вещь для исправления № 2 - проверить Page.IsPostBack перед загрузкой исходного состояния, например:

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

UPDATE:

Существует два способа решения проблемы №1. Одна вещь, которую вы можете сделать, - это использовать коллекцию Request.Form [] для извлечения возвращаемого значения вручную, например:

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

Другое, что вы могли бы сделать, и это то, что я бы рекомендовал, если вы можете, - изменить элемент <input> на текстовое поле ASP.NET и подключить к нему любые события Javascript на стороне клиента. Затем ASP.NET полностью обработает вашу обратную передачу.

Ответ 4

Я нашел это, когда искал ответ на тот же тип проблемы, и теперь, когда я нашел свою проблему, я подумал, что это может помочь кому-то еще положить ее сюда.

в моем случае у меня был тег <form> внутри <form> моих элементов управления, поэтому, если вы не решили свою проблему с помощью вышеприведенного я sugest поиска <form>, потерянного внутри вашего <form>.

надеюсь, что это поможет в некоторых случаях.

Ответ 5

Если я хочу, чтобы вы просили права, я думаю, вы пытаетесь сделать эти текстовые поля только для чтения. Если это так, у меня была эта проблема до этого и она была решена, сделав текстовые поля только с помощью С#, а не ASP.NET, я просто добавил строки, такие как textboxName.Attributes.Add("readonly", "readonly"); в Page_Load, и все получилось просто отлично. Это решение я нашел здесь на fooobar.com/questions/88338/...

Ответ 6

вместо TextBoxPassword.Text=Password

использование

TextBoxPassword.Attributes["value"]=Password

Ответ 7

Кажется, что ваше viewstate отключено. Включите viewstate в директиве страницы.