Чому для веб-форм ASP.NET потрібен атрибут Runat = “Server”?


205

Чому я повинен вказувати runat="server"на всіх своїх елементах управління ASP.NET, коли він є обов'язковим атрибутом і serverє єдиним варіантом, доступним за моїх обмежених знань про ASP.NET, і я отримую помилку, якщо я не використовую її?

Я розумію, що я необов'язково можу використовувати її в моїх тегах HTML, і я розумію парадигму клієнт / сервер і те, що вона насправді вказує.

Це зайвий тег, який може бути зрозумілим лише тим, що елемент управління є ASP.NET, чи є причина, що лежить в основі?


2
Я погоджуюся з цим питанням, щоб уточнити трохи, чи недостатньо "asp:" (та інших тегів, які ви вказуєте у заголовку) для розбору? чи потрапляє рунат після перетворення елемента на ВХОД, тим самим він не відрізняється від іншого HTML? Я б подумав, що рунату вдарять, поки він ще знаходиться у формі управління сервером ...
abend

1
Можливо, додати такий варіант конфігурації " атрибут за замовчуванням ", який може бути префіксом або ім'ям, до Web.configвідповідного способу. Під час процесу розбору атрибути за замовчуванням можуть бути введені в DOM, де це необхідно. Я
пограю

Відповіді:


112

Я завжди вважав, що там є більше для розуміння того, що ви можете змішувати теги ASP.NET та HTML теги, а HTML-теги мають можливість бути runat="server"чи ні. Залишити тег нічого не завадить, і це спричинить помилку компілятора, щоб вийняти його. Чим більше ви маєте на увазі під веб-мовою, тим менш легким буде програміст-початківець. Це настільки ж хороша причина, як і будь-який, щоб бути багатослівним щодо атрибутів тегів.

Ця розмова велася в блозі Майка Шінкеля між собою та Талботом Кроуеллом із Microsoft National Services. Відповідна інформація наведена нижче (перший абзац перефразований через граматичні помилки в джерелі):

[...] але важливіше значення <runat="server">полягає в послідовності та розширюваності.

Якщо розробник повинен позначити деякі теги (саме <asp: />), щоб ASP.NET Engine ігнорував, то також існує потенційна проблема зіткнень простору імен серед тегів та майбутніх удосконалень. Вимагаючи <runat="server">атрибута, це заперечується.

Це продовжується:

Якщо <runat=client>це потрібно для всіх тегів на стороні клієнта, аналізатору потрібно буде розібрати всі теги та викреслити <runat=client>частину.

Він продовжує:

В даний час, якщо я здогадуюсь, правильно, аналізатор просто ігнорує весь текст (теги або відсутні теги), якщо це не тег з runat=serverатрибутом або " <%" префікс або ssi " <!– #include... (...) Крім того, оскільки ASP.NET призначений щоб дозволити відділення веб-дизайнерів (foo.aspx) від веб-розробників (foo.aspx.vb), веб-дизайнери можуть використовувати власні інструменти веб-дизайнера для розміщення HTML та JavaScript на стороні клієнта, не знаючи про ASP.NET конкретні теги чи атрибути.


59
Незалежно від причини, все-таки PITA потрібно вводити його для кожного тегу <asp:>, коли це безпечно може бути значенням за замовчуванням.
belugabob

33

Я зазвичай не люблю здогадуватися, але я збираюся на цьому ...

Якщо ви пам’ятаєте маркетинг .NET маркетинг .NET ще в той день (2001?), Важко було сказати, що таке .NET навіть було. Це був сервер? платформа програмування? мова? щось нове цілком? Враховуючи рекламу, це було неоднозначно все, що ви хотіли, щоб це було - це просто вирішило будь-яку проблему, яка у вас може виникнути.

