2010-04-21 7 views
6

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="&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- 
} 

Odpowiedz

7

W javascript trzeba właściwość value być małe, jak to:

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

Th en zostanie ustawiony prawidłowo :) You can see an example in action here

Choć jeśli ostrzegać .Value pokaże swoją wartość, ty rzeczywiście dodał nowy.Value nieruchomość, ale nie ustawiono wejście za .value właściwość, która jest co zostanie opublikowany na serwerze. Przykładowy link powyżej ilustruje to w obie strony.

Ponadto można uczynić go nieco szybciej, zwłaszcza jeśli masz wiele opcji za pomocą tablicy zamiast łańcuchów znaków, na przykład:

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(','); 

Edit: Powyższy kod jest aktualizowana, CMS jest prawda, że ​​poprzednia metoda była zależna od przeglądarki, powyższe powinno teraz zachowywać się konsekwentnie. Ponadto, jeśli jQuery jest opcja, istnieje coraz krótsze sposoby te informacje jeszcze coś takiego:

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

You can see a working example of this here

+0

Och ... wow. Nie mogę w to uwierzyć! Taki głupi i prosty błąd. Dziękuję, Nick! – Siegesmith

+0

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

+0

@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. –

1

Jestem zakładając ASP.NET tutaj.

Jeśli tak, problem stanowi identyfikator kontrolki w kodzie wygenerowanym przez ASP.NET, nie będzie to "assignIDHiddenInput", do którego odwołuje się skrypt. Środowisko ASP.NET zmienia je przed renderowaniem deklaracji HTML z podanego na stronie HTML. Zrób źródło widoku na stronie, a zobaczysz, co mam na myśli.

Tutaj jest odwrotnie, że:

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

Aktualizacja: Jak zauważył w komentarzach, to ma znaczenie tylko wtedy, gdy kontrola jest ustawiona na runat = server.

+0

To nie byłby problem, jego dane wejściowe nie są 'runat =" server "'. –

+0

Zawsze myślałem, że masz przypisany tylko identyfikator klienta, jeśli był to "runat = server"? –

+0

Dobra uwaga. Wspomniał "" więc pomyślałem, że możliwe, że on chciałby uruchomić to w ten sposób, ale jego kod po stronie serwera używa " Request.Form ["assignIDHiddenInput"] więc może to być kwestią sporną – JohnFx

0

Myślę, że ASP.NET wywołuje javascript, aby wykonać zwrotne wezwanie na tej kontroli przed twoja funkcja javascript jest wywoływana w celu zapełnienia tej ukrytej wartości.

Myślę, że możliwe jest wyłączenie domyślnego oddzwonienia i obsłużenie go samodzielnie, ale jestem pewien, że inni mogą lepiej doradzić.

Wstaw funkcję alert() do swojej funkcji, aby sprawdzić, czy rzeczywiście jest wywoływana przed wywołaniem post-back.

Powiązane problemy