【问题标题】:ASP.NET textbox losing value after postback when value is changed client-side via javascript当通过javascript在客户端更改值时,ASP.NET文本框在回发后丢失值
【发布时间】:2009-05-28 18:08:46
【问题描述】:

我正在通过 javascript 客户端设置文本框的值。当我刷新页面时,值会丢失。

文本框未禁用或设置为只读。

我已经阅读了将值放在隐藏字段中的建议,我不想这样做。这似乎是一个 hack。

文本框位于用户控件中:

<div id="Row" class="RaidRow" runat="server">
    <asp:Button ID="RaidRowButton" runat="server" CssClass="RaidRowButton" OnClick="RaidRowButton_Click" />
    <asp:TextBox ID="CharacterNameTextBox" runat="server" CssClass="RaidRowControl SlotTextBox" MaxLength="12" />
    <asp:Label ID="ClassNameLabel" runat="server" CssClass="RaidRowControl ClassLabel" />
</div>

此控件位于 .aspx 页面上。

当用户双击文本框,在文本框获得焦点时按下回车,或更改文本时,将调用以下 javascript 函数:

function VerifyCharacter(slotNumber, event)
{
    var enterWasPressed = false;

    if (event && event.which == 13)
    {
        enterWasPressed = true;
    }
    else if (window.event && window.event.keyCode == 13)
    {
        enterWasPressed = true;
    }

    if (event == null || enterWasPressed)
    {
        var realmName = 'Lightninghoof';

        var characterNameTextBox = GetCharacterNameTextBox(slotNumber);
        characterNameTextBox.style.color = '#CCCCCC';

        var classLabel = GetClassNameLabel(slotNumber);
        classLabel.style.color = '#CCCCCC';
        classLabel.innerHTML = 'Unknown';

        WoW_Stats.CharacterInformation.GetCharacterInformation(realmName, characterNameTextBox.value, slotNumber, GetCharacterInformation_Success, GetCharacterInformation_Failed);
    }
}

网络服务调用完成后,将调用以下 javascript 函数:

function GetCharacterInformation_Success(characterInformationResult)
{
    var characterInfo = Sys.Serialization.JavaScriptSerializer.deserialize(characterInformationResult, true);

    var classLabel = GetClassNameLabel(characterInfo.SlotNumber);
    classLabel.style.color = characterInfo.ClassColor;
    classLabel.innerHTML = characterInfo.ClassName;

    var characterNameTextBox = GetCharacterNameTextBox(characterInfo.SlotNumber);
    characterNameTextBox.style.color = characterInfo.ClassColor;
}

唯一的问题是,当我刷新页面时,通过 javascript 在客户端设置的 CharacterNameTextBox 和 ClassNameLabel 中的文本丢失了。

如何确保控件在回发之间保持其价值?

【问题讨论】:

  • 它是 还是 ?你有 runat="server" 属性吗?

标签: asp.net javascript


【解决方案1】:

刷新页面(按 F5)与回发不同。我不相信您的文本框中的值会在刷新时被发回服务器。文本框中的值将在回发时被回发到服务器(只要 TextBox 的 ReadOnly 属性未设置为 true,但这是另一回事)。

【讨论】:

  • 原来是这个问题。我认为刷新会导致回发。
【解决方案2】:

我认为如果文本框不可编辑:Enabled = False 或 ReadOnly= false。
Asp.net“出于安全原因”从其 ViewState 中获取此文本框中的值。
这就是为什么当您使用 HiddenField 或 Input 之类的东西时,您可以获得值。

【讨论】:

    【解决方案3】:

    在页面预初始化事件中,尝试像这样访问值:

    请求["CharacterNameTextBox"]

    我遇到了同样的问题(通过 javascript 设置的值永远不会回传,但输入的值会),一位同事建议这样做。坚持下去,就像一个魅力。

    【讨论】:

      【解决方案4】:

      唯一的问题是当我刷新页面时,通过javascript设置客户端的CharacterNameTextBox和ClassNameLabel中的文本丢失了。 p>

      由于您是在客户端设置值,我建议您使用 cookie 来存储该数据并在客户端检查该 cookie,因为如果您只是在客户端设置值,ViewState 将无济于事CodeBehind 会将其设置为什么。

      【讨论】:

        【解决方案5】:

        什么时候设置值?只要您使用文本框的clientId,您就可以在javascript中设置页面的值onload。

        【讨论】:

          【解决方案6】:

          在隐藏字段中存储值并不比 .NET Web 窗体本身更难。许多应用程序数据在隐藏的 __VIEWSTATE 字段中传递/存储。

          话虽如此,你能澄清一下发生了什么吗?您是在页面加载时设置值,还是对某些用户操作做出反应?您能否提供一些代码,以便我们更清楚地了解您在做什么?

          编辑

          您是否在页面加载/回发代码隐藏中明确设置文本框或标签的值?这将覆盖客户端脚本设置的任何值。我想不出这些价值观不会持续存在的任何其他原因。如果你真的很绝望,你可以在你的 javascript 函数结束时通过 AJAX 调用将信息发送回服务器,这样你就可以将它保存在服务器内存中的某个地方。

          【讨论】:

            【解决方案7】:

            问题可能是两件事之一。刷新可以清除然后字段。另外,如果是回帖,是否在页面加载(或卸载)事件中设置文本框的值?

            【讨论】:

              【解决方案8】:

              另一种解决方案是会话,您可以在第一次加载或从外部页面分配一个会话,然后检查会话是否不为空,然后将值设置为文本框。这是示例: 在外部页面中:

                 if (id == "txtDD")
                      {
                        Session["DD"] = calendar.SelectedDate.ToShortDateString();
                      }
              and in code behind check it:
              
              protected void Page_Load(object sender, EventArgs e)
                 {
                  if(Session["DD"]!= null)
                     txtDD.Text =Session["DD"].ToString();
                 }
              

              【讨论】:

                【解决方案9】:

                你可以试试这个,而不是只读一个文本框

                onKeyPress = "javascript: return false;" onPaste = "javascript: return false;" 
                

                它不会失去它的价值。

                【讨论】:

                  【解决方案10】:

                  你必须记住,KISS。

                  只需将现有字段视为本质上的展示字段,并使用 runat="server" 属性添加隐藏的输入字段,并在同一客户端事件中使用 JavaScript 设置这些字段。

                  这些是您在代码隐藏方法中想要的真正价值,您可以毫无问题地抓住这些价值。由于文本框对象是 .NET 抽象,因此我建议在使用在服务器上运行的 HTML 输入进行客户端工作时。当我深陷网络表单 BS 时,这似乎让我头疼。

                  我认为这里有很多解决方案,但如果可以的话,我完全赞成折断手腕并走开。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-03-01
                    • 2013-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-10-26
                    • 2016-04-22
                    • 1970-01-01
                    • 2015-07-03
                    相关资源
                    最近更新 更多