Установка скрытого входного значения в JavaScript, затем доступ к нему в codebehind

Я пытался установить значение скрытого входа при помощи JavaScript и затем получить доступ к значению из моего C# codebehind. То, когда я выполняю код, который копируется ниже, значение, которое присвоено assignedIDs,"", который я принимаю, является значением по умолчанию для скрытого входа. Если я вручную установил значение в теге HTML, то assignedIDs установлен на то значение.

Это поведение намекает мне, что значение входа сбрасывается (повторно представленный?) между onClientClick и onClick увольнением событий.

Я ценил бы любую справку с вопросом. Я провел часы, пытаясь решить то, что походит на очень простую проблему.

html/javascript:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Admin Page - Manage Tasks</title>
    <script language="javascript" type="text/javascript">
        function PopulateAssignedIDHiddenInput() {
            var source = document.getElementById('assignedLinguistListBox');
            var s = "";
            var count = source.length;
            for (var i = count - 1; i >= 0; i--) {
                var item = source.options[i];
                if (s == "") { s = source.options[i].value; }
                else { s = s.concat(",",source.options[i].value); }
            }
            document.getElementById('assignedIDHiddenInput').Value = s;
            // I have confirmed that, at this point, the value of
            // the hidden input is set properly
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Panel id="EditMode" runat="server">
            <table style="border: none;">
                <tr>
                    <td>
                        <asp:Label ID="availableLinguistLabel" runat="server" Text="Available"></asp:Label><br />
                        <asp:ListBox ID="availableLinguistListBox" runat="server" Rows="10" SelectionMode="Multiple"></asp:ListBox>
                    </td>
                    <td>
                        <input type="button" name="right" value="&gt;&gt;"
                            onclick="Javascript:MoveItem('availableLinguistListBox', 'assignedLinguistListBox');" /><br /><br />
                        <input type="button" name="left" value="&lt;&lt;"
                            onclick="Javascript:MoveItem('assignedLinguistListBox', 'availableLinguistListBox');" />
                    </td>
                    <td>
                        <asp:Label ID="assignedLinguistLabel" runat="server" Text="Assigned To"></asp:Label><br />
                        <asp:ListBox ID="assignedLinguistListBox" runat="server" Rows="10" SelectionMode="Multiple"></asp:ListBox>
                    </td>
                </tr>
            </table>
            //-snip-
            <asp:Button ID="save_task_changes_button" runat="server" ToolTip="Click to save changes to task"
                Text="Save Changes" OnClick="save_task_changes_button_click" OnClientClick="Javascript:PopulateAssignedIDHiddenInput()" />
        </asp:Panel>

        <!-- Hidden Inputs -->
        <!-- Note that I have also tried setting runat="server" with no change -->
        <input id="assignedIDHiddenInput" name="assignedIDHiddenInput" type="hidden" />
    </div>
    </form>
</body>

c#

protected void save_task_changes_button_click(object sender, EventArgs e)
{
    string assignedIDs = Request.Form["assignedIDHiddenInput"];
    // Here, assignedIDs == ""; also, Request.Params["assignedIDHiddenInput"] == ""
    // -snip-
}
6
задан John Saunders 21 April 2010 в 22:50
поделиться

3 ответа

В javascript вам нужно, чтобы свойство value было строчными буквами, например:

document.getElementById('assignedIDHiddenInput').value = s;

Тогда оно будет установлено правильно :) Здесь вы можете увидеть пример в действии

Хотя, если вы предупредите .Value , он покажет ваше значение, вы фактически добавили новое .Value свойство, но вы не установили свойство ввода .value , которое отправляется на сервер. Ссылка в примере выше иллюстрирует это в обоих направлениях.

Также вы можете сделать это немного быстрее, особенно если у вас есть много возможностей, используя массив вместо конкатенации строк, например:

var source = document.getElementById('assignedLinguistListBox');
var opts = [];
for (var i = 0; i < source.options.length; i++) {
    opts.push(source.options[i].value);
}
var s = opts.join(',');

Изменить: Приведенный выше код обновлен, CMS правильно, что предыдущий метод зависел от браузера, теперь вышеуказанный должен работать согласованно. Кроме того, если jQuery является опцией, есть более короткие способы получить эту информацию, например:

var s = $('#assignedLinguistListBox option').map(function() { 
          return this.value; 
        }).get().join(',');
$('#assignedIDHiddenInput').val(s);

Вы можете увидеть рабочий пример здесь

7
ответ дан 16 December 2019 в 21:36
поделиться

Я думаю, что ASP.NET вызывает javascript для выполнения обратной передачи для этого элемента управления до того, как будет вызвана ваша функция javascript для заполнения этого скрытого значения.

Я думаю, что можно отключить обратную передачу по умолчанию и обработать ее самостоятельно, но я уверен, что другие могут посоветовать лучше.

Вставьте здесь alert () в свою функцию, чтобы проверить, действительно ли она вызывается, до того, как будет запущена обратная передача.

0
ответ дан 16 December 2019 в 21:36
поделиться

Я предполагаю, что здесь ASP.NET.

Если это так, ваша проблема заключается в том, что идентификатор элемента управления в HTML, сгенерированном ASP.NET, не будет «assignIDHiddenInput», на который вы ссылаетесь в сценарии. ASP.NET изменяет их перед визуализацией HTML из того, что вы указываете на странице HTML декларативно. Просмотрите исходный код на странице, и вы поймете, что я имею в виду.

Вот способ обойти это:

document.getElementById('<%=assignedIDHiddenInput.ClientID %>').value = s;

Обновление: Как отмечено в комментариях, это актуально только в том случае, если для элемента управления установлено значение RunAt = Server.

1
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: