2010-12-28 15 views
6

Mam stronę asp.net, gdzie mam poniżej znaczników. Zasadniczo ten znacznik jest generowany z kodu źródłowego, odczytując rekordy z tabeli i przechodząc przez nie. Dla każdego rekordu w tabeli będzie blok div.Czytanie dynamicznie generowane wartości elementu HTML w codebehind w ASP.NET

Zasadniczo ten formularz służy do odczytu/pokazania ustawień dla użytkownika. Pozycje ustawień są przechowywane w tabeli.

<div id='divContainer' runat='server'> 

<div id='div1' runat='server'> 
    <table> 
     <tr> 
     <th>Name</th> 
     <td><input type='text' id='txtName1' value='something' /></td> 
     </tr> 
     </table> 
</div> 
<div id='div2' runat='server'> 
    <table> 
     <tr> 
     <th>Domain name</th> 
     <td><input type='text' id='txtName2' value='something' /></td> 
     </tr> 
    </table> 
</div> 
<div id='div3' runat='server'> 
    <table> 
     <tr> 
     <th>URL</th> 
     <td><input type='text' id='txtName3' value='something' /></td> 
     </tr> 
     </table> 
</div> 
<div id='div4' runat='server'> 
    <table> 
     <tr> 
     <th>Some other value is enabled ?</th> 
     <td><input type='checkbox' id='chk4' /></td> 
     </tr> 
     </table> 
</div> 

</div> 

Identyfikatory każdego elementu wejściowego będą niepowtarzalne. Teraz w codebehind chcę odczytać wartości każdego elementu wejściowego, aby zapisać zmiany wprowadzone przez użytkownika. Jak mogę odczytać elementy tutaj? Ponieważ znacznik jest generowany w codebehind jako ciąg i dołączany jest do INNER HTML zewnętrznego div, nie mogę odczytać wartości takich jak dla kontrolki, którą przeciągamy i upuszczamy w IDE.

+0

