Dlaczego formularze internetowe ASP.NET potrzebują atrybutu Runat = „Server”?

205

Dlaczego muszę określać runat="server"we wszystkich moich kontrolkach ASP.NET, gdy jest to atrybut obowiązkowy i serverjest to jedyna dostępna opcja w mojej ograniczonej wiedzy o ASP.NET, a jeśli go nie używam, pojawia się błąd?

Rozumiem, że opcjonalnie mogę go używać w tagach HTML i rozumiem paradygmat klient / serwer i to, co tak naprawdę określa.

Czy jest to nadmiarowy znacznik, który może wynikać z formantu będącego kontrolką ASP.NET, czy może jest to uzasadnione?

johnc
źródło
2
Zgadzam się z tym pytaniem, aby wyjaśnić nieco więcej, czy „asp:” (i inne tagi, które określisz w nagłówku) nie jest wystarczające do analizy? lub czy runat zostaje trafiony po przekonwertowaniu formantu na WEJŚCIE, a tym samym jest nie do odróżnienia od innych HTML? Wydaje mi się, że runat zostałby trafiony, dopóki nadal będzie w formie kontroli serwera ...
porzuć
1
Być może odpowiednim rozwiązaniem byłoby dodanie czegoś w rodzaju opcji konfiguracji „ domyślnego atrybutu ”, która mogłaby być oparta na prefiksie lub nazwie Web.config. Podczas procesu analizy domyślne atrybuty mogą być wstrzykiwane do DOM, jeśli to konieczne. Będę grał z tym pomysłem ...
Dan Lugg,

Odpowiedzi:

112

Zawsze wierzyłem, że było coś więcej dla zrozumienia, że ​​możesz mieszać tagi ASP.NET i tagi HTML, a tagi HTML mają opcję bycia runat="server"albo nie. Pozostawienie znacznika nic nie zaszkodzi i powoduje usunięcie go przez błąd kompilatora. Im więcej rzeczy sugerujesz o języku internetowym, tym łatwiej jest początkującemu programistowi wejść i się go nauczyć. To tak samo dobry powód, aby mówić o atrybutach tagów.

Rozmowę tę przeprowadzono na blogu Mike'a Schinkela między nim a Talbotem Crowell z Microsoft National Services. Odpowiednie informacje znajdują się poniżej (akapit pierwszy parafrazowany z powodu błędów gramatycznych w źródle):

[...] ale znaczenie <runat="server">jest większe dla spójności i rozszerzalności.

Jeśli programista musi oznaczyć niektóre znaczniki (mianowicie <asp: />), aby silnik ASP.NET mógł je zignorować, istnieje również potencjalny problem kolizji przestrzeni nazw między znacznikami i przyszłych ulepszeń. Wymaganie tego <runat="server">atrybutu jest negowane.

Kontynuuje:

Jeśli <runat=client>było to wymagane dla wszystkich znaczników po stronie klienta, analizator składni musiałby przeanalizować wszystkie znaczniki i usunąć <runat=client>część.

On kontynuuje:

Obecnie, jeśli moje przypuszczenie jest poprawne, analizator składni po prostu ignoruje cały tekst (tagi lub brak tagów), chyba że jest to tag z runat=serveratrybutem lub <%przedrostkiem „ ” lub ssi „ <!– #include(…) Ponadto, ponieważ ASP.NET jest zaprojektowany aby umożliwić oddzielenie projektantów stron internetowych (foo.aspx) od twórców stron internetowych (foo.aspx.vb), projektanci stron internetowych mogą używać własnych narzędzi projektantów stron internetowych do umieszczania kodu HTML i JavaScript po stronie klienta bez konieczności posiadania wiedzy o ASP.NET określone tagi lub atrybuty.

George Stocker
źródło
59
Bez względu na przyczynę, PITA wciąż musi wpisywać go dla każdego znacznika <asp:>, gdy może to być wartość domyślna.
belugabob,
33

Zwykle nie lubię zgadywać, ale zamierzam to zrobić ...

Jeśli pamiętasz hack marketingowy Microsoft .NET w tamtych czasach (2001?), Trudno było powiedzieć, czym był .NET. Czy to był serwer? platforma programistyczna? język? coś zupełnie nowego? Biorąc pod uwagę reklamy, było to dwuznacznie wszystko, co chciałeś - po prostu rozwiązało każdy problem, jaki możesz mieć.

Domyślam się, że istnieje ukryta wielka wizja, że ​​kod ASP.NET może działać w dowolnym miejscu - po stronie serwera LUB po stronie klienta, w kopii programu Internet Explorer powiązanej z środowiskiem uruchomieniowym .NET. runat = „serwer” to tylko szczątkowa pozostałość, pozostawiona, ponieważ jego odpowiednik po stronie klienta nigdy nie dotarł do produkcji.

