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