Jak dodać kontrolki? Jak struny? Jako elementy sterujące serwera (dodając do kolekcji 'Controls' coś jeszcze? – Oded

+0

co się stanie, gdy utworzysz formant runat =" serwer "? Nie możesz ich jeszcze uzyskać? – Pabuc

+3

Być może zainteresuje Cię fakt, że twoje elementy' table' są brakuje ich znaczników zamykających – David

Odpowiedz

4

Jeśli są one przesyłane z powrotem do strony w standardowym zapytaniu POST z serwera HTTP, można odczytać wartości z Request.FormNameValueCollection.

Zasadniczo wszystkie elementy sterujące serwera, które stają się elementami formularza, zostają przetłumaczone na standardowe elementy formularzy HTML, tak jak w tym przypadku, ale z większą ilością znaczników generowanych przez platformę .NET, aby ułatwić ich identyfikację. Następnie automatycznie odwzorowuje ich wartości z powrotem do elementów sterujących serwera dla odświeżenia strony, ale same wartości są nadal w standardowym POST z protokołem HTTP, do którego można uzyskać dostęp ręcznie.

(Jest również częstym metoda stosowana podczas wysyłania formularza z jednej aplikacji ASP .NET do drugiego.)

+0

Dynamicznie dodane elementy nie zostaną ponownie przetłumaczone na elementy sterujące serwera. Nie może więc szukać "txtName3.Text" w kodzie serwera. Będzie musiał przeanalizować NVC lub będzie musiał w inny sposób przebudować dane żądania w formularzu. – jcolebrand

+0

@drachenstern: To nie są kontrole serwera, nie. Ale wartości są obecne w 'Request.Form' i można je łatwo wyciągnąć po nazwie elementu. Jeśli chodzi o utrzymywanie ich na dynamicznej stronie, będzie to wymagało trochę pracy. Ale podstawowa idea uzyskiwania wartości odświeżania wstecznego może działać tak samo, jak uzyskiwanie wartości formularza w prawie każdym innym języku po stronie serwera. – David

+0

To prawda, stąd moja odpowiedź, że to zależy od tego, jak chce ich użyć. Jeśli spodziewa się 'txtName3.Text', to nie zadziała. Myślę, że ty i ja zgadzamy się tutaj, po prostu myślę, że nie rozumie on cyklu życia strony, albo nie chce używać silnika ASP.NET tak jak wszyscy inni. Jeśli o to chodzi, używam po prostu widoku siatki lub czegoś podobnego za pomocą przycisków poleceń i muszę to zrobić. O wiele łatwiej. – jcolebrand

0

Generalnie, można umieścić te wejście steruje tworzysz dynamicznie (w tym przypadku, TextBox) wewnątrz czegoś podobnego do panelu kontrolnego (kontener). Następnie, po opublikowaniu danych przez użytkownika, zapętlisz ten kontener panel.Controls zbierając i pobierając każdy tekst TextBox.

Należy pamiętać, że niektóre zastrzeżenia dotyczą pracy z dynamicznie tworzonymi kontrolkami, ponieważ ASP ma naturę stateless.

Ta strona pokazuje jak zaimplementować to:

Adding Dynamic Rows in ASP.Net GridView Control with TextBoxes

-1

Nie testowałem go ale mogę zasugerować, że:

Dodaj dynamiczne elementy sterujące z runat = „server” znacznika wewnątrz innego formanty z runat = "server" (np. kontrola panelu). Następnie można uzyskać do nich tak:

Textbox t = (Textbox)panel1.controls.findControl("dynamicControlId"); 
+1

Dynamicznie dodane formanty są z definicji uruchamiane na serwerze. Och, nieważne, struny są z natury NIE kontrolowane. Rozumiem twój punkt widzenia, ale nadal by nie działał. – jcolebrand

+0

nie można tego zrobić, ponieważ żadna z kontrolek nie jest po stronie serwera. – Pabuc

+0

Ok Już powiedziałem: Nie przetestowałem tego. Dzięki. – mavera

0

Więc siła tej historii jest to, że kiedy dynamicznie dodać kontrolę po Page_Init następnie odświeżenie wartości nie może być włożona z powrotem do tych kontroli.

CF: http://www.15seconds.com/issue/020102.htm i http://msdn.microsoft.com/en-us/library/ms178472.aspx

Niektóre z innych odpowiedzi tutaj sugerować „oh, dodać runat = serwer do kontroli”, ale podczas tworzenia go w kodzie, a nie w Page_Init, to sprawia, że ZERO różnica.

Daj mi znać, jeśli to nie jak podczas tworzenia elementów sterujących lub jeśli to nie jak masz je za pomocą a ja skorygować tę odpowiedź na więcej szczegółów. To wszystko sprowadza się do sposobu, w jaki próbujesz uzyskać dostęp do wartości.

+0

Czytam rekordy z tabeli i przechodzę przez nią.Tworzenie łańcucha zawierającego znacznik, a następnie przypisanie do wewnętrznej właściwości HTML zewnętrznego elementu div. – Shyju

+0

Nie, w jaki sposób używasz ich na poczcie zwrotnej? Czy czytasz "txtName3.Text"? – jcolebrand

+0

w rzeczywistości to robi, kiedy tworzysz kontrolę nad kodem, na pewno jest to serverideh. OP nie "tworzy kontroli" serveride zamiast tego zmienia innerHtml kontrolki serveride. – Pabuc

1

Jeśli chcesz pobrać wartości wygenerowanych elementów sterujących, musisz wykonać 2 czynności.

  1. Generowanie formantów wejściowych z runat = 'serwera znacznika dla każdej kontroli (w przeciwnym razie nie zostaną one zawarte w zbiorze Request.Forms). Prawdopodobnie jest to krok brakujące.

    <input type='text' id='txtName1' runat='server' value='something' />

  2. chwycić wartości z kolekcji Request.Form na odświeżenie

    string txtValue1 = Request.Form["txtName1"];

To naprawdę powinno być takie proste. Przetestowałem to na kodzie, używając DIV jako kontenera i prostego javascriptu do wstrzyknięcia ciągu kontrolnego do innerHTML. Jeśli pojawią się jakieś problemy, być może trzeba będzie debugować i sprawdzić, czy identyfikator dynamicznego kontrolera został zmieniony z powodu umieszczenia go w pojemniku nazw lub coś takiego.

Powiązane problemy