Pamiętasz te dziwne reklamy?

Powiązane: Artykuł z rejestru z pewną historią .NET.

Corbin March
źródło
5
Czy zdarza ci się mieć link do strony, która zawiera „dziwne reklamy”?
RandomWebGuy
Tak, pamiętam dziwne reklamy. westchnienie
catfood
13

Nie wszystkie formanty, które mogą być zawarte na stronie, muszą być uruchomione na serwerze. Na przykład:

<INPUT type="submit" runat=server />

Jest to zasadniczo to samo, co:

<asp:Button runat=server />

Usuń tag runat = server z pierwszego i masz standardowy przycisk HTML, który działa w przeglądarce. Istnieją powody za i przeciw uruchamianiu określonej kontrolki na serwerze i ASP.NET nie ma możliwości „założenia” tego, co chcesz na podstawie dołączonego znacznika HTML. Możliwe jest „wywnioskowanie” serwera runat = dla <asp:XXX />rodziny kontrolek, ale zgaduję, że Microsoft uznałby to za włamanie do składni znaczników i silnika ASP.NET.

Dave Swersky
źródło
2
Jeśli kontrolka działa na serwerze, czy to oznacza, że ​​nie można wybrać elementów za pomocą Javascript? np. document.getElementsById („tvns: treeview”);
Ciaran Gallagher
3
Element nadal będzie w DOM na kliencie, więc nadal można go modyfikować za pomocą javascript / jQuery. Praca z elementami renderowanymi przez serwer może być jednak trudna, szczególnie w przypadku dynamicznych elementów sterujących.
Dave Swersky
8

Artykuł Microsoft Msdn The Forgotten Controls: HTML Server Controls wyjaśnia użycie runat = "server" z przykładem na polu tekstowym <input type="text">poprzez konwersję do<input type="text" id="Textbox1" runat="server">

Dzięki temu uzyskasz programowy dostęp do elementu HTML na serwerze, zanim strona internetowa zostanie utworzona i wysłana do klienta. Element HTML musi zawierać atrybut id. Ten atrybut służy jako tożsamość elementu i umożliwia programowanie elementów według ich konkretnych identyfikatorów. Oprócz tego atrybutu element HTML musi zawierać runat = "server". Informuje to serwer przetwarzania, że ​​znacznik jest przetwarzany na serwerze i nie należy go uważać za tradycyjny element HTML.

Krótko mówiąc, aby umożliwić programowy dostęp do elementu HTML, dodaj runat="server"go.

Deweloper Marius Žilėnas
źródło
2
Nie odpowiada na pytanie, które zadaje pytanie, dlaczego runat = "server" jest obowiązkowy dla tagów ASP.NET.
nhahtdh
3
@nhahtdh Odpowiedź brzmi: „aby umożliwić programowy dostęp do elementu HTML”. :)
Deweloper Marius Žilėnas
2
OP wie, co oznacza znacznik i co robi. Pytanie dotyczy projektowania języka - co sprawia, że ​​projektant decyduje, że nawet znaczniki ASP.NET muszą być oznaczone runat = "server", aby były uruchamiane po stronie serwera.
nhahtdh
@nhahtdh jaka jest twoja odpowiedź?
Deweloper Marius Žilėnas
2
Nie mam odpowiedzi, ale najlepsze odpowiedzi odpowiadają na pytanie (poprawne lub nie). Twoja odpowiedź nie, i to jest powód mojego komentarza.
nhahtdh
3

Podejrzewam, że ma to związek ze sposobem identyfikacji kontroli po stronie serwera podczas przetwarzania. Zamiast sprawdzać każdą kontrolę w czasie wykonywania według nazwy, aby ustalić, czy należy wykonać przetwarzanie po stronie serwera, dokonuje wyboru reprezentacji węzła wewnętrznego według znacznika. Kompilator sprawdza, czy wszystkie elementy sterujące wymagające znaczników serwera mają je podczas etapu sprawdzania poprawności.

tvanfosson
źródło
2

Elementy HTML w plikach ASP.NET są domyślnie traktowane jako tekst. Aby te elementy były programowalne, dodaj runat="server"atrybut do elementu HTML. Ten atrybut wskazuje, że element powinien być traktowany jako kontrolka serwera.

ShaileshDev
źródło
1

Jest tak, ponieważ wszystkie formanty w ASP .NET dziedziczą po System.Web.UI.Control, który ma atrybut „runat”.

