文本框在回发时失去价值

时间:2011-05-03 12:29:34

标签: c# javascript asp.net

我的网页上有大约4个文本框...有些是asp:文本框,有些是输入类型=“文本”。

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

文本框仍然清晰,没有一个是只读..........

请帮助

7 个答案:

答案 0 :(得分:26)

我有一个类似的问题和解决方案“在回发期间因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”,只需使用上面的代码段。如果你把它打开,别忘了删除Enable =“false”。

答案 1 :(得分:9)

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

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

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

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

我最终使用了上面的内容,在回发后“重置”控件,改变了它的价值!

答案 2 :(得分:6)

  1. <input>文本框在回发后不会保存其状态。 ASP.NET无法为您处理。

  2. 如果将代码放在Page_Load事件中以设置ASP.NET文本框的值,则不会保存回发的值,因为在{{中恢复了子控件状态后发生Page_Load 3}}。这些值已由ASP.NET恢复,但您将覆盖其恢复的值。

  3. 修复#2的正确做法是在加载初始状态之前检查Page.IsPostBack,如下所示:

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

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

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

    您可以做的另一件事,如果可以的话,这就是我建议将<input>元素更改为ASP.NET文本框,并将任何客户端Javascript事件连接到该文本框。然后ASP.NET将完全处理您的回发。

答案 3 :(得分:3)

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

在我的情况下,我的控件的<form>内有一个标记<form>,因此,如果您没有解决上述问题,我会搜索<form><form>内丢失{{1}} {1}}。

希望在某些情况下有所帮助。

答案 4 :(得分:0)

如果我要求你做对,我认为你正试图让那些文本框只读。如果是这样,我以前遇到过这个问题并通过使用C#而不是ASP.NET来使文本框只读,我只是在Page_Load中添加了textboxName.Attributes.Add("readonly", "readonly");之类的行,并且它工作得很好。我在Stackoverflow

上找到了这个解决方案

答案 5 :(得分:0)

而不是TextBoxPassword.Text=Password

使用

TextBoxPassword.Attributes["value"]=Password

答案 6 :(得分:-1)

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