代码之家  ›  专栏  ›  技术社区  ›  Jason

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

  •  7
  • Jason  · 技术社区  · 17 年前

    我正在通过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页面上。

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

    10 回复  |  直到 17 年前
        1
  •  9
  •   Tim Scarborough    17 年前

    刷新页面(按F5)与回发不同。我不相信你的文本框中的值会在刷新时发布回服务器。不过,文本框中的值将在回发时发布回服务器(只要TextBox的ReadOnly属性未设置为true,情况就不同了)。

        2
  •  6
  •   S.L. Barth is on codidact.com Monika Restecka    13 年前



    这就是为什么当你使用HiddenField或Input这样的东西时,你可以得到值。

        3
  •  2
  •   Jeff    9 年前

    在页面premit事件中,尝试按如下方式访问值:

    请求[“字符名称文本框”]

        4
  •  1
  •   Jan Wikholm    17 年前

    刷新 通过javascript设置客户端 ,丢失了。

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

        5
  •  0
  •   Eric    17 年前

        6
  •  0
  •   Ender    17 年前

    将值存储在隐藏字段中并不是一种黑客行为。NET Web窗体本身就是。大部分应用程序数据都传递/存储在隐藏的__VIEWSTATE字段中。

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

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

        7
  •  0
  •   Hooloovoo    17 年前

        8
  •  0
  •   Shaahin    13 年前

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

       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
  •  0
  •   Tarun Gupta    13 年前

    您可以尝试以下操作,而不是将文本框设置为只读

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

    它不会失去价值。

        10
  •  -1
  •   Ian Patrick Hughes    16 年前

    你必须记住,KISS。

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

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

    推荐文章