w klasie System.Web.UI.HTMLControl atrybut nie jest wymagany, jednak w klasie System.Web.UI.WebControl atrybut jest wymagany.

edycja: pozwól mi być bardziej szczegółowy. ponieważ asp.net jest w dużej mierze streszczeniem HTML, kompilator potrzebuje jakiegoś rodzaju dyrektywy, aby wiedział, że określony znacznik musi działać po stronie serwera. jeśli tego atrybutu nie było, to nie wiedziałby, jak go najpierw przetworzyć na serwerze. jeśli go nie ma, zakłada, że ​​jest to zwykły znacznik i przekazuje go klientowi.

Russ Bradberry
źródło
3
Twoja odpowiedź jest dokładnie sformułowanym pytaniem.
Pablo Fernandez,
2
Moja odpowiedź brzmiała po prostu, że atrybut runat istnieje z powodu dziedziczenia. Przepraszam za to, że nie był jasny.
Russ Bradberry,
3
Trochę za wysoko na stosie, obawiam się, moje pytanie dotyczyło tego, dlaczego w ogóle tam było. W każdym razie dzięki
John
2
Znów nie odpowiadam na pytanie, ale widzę, co próbujesz powiedzieć
John
1

Myślę, że Microsoft może naprawić tę dwuznaczność, zmuszając kompilator do dodania atrybutu runat przed skompilowaniem strony, coś w rodzaju skasowania tekstu, które java ma z ogólnymi, zamiast kasowania, może pisać runat = serwer, gdziekolwiek zobaczy asp: przedrostek dla tagów, więc programista nie musiałby się tym martwić.

Stefan
źródło
1

Jeśli używasz go na normalnych tagach HTML, oznacza to, że możesz programowo manipulować nimi w procedurach obsługi zdarzeń itp., Np. Zmienić href lub klasę tagu zakotwiczenia przy ładowaniu strony ... rób to tylko, jeśli musisz, ponieważ waniliowe tagi HTML Idź szybciej.

Jeśli chodzi o kontrole użytkowników i kontrolery serwera, nie, po prostu nie będą działać bez nich, bez zagłębiania się w wewnętrzne funkcje preprocesora aspx, nie potrafią powiedzieć dokładnie dlaczego, ale zgadną, że z prawdopodobnie dobrych powodów, właśnie napisali analizator składni w ten sposób, szukając rzeczy wyraźnie oznaczonych jako „zrób coś”.

Jeśli @JonSkeet jest gdzieś w pobliżu, prawdopodobnie będzie w stanie udzielić znacznie lepszej odpowiedzi.

seanb
źródło
0

Podczas przesyłania danych do serwera sieci Web ASP.NET formanty wymienione jako Runat = „serwer” będą reprezentowane jako obiekty Dot Net w aplikacji serwera. Możesz ręcznie wpisać kod w kontrolkach HTML lub użyć opcji Uruchom jako serwer, klikając prawym przyciskiem myszy w widoku projektu. Kontrolki ASP.NET automatycznie otrzymają ten atrybut po przeciągnięciu go z przybornika, gdzie zwykle nie kontrolki HTML.

Carthi
źródło
0

Dość redundantny atrybut, biorąc pod uwagę znacznik „asp” jest oczywiście elementem ASP i powinien wystarczyć do zidentyfikowania go jako elementu dostępnego po stronie serwera.

Gdzie indziej jednak podwyższał normalne tagi do wykorzystania w kodowaniu.

oczywista oczywistość
źródło
0

Doszedłem do tego wniosku metodą prób i błędów: runat = "serwer" jest potrzebny, aby uzyskać dostęp do elementów w czasie wykonywania po stronie serwera. Usuń je, ponownie skompiluj i obserwuj, co się stanie.

Jánosi Zoltán János
źródło
-5

runat="Server" wskazuje, że nastąpi zwrot do serwera dla „kontrolki” HTML.

Formularze internetowe używają postbackstale do sygnalizowania serwerowi przetworzenia zdarzenia kontroli strony.

.NET MVCstrony NIE używaj postback(z wyjątkiem formularza "submit"). MVCpolega na JQUERYzarządzaniu stroną po stronie klienta (w ten sposób omijając potrzebę postbackwysyłania dużej ilości wiadomości do serwera).

A zatem: .NETFormularze internetowe ... używaj "runat"atrybutów w znacznikach strony.

.NET MVCprawie nigdy nie używa "runat"atrybutu w znacznikach strony.

Mam nadzieję, że pomoże to wyjaśnić, dlaczego runatjest konieczne ...

pointcounterpoint
źródło
1
-1 Niedokładne fakty i nie odpowiada na pytanie.
Cristian Diaconescu