Отже, я гадаю, чи існувало приховане велике бачення того, що код ASP.NET може працювати будь-де - на стороні сервера АБО на стороні клієнта, в копії Internet Explorer, прив’язаної до часу виконання .NET. runat = "сервер" - це просто неприємний залишок, залишений позаду, оскільки його еквівалент на стороні клієнта ніколи не зробив його виробництвом.

Пам’ятаєте ті дивні оголошення?

Пов'язане: Стаття з Реєстру з деякою історією .NET.


5
Чи трапляється у вас посилання на сайт, який містить будь-яку з "дивних оголошень"?
RandomWebGuy

Так, я пам’ятаю дивні оголошення. Зітхання
Catfood

13

Не всі елементи управління, які можуть бути включені на сторінку, повинні запускатися на сервері. Наприклад:

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

Це по суті те саме, що:

<asp:Button runat=server />

Видаліть тег runat = сервер із першого, і у вас є стандартна кнопка HTML, яка працює в браузері. Існують причини і проти запуску певного контролю на сервері, і ASP.NET не може "припустити" те, що ви хочете, на основі розмітки HTML, яку ви включаєте. Можливо, можна «зробити» сервер runat = для <asp:XXX />сімейства елементів керування, але я гадаю, що Microsoft вважає, що це злом синтаксису розмітки та двигуна ASP.NET.


2
Якщо на сервері працює керування, чи означає це, що ви не можете вибрати елементи за допомогою Javascript? наприклад document.getElementsById ("tvns: treeview");
Ciaran Gallagher

3
Елемент все ще буде знаходитись у DOM у клієнта, тому його все одно можна змінити за допомогою javascript / jQuery. Робота з елементами, що передаються сервером, може бути складною, однак, особливо з динамічними елементами управління.
Дейв Сверський

8

Стаття Microsoft Msdn The Forgotten Controls: HTML Server Controls пояснює використання runat = "server" із прикладом на текстовому полі <input type="text">шляхом перетворення його в<input type="text" id="Textbox1" runat="server">

Це дозволить отримати програмний доступ до елемента HTML на сервері до створення веб-сторінки та надсилання клієнту. Елемент HTML повинен містити атрибут id. Цей атрибут служить ідентичністю елемента та дозволяє програмувати елементи за їх конкретними ідентифікаторами. Крім цього атрибута, елемент HTML повинен містити runat = "сервер". Це повідомляє серверу обробки, що тег обробляється на сервері і не повинен вважатися традиційним HTML-елементом.

Коротше кажучи, для включення програмного доступу до HTML-елемента додайте runat="server"до нього.


2
Не стосується питання, яке задає питання, чому runat = "сервер" є обов'язковим для тегів ASP.NET.
nhahtdh

3
@nhahtdh Відповідь така: "увімкнути програмний доступ до елемента HTML". :)
Розробник Marius Žilėnas

2
ОП знає, що означає тег і що він робить. Питання задається з точки зору мовного дизайну - що змушує дизайнера вирішити, що навіть теги ASP.NET повинні бути позначені runat = "сервер", щоб запускатись на стороні сервера.
nhahtdh

@nhahtdh, що ти відповідаєш?
розробник Marius Žilėnas

2
У мене немає відповіді, але верхні відповіді стосуються питання (правильний чи ні). Ваша відповідь ні, і це причина мого коментаря.
nhahtdh

3

Я підозрюю, що це стосується того, як ідентифікуються елементи керування на стороні сервера під час обробки. Замість того, щоб перевіряти кожен елемент управління під час виконання імені, щоб визначити, чи потрібно виконувати обробку на стороні сервера, він робить вибір на внутрішньому представленні вузла за тегом. Компілятор перевіряє, щоб усі елементи управління, які вимагають тегів серверів, мали їх на етапі перевірки.


2

Елементи HTML у файлах ASP.NET за замовчуванням розглядаються як текст. Щоб зробити ці елементи програмованими, додайте runat="server"атрибут до елемента HTML. Цей атрибут вказує на те, що цей елемент слід розглядати як керування сервером.


1

