回发时ASP.NET / HTML输入按钮值

时间:2010-07-30 14:43:28

标签: asp.net button postback

根据以下信息:

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做更多的事情来获取返回的输入按钮值?或者是有关此功能的信息  错?

5 个答案:

答案 0 :(得分:2)

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

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

请注意 runat =“server”。 虽然asp:button可能类似地呈现,但如果你真的想要它是一个HTML按钮输入,你可以使用它。是的,ASP.NET将在服务器端获取值。

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

答案 1 :(得分:0)

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

但你也应该知道......

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

更常见的是,<selects>Options added to by javascript lost in postback)会出现此问题,但<input type="submit" />非常相似

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

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

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

答案 4 :(得分:0)

刚试过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