当文本框通过javascript更改客户端时,ASP.NET文本框在回发后丢失值

时间:2009-05-28 18:08:47

标签: asp.net javascript

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

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

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

文本框在用户控件中如下:

<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页面上。

当用户双击文本框时,在文本框具有焦点时按Enter键,或者更改文本,将调用以下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);
    }
}

完成Web服务调用后,将调用以下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中的文本将丢失。

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

10 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

在页面preinit事件中,尝试访问以下值:

请求[ “CharacterNameTextBox”]

我遇到了同样的问题(通过javascript设置的值永远不会回发,但输入的值会是这样)并且同事建议了它。死了,就像一个魅力。

答案 3 :(得分:1)

  

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

由于您正在设置客户端的值,我建议使用cookie来存储该数据并在客户端检查该cookie,因为如果您只是设置客户端的值而不管ViewState将无法帮助CodeBehind会将它设置为什么。

答案 4 :(得分:0)

将值存储在隐藏字段中并不比.NET Web Forms本身更糟糕。大部分应用程序数据都传递/存储在隐藏的__VIEWSTATE字段中。

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

修改

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

您可以尝试使用

,而不是只读文本框
onKeyPress = "javascript: return false;" onPaste = "javascript: return false;" 

它不会失去它的价值。

答案 9 :(得分:-1)

你必须记住,亲吻。

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

这些是您在代码隐藏方法中所需的真正价值,并且您将能够抓住那些没问题。由于textbox对象是.NET抽象,我建议在使用在服务器上运行的HTML输入进行客户端工作时。当我在网络形式BS中膝盖深处时,这似乎让我头疼。

我认为这里有很多解决方案,但如果可以的话,我就是为了打破手腕并走开。