【问题标题】:ASP.NET/HTML input button value on postback回发时的 ASP.NET/HTML 输入按钮值
【发布时间】:2010-07-30 14:43:27
【问题描述】:

根据以下信息:

Which values browser collects as a postback data?

HTML 输入按钮的值在回传中发送。我正在使用 IE 在 ASP.NET 中进行测试,但我发现情况并非如此。

我的测试用例的标记是:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Test.aspx.vb" Inherits="Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>test postback</title>
    <script type="text/javascript">
    function doTest() {
        var button = document.getElementById("btnTest");
        button.value = "new-value";
        alert("button contents = " + button.value);
        return true;
    }
    </script>
</head>
<body>
    <form id="myForm" runat="server">
    <div>
        <asp:Panel ID="pnlTest" runat="server"
            DefaultButton="btnTest">
            Textbox: 
            <asp:TextBox ID="txtTest" runat="server" />
            <asp:Button ID="btnTest" runat="server" 
                Text="change" OnClientClick="doTest()" />
        </asp:Panel>
    </div>
    </form>

后面的代码是:

Partial Class Test
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        txtTest.Text = btnTest.Text
    End Sub
End Class

我的结果是当浏览器加载页面时输入按钮的值总是“改变”,但我期望它在回发后是“新值”。 Javascript doTest() 函数正在更改单击按钮时的值。

我还应该为 ASP.NET 或 IE 做些什么来获得回传的输入按钮值吗?或者是关于这个功能的信息 错了吗?

【问题讨论】:

    标签: asp.net button postback


    【解决方案1】:

    在这种情况下,我可能会使用:

    <input type="button" ID="btnTest" runat="server" onclick="doTest()" value="change" />
    

    注意 runat="server"。 虽然 asp:button 的呈现方式可能类似,但如果您真正想要的是 HTML 按钮输入,则可以使用它。是的,ASP.NET 将在服务器端获取值。

    另外,查看源代码并确保 ASP.NET 面板没有修改输入的 ID。更一般地说,您是否在没有 asp:panel 标签的情况下对此进行了测试?我想知道这是否会影响任何事情。

    【讨论】:

    • 取出面板没有区别。我需要它来实现默认按钮功能。使用您的建议是可行的,但是我不能将其用作面板默认按钮。
    【解决方案2】:

    我相信 IE 只是讨厌输入提交....

    但你也应该知道...

    ASP 使用视图状态来确保没有篡改服务器控件。提交按钮的值存储在视图状态中,很可能修改它的值的唯一方法是使用 ASP.NET JS API。

    更常见的问题是&lt;selects&gt; (Options added to by javascript lost in postback),但&lt;input type="submit" /&gt; 非常相似

    【讨论】:

      【解决方案3】:

      不是没有设置,而是 javascript 设置了值,该值在回发时重置为“更改”。如果您正在寻找适用于您的 javascript 的按钮,请使用客户端输入控件:

      <input type="button" ID="btnTest" onclick="doTest()" />
      

      否则,如果你想要一个服务器控件,你应该在服务器端设置btnTest.Text。

      【讨论】:

        【解决方案4】:

        您为按钮使用了错误的 ID。 ASP.NET 给每个控件一个唯一的 id。它由您控制的链中的所有 id 组成。

        因此,您的按钮的 id 可能类似于 ctl00_pnlTest_btnTest。这就是您的 JavaScript 没有设置按钮文本的原因。

        在您的浏览器中查看源代码以查看控件的实际 ID 并相应地调整您的 JavaScript。

        从代码中,您可以通过 ClientID 属性获取页面中使用的实际 ID。因此,您可以将 JavaScript 更改为:

        var button = document.getElementById("<%= btnTest.ClientID %>");
        

        【讨论】:

        • 除非您使用 ASP.NET 4.0 和 ClientIDMode="Static"。
        • 我查看了 html 源代码,面板没有更改 id 而是将其放入 div 中。我认为您对将按钮放在母版页的内容区域感到困惑......为此我必须使用 btnTest.ClientID
        【解决方案5】:

        刚刚尝试了这样的 Marc 解决方案:

        <script type="text/javascript">
                function doTest() {
                    var button = document.getElementById("btnTest1");
                    button.value = "new-value";
                    alert("button contents = " + button.value);                
                    return true;
                }
        </script>
        
        
        <input type="submit" id="btnTest1" name="btnTest1" value="Submit 1" runat="server" onclick="doTest()" />
        

        当我发回 Load 事件时,按钮的值仍然是 Submit 1。您可以使用隐藏字段,使用 JS 中的按钮设置该值并回发。这确实有效。

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head id="Head1" runat="server">
            <title>test postback</title>
            <script type="text/javascript">
                function doTest() {
                    var button = document.getElementById("btnTest1");
                    button.value = "new-value";
                    alert("button contents = " + button.value);
                    var hdn = document.getElementById("hdnTextboxName");
                    hdn.value = button.value;
                    return true;
                }
            </script>
        </head>
        <body>
            <form id="myForm" runat="server">    
            <div>
        
                <asp:Panel ID="pnlTest" runat="server" DefaultButton="btnTest">
                    Textbox:
                    <asp:TextBox ID="txtTest" runat="server" /><asp:HiddenField ID="hdnTextboxName" runat="server" ClientIDMode="Static" />
                    <asp:Button ID="btnTest" runat="server" Text="change" OnClientClick="doTest()" ClientIDMode="Static" />                        
                </asp:Panel>
            </div>
            </form>
        </body>
        </html>
        
            Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
                txtTest.Text = hdnTextboxName.Value
            End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-24
          • 2017-10-13
          • 2013-07-03
          • 2016-03-29
          • 2012-04-10
          • 1970-01-01
          相关资源
          最近更新 更多