Dlaczego muszę określać runat="server"
we wszystkich moich kontrolkach ASP.NET, gdy jest to atrybut obowiązkowy i server
jest 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?
asp.net
runatserver
johnc
źródło
źródło
Web.config
. Podczas procesu analizy domyślne atrybuty mogą być wstrzykiwane do DOM, jeśli to konieczne. Będę grał z tym pomysłem ...Odpowiedzi:
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):
Kontynuuje:
On kontynuuje:
źródło
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.
źródło
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.źródło
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">
Krótko mówiąc, aby umożliwić programowy dostęp do elementu HTML, dodaj
runat="server"
go.źródło
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.
źródło
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.źródło
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.
źródło
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ć.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
runat="Server"
wskazuje, że nastąpi zwrot do serwera dla „kontrolki” HTML.Formularze internetowe używają
postback
stale do sygnalizowania serwerowi przetworzenia zdarzenia kontroli strony..NET
MVC
strony NIE używajpostback
(z wyjątkiem formularza"submit"
).MVC
polega naJQUERY
zarządzaniu stroną po stronie klienta (w ten sposób omijając potrzebępostback
wysyłania dużej ilości wiadomości do serwera).A zatem:
.NET
Formularze internetowe ... używaj"runat"
atrybutów w znacznikach strony..NET
MVC
prawie nigdy nie używa"runat"
atrybutu w znacznikach strony.Mam nadzieję, że pomoże to wyjaśnić, dlaczego
runat
jest konieczne ...źródło