Einstellung versteckte input-Wert in Javascript, dann auf es im codebehind
Ich habe versucht, um den Wert eines hidden input per Javascript und dann den Zugriff auf den Wert von meinem C# - codebehind. Wenn ich den code ausführen, wird unten kopiert, wird der Wert, der zugewiesen wird assignedIDs ist "", die ich annehmen, ist der default-Wert für ein hidden-input. Wenn ich manuell den Wert in das html-tag, dann assignedIDs auf den Wert gesetzt.
Dieses Verhalten lässt mich vermuten, dass der Wert der Eingabe wird zurückgesetzt (neu gerendert?) zwischen dem onClientClick-und onClick-events feuern.
Ich würde schätzen jede Hilfe bei der Angelegenheit. Ich habe Stunden versucht zu lösen, was scheint wie eine sehr einfache Aufgabe.
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-
}
InformationsquelleAutor Siegesmith | 2010-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
In javascript müssen Sie die
value
Eigenschaft Kleinbuchstaben, wie folgt:Dann wird es richtig 🙂 Sie können sehen, ein Beispiel in Aktion hier
Obwohl, wenn Sie alert die
.Value
es wird sich zeigen Ihren Wert, Sie haben tatsächlich Hinzugefügt neue.Value
Eigenschaft, aber Sie haben nicht die Eingabe.value
Eigenschaft, die ist, was wird an den server gesendet. Der Beispiel-link oben zeigt diese beiden Möglichkeiten.Auch Sie können machen es ein wenig schneller, vor allem, wenn Sie haben eine Menge von Optionen, mit einem array statt string-Verkettung wie diese:
Edit: Der obige code ist aktualisiert, CMS richtig ist, dass die bisherige Methode wurde der browser angewiesen, das oben sollte jetzt konsequent Verhalten. Auch, wenn jQuery ist eine option, es gibt kürzere Wege, um diese info noch, wie diese:
Sie können sehen, ein Beispiel dieser hier
Durchlaufen der
options
HTMLOptionsCollection
- Objekt mit derfor...in
Anweisung geben, Sie wirklich zu unerwarteten Ergebnissen, die in einigen Browsern, auch die option "numerisch" - Indizes wird nicht Durchlaufen werden, würde ich empfehlen, ein normalesfor
loop, check dieses Beispiel.Großer Punkt auf der browser-Abhängigkeit, auch verwendet, um eine
each
Schließung hier. Ich aktualisierte den code von oben in den Fall kommt jemand über diese später benötigen die gleichen Informationen.Ja, ich denke, dass die
for...in
Anweisung sollte vermieden werden, für array-wie - Objekte, wie DOM-Sammlungen, wo der eigentliche Zweck ist die Iteration über numerische Indizes und nicht aufzählen, die Objekt-Eigenschaften (auch im wissen, dass diese Indizes sind Eigenschaften), außerdem mit host-Objekte können Sie sich nie sicher sein, welche Eigenschaften, die Sie finden... BTW hier ist ein guter Artikel zum Thema: Iteration VS-EnumerationInformationsquelleAutor Nick Craver
Gehe ich davon aus ASP.NET hier.
Wenn ja, dein problem ist die id des Steuerelements in der HTML generiert ASP.NET ist nicht "assignedIDHiddenInput", dass Sie die Referenz in das script. ASP.NET ändert die vor dem Rendern der HTML-von dem, was Sie angeben, in die HTML-Seite deklarativ. Tun ein Quelltext auf der Seite und du wirst sehen was ich meine.
Hier ist ein Weg, um:
Update: Wie bereits angemerkt in den Kommentaren, das ist nur relevant, wenn der regler RunAt=Server.
runat="server"
.Ich dachte immer, Sie bekam nur zugewiesen clientid, wenn Sie "runat=server"?
Guter Punkt. Er erwähnt " <!-- Beachten Sie, dass habe ich auch schon versucht die Einstellung runat="server" keine Veränderung -->" also ich dachte, es sei möglich, dass er vielleicht wollen, führen Sie es auf diese Weise, aber seine server-side-code verwendet " - Anfrage.Form["assignedIDHiddenInput"] so könnte dies ein strittiger Punkt sein.
John, vielen Dank für den input. Ich vergaß zu erwähnen, dass hatte ich auch schon versucht Bewältigung der Eingang in dieser Weise. Sehr geschätzt!
InformationsquelleAutor JohnFx
Denke ich ASP.NET ist das aufrufen der javascript ausführen eines Postbacks, dass die Kontrolle vor deine javascript-Funktion aufgerufen, um aufzufüllen, verborgenen Wert.
Ich denke, es ist möglich, deaktivieren Sie die Standard-postback, und handle es sich aber ich bin sicher, andere können besser beraten.
Stick ein alert() in Ihrer Funktion ist dort zu sehen, ob es wirklich immer aufgerufen, bevor post-back ausgelöst wird.
InformationsquelleAutor Neil Trodden