【问题标题】:textboxes lose value on postback文本框在回发时失去价值
【发布时间】:2011-08-17 16:30:18
【问题描述】:

我的网页上有大约 4 个文本框...有些是 asp:textboxes,而另一些是 input type="text"。

输入文本框通过 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);
            }

文本框仍然被清除,并且没有一个是只读的............

请帮忙

【问题讨论】:

  • 你想如何拯救他们?您能用最少的代码重现问题并在此处分享该代码吗?
  • 标准输入控件是否在服务器上运行(即 runat="server")?
  • 视图状态是否启用?你能添加javascript代码和页面加载代码吗?
  • 什么事件正在从数据库中填充文本框?是在 Page_Load 期间吗?
  • 我猜您实际上是在尝试在页面加载中设置它们的值,因此在回发时清除这些值 - 您可能需要在您所在的代码周围添加一条语句 if(!IsPostBack)试图从数据库中设置值。

标签: c# javascript asp.net


【解决方案1】:

我遇到了类似的问题和“在回发期间丢失由 javascript 更改的数据”的解决方案 这篇文章描述得最好 ViewState and Readonly Property of Textbox

例如,假设我们有这个 asp.net 控件:

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

如果您在客户端通过 javascript 更改此控件的值,它将不会通过服务器端的回发传播...无论您使用 javascript 做什么,除非您删除 readonly="true"。现在有了上面文章中描述的这个问题的解决方案。

只需将其放入 PageLoad 事件中

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

你就完成了。如果您的意图是禁用控件进行编辑,请不要忘记删除 ReadOnly="true" 或 Enable="false" ,只需使用上面的 sn-p 即可。如果你戴上它,不要忘记删除 Enable="false"。

【讨论】:

  • 你先生让我很开心。这让我发疯了。 +1
  • 嗯不应该是txtName.Attribute.Add("readonly","true");?
  • Attribute 重命名为Attributes
【解决方案2】:

我遇到的另一件事...如果您使用的是 ASP.NET 文本框控件(例如),并且它是 READONLY 或 DISABLED,则回发不会捕获更改的值。

根据我的问题,我正在通过 javascript 更改控件的值,即使浏览器呈现了更改,在回发时,控件仍保留原始值。

似乎也是一个常见问题... javascript 启动了自定义 ASCX 日历控件,结果由 javascript 注入到文本框中。不应允许用户直接修改文本框的值...

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

我最终使用上面的方法来“重置”控件,在回发之后,将其更改为值!

【讨论】:

    【解决方案3】:
    1. &lt;input&gt; 文本框在回发后不会保存其状态。 ASP.NET 不会为您处理。

    2. 1234563 @。这些值已由 ASP.NET 恢复,但您正在覆盖它们恢复的值。
    3. 修复 #2 的正确方法是在加载初始状态之前检查 Page.IsPostBack,如下所示:

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

    更新:

    有两种方法可以解决问题 #1。您可以做的一件事是使用 Request.Form[] 集合手动检索回发的值,如下所示:

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

    您可以做的另一件事,如果可以的话,我会建议您这样做,就是将&lt;input&gt; 元素更改为 ASP.NET 文本框,并将任何客户端 Javascript 事件与该文本框挂钩。然后 ASP.NET 将完全处理您的回发。

    【讨论】:

    • 哇!非常感谢你,你帮助了我,我非常沮丧地试图弄清楚为什么我所有的表单值在回发时都是空白的!我使用了 Page.IsPostBack 变量,解决了这个问题。最初我没有意识到即使在回发时 ASP.net 也会再次调用“Page_Load”方法!我有一种方法可以在页面加载时自动清除表单,这也可以在回发时清除表单!非常感谢!
    • 我的问题通过检查这个问题/条件同样得到了解决。我忘记在我的一个 DropDownList 控件上设置 AutoPostBack,因此当我单击按钮时它覆盖了 TextBox 值,因为当时它试图填充文本框,从而擦除用户所做的更改。
    【解决方案4】:

    我在寻找相同类型问题的答案时发现了这个,现在我发现了我的问题,我认为它可以帮助其他人把它放在这里。

    在我的情况下,我在控件的 &lt;form&gt; 中有一个标签 &lt;form&gt;,因此,如果您没有解决上述问题,我建议搜索丢失在您的 &lt;form&gt; 中的 &lt;form&gt;

    希望它对某些情况有所帮助。

    【讨论】:

      【解决方案5】:

      如果我得到您的要求,我认为您正在尝试将这些文本框设为只读。如果是这样,我之前遇到过这个问题,并通过使用 C# 而不是 ASP.NET 使文本框只读来解决它,我只是在 Page_Load 中添加了像 textboxName.Attributes.Add("readonly", "readonly"); 这样的行,它工作得很好。我在Stackoverflow 上找到的这个解决方案

      【讨论】:

        【解决方案6】:

        而不是TextBoxPassword.Text=Password

        使用

        TextBoxPassword.Attributes["value"]=Password
        

        【讨论】:

          【解决方案7】:

          您的视图状态似乎已禁用。在 Page 指令中启用视图状态。

          【讨论】:

          • 你确定问题是视图状态?
          • 对我来说,视图状态似乎有问题,因为视图状态实际上负责在回发时获取数据。同样,如果我们开启了视图状态,则不需要每次都重新绑定数据表,因此不会在每次回发时都 ping 数据库。但是保持视图状态可能是灾难性的,并且页面上存在整个数据,因此如果视图状态持有大量数据,则页面检索较晚
          • 请查看我上面的代码并告诉我我做错了什么...谢谢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-29
          相关资源
          最近更新 更多