Це там, тому що всі елементи керування ASP .NET успадковують від System.Web.UI.Control, який має атрибут "runat".

у класі System.Web.UI.HTMLControl атрибут не потрібен, однак у класі System.Web.UI.WebControl необхідний атрибут.

редагувати: дозвольте бути більш конкретним. оскільки asp.net - це майже абстрактний HTML, компілятору потрібна якась директива, щоб він знав, що конкретний тег повинен працювати на сервері. якщо цього атрибута не було, то не знав би спершу обробити його на сервері. якщо його немає, він передбачає, що це регулярна розмітка і передає її клієнту.


3
Ваша відповідь - це саме переформульоване питання.
Пабло Фернандес

2
Моя відповідь була просто твердженням, що атрибут рунату є завдяки спадщині. Вибачте, що я не зрозуміла.
Russ Bradberry

3
Боюсь, трохи надто високо в групі, моє запитання стосувалося того, чому це було в першу чергу. Все одно
дякую

2
Знову ж таки, не дуже відповідаючи на запитання, але я бачу, що ви намагаєтесь сказати
johnc

1

Я думаю, що Microsoft може виправити цю неоднозначність, змусивши компілятор додати атрибут runat перед тим, як сторінка коли-небудь буде складена, щось на зразок стирання типу, яке має Java з дженериками, замість стирання, це може писати runat = сервер, де б він не бачив asp: префікс для тегів, тому розробнику не потрібно буде про це турбуватися.


1

Якщо ви використовуєте його для звичайних тегів html, це означає, що ви можете програмно маніпулювати ними в обробниках подій тощо, наприклад, змінити href або клас якорного тегу при завантаженні сторінки ... робити це лише в разі необхідності, тому що html-теги vanilla йти швидше.

Що стосується керування користувачами та керування серверами, ні, вони просто не прагнуть працювати без них, не заглиблюючись у внутрішні частини препроцесора aspx, не можуть точно сказати чому, але гадали б, що, напевно, з добрих причин вони просто написали парсер таким чином шукає речі, явно позначені як "зробити щось".

Якщо @JonSkeet десь є, він, ймовірно, зможе дати набагато кращу відповідь.


0

Під час подання даних на веб-сервер ASP.NET, елементи управління, згадані як Runat = “сервер”, будуть представлені як Dot Net об’єкти в серверній програмі. Ви можете ввести код вручну в елементах керування HTML або ж використовувати параметр Запустити як сервер , клацнувши правою кнопкою миші у вікні дизайну. Елементи керування ASP.NET автоматично отримують цей атрибут, як тільки ви перетянете його з панелі інструментів, де зазвичай елементи керування HTML відсутні.


0

Досить зайвий атрибут, враховуючи тег "asp", очевидно, є елементом ASP, і його повинно бути достатньо, щоб визначити його як доступний для сервера елемент.

В іншому випадку він використовувався для підняття нормальних тегів, які використовуються в коді.


0

Я щойно прийшов до цього висновку методом проб і помилок: runat = "сервер" потрібен для доступу до елементів під час виконання на сервері. Видаліть їх, перекомпілюйте і спостерігайте, що відбувається.


-5

runat="Server" вказує, що для "керування HTML" відбудеться зворотний зворот до сервера.

Веб-форми postbackпостійно використовують для передачі сигналу серверу обробку події управління сторінкою.

.NET MVCсторінки НЕ використовуються postback(крім форми "submit"). MVCпокладається на JQUERYкерування сторінкою на стороні клієнта (тим самим обминаючи потребу у великій кількості postbackповідомлень на сервері).

Отже: .NETВеб-форми ... багато використовуйте "runat"атрибут у розмітці сторінки.

.NET MVCмайже не використовує "runat"атрибут у розмітці сторінки.

Сподіваюсь, це допоможе з’ясувати, чому runatце потрібно ...


1
-1 Неточні факти і не відповідають на запитання.
Крістіан Діаконеску
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.