Значение кнопки ввода ASP.NET/HTML при обратной передаче - PullRequest
0 голосов
/ 30 июля 2010

По информации в:

Какие значения браузер собирает как данные обратной передачи?

значение кнопки ввода HTML отправляется в пост обратно. Я тестирую в ASP.NET с IE, и я не нахожу это так.

Разметка для моего теста:

<%@ 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 ]

2 голосов
/ 30 июля 2010

В таком случае я бы, вероятно, использовал:

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

Обратите внимание на runat = "сервер" . Хотя asp: button, вероятно, отрисовывается аналогично, если вы действительно хотите ввести HTML-кнопку, вы можете использовать это. Да, ASP.NET подберет значение на стороне сервера.

Кроме того, выполните просмотр источника и убедитесь, что на панели ASP.NET не отображается идентификатор входа. В общем, вы тестировали это без тега asp: panel? Интересно, влияет ли это на что-нибудь?

0 голосов
/ 30 июля 2010

Только что попробовал решение Марка так:

<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, в качестве значения кнопки по-прежнему было указано «Отправить 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
0 голосов
/ 30 июля 2010

Вы используете неверный идентификатор для кнопки.ASP.NET присваивает каждому элементу управления уникальный идентификатор.Он состоит из всех идентификаторов в цепочке вашего контроля.

Поэтому ваша кнопка, вероятно, имеет идентификатор, похожий на ctl00_pnlTest_btnTest.Вот почему ваш JavaScript не устанавливает текст кнопок.

просмотрите исходный код в вашем браузере, чтобы увидеть фактический идентификатор элемента управления и соответственно откорректируйте ваш JavaScript.Идентификатор, используемый на странице со свойством ClientID.Таким образом, вы можете изменить свой JavaScript на:

var button = document.getElementById("<%= btnTest.ClientID %>");
0 голосов
/ 30 июля 2010

Дело не в том, что он не устанавливается, но в javascript устанавливается значение, которое возвращается на «изменение» при обратной передаче.Если вы ищете кнопку, которая работает с вашим javascript, используйте клиентский элемент управления вводом:

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

В противном случае, если вам нужен серверный элемент управления, вы должны установить btnTest.Text на стороне сервера.

0 голосов
/ 30 июля 2010

Я считаю, что IE просто ненавидит вводимые данные ....

Но вы также должны знать ...

ASP использует viewstate, чтобы гарантировать, что нет вмешательства в элементы управления сервером. Значение кнопки отправки хранится в состоянии просмотра, и, скорее всего, единственный способ изменить его значение - это использовать ASP.NET JS API.

Чаще всего вы видите эту проблему с <selects> ( Параметры, добавленные в javascript, потерянном при обратной передаче ), но <input type="submit" /> очень похож

...