Próbowałem ustawić wartość ukrytego wejścia przy użyciu JavaScript, a następnie uzyskać dostęp do wartości z mojego kodu C# codebehind. Po uruchomieniu kodu, który jest kopiowany poniżej, wartość przypisana do przypisanych identyfikatorów to "", co do której zakładam, jest wartością domyślną ukrytego wejścia. Jeśli ręcznie ustawię wartość w znaczniku HTML, to przypisane ID są ustawione na tę wartość.Ustawienie ukrytej wartości wejściowej w JavaScript, a następnie uzyskanie dostępu do niej w kodzie pobieram
To zachowanie sugeruje, że wartość danych wejściowych jest resetowana (ponownie renderowana?) Między uruchomieniami zdarzeń onClientClick i onClick.
Byłbym wdzięczny za każdą pomoc w tej sprawie. Spędziłem wiele godzin próbując rozwiązać problem, który wydaje się bardzo prosty.
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=">>"
onclick="Javascript:MoveItem('availableLinguistListBox', 'assignedLinguistListBox');" /><br /><br />
<input type="button" name="left" value="<<"
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-
}
Och ... wow. Nie mogę w to uwierzyć! Taki głupi i prosty błąd. Dziękuję, Nick! – Siegesmith
Iterowanie obiektu 'options' [' HTMLOptionsCollection'] (http://www.w3.org/TR/DOM-Level-2-HTML/html.html#HTMLOptionsCollection) za pomocą instrukcji 'for ... in' będzie daje naprawdę nieoczekiwane rezultaty, w niektórych przeglądarkach nawet indeksy opcji numerycznych nie będą powtarzane, poleciłbym normalną pętlę 'for', sprawdź [ten przykład] (http://jsbin.com/ohebe/). – CMS
@CMS - Świetny punkt na zależności od przeglądarki, zbyt przyzwyczajeni do "każdego" zamknięcia tutaj. Zaktualizowałem powyższy kod na wypadek, gdyby ktoś inny natknął się na to później, potrzebując tych samych informacji. –