Почему веб-формы ASP.NET нуждаются в атрибуте Runat = "Server"?

Почему мне нужно указывать runat="server" на всех элементах управления ASP.NET, когда это обязательный атрибут, и server - единственный параметр, доступный в моих ограниченных знаниях ASP.NET, и я получаю сообщение об ошибке, если я не использовать его?

Я понимаю, что я могу по желанию использовать его в своих тегах HTML, и я понимаю парадигму клиент/сервер и то, что она на самом деле указывает.

Является ли это избыточным тегом, который может быть просто подразумевается элементом управления ASP.NET, или есть основная причина?

Ответ 1

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

Этот разговор был сделан на Майке Шинкеле Blog между ним и Тэлботом Кроуэллом из 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 определенные теги или атрибуты.

Ответ 2

Мне обычно не нравится догадываться, но я собираюсь на этом...

Если вы помните маркетинговую рекламу Microsoft.NET в тот же день (2001?), было сложно сказать, что такое .NET. Это сервер? платформу программирования? язык? что-то новое полностью? Учитывая объявления, было неоднозначно все, что вы хотели, чтобы это было - это просто решило любую проблему, которую вы могли бы иметь.

Итак, я думаю, было скрытое видение того, что код ASP.NET может работать где угодно - на стороне сервера или на стороне клиента, в копии Internet Explorer, привязанной к среде выполнения .NET. runat = "сервер" - это просто остаточный остаток, оставленный позади, потому что его эквивалент на стороне клиента никогда не делал его для производства.

Помните эти странные объявления?

Связанный: Статья из Регистра с некоторой историей .NET.

Ответ 3

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

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

Это по существу то же самое, что:

<asp:Button runat=server />

Удалите тег runat = server из первого, и у вас есть стандартная кнопка HTML, которая запускается в браузере. Есть причины для и против запуска определенного контроля на сервере, и ASP.NET не может "предполагать" то, что вы хотите, на основе разметки HTML, которую вы включаете. Возможно, можно "вывести" runat = server для семейства элементов управления <asp:XXX />, но я предполагаю, что Microsoft рассмотрит это как взломать синтаксис разметки и механизм ASP.NET.

Ответ 4

Мое подозрение заключается в том, что оно связано с тем, как серверные элементы управления идентифицируются во время обработки. Вместо того, чтобы проверять каждый элемент управления во время выполнения по имени, чтобы определить, нужно ли выполнять обработку на стороне сервера, он делает выбор во внутреннем представлении node по тегу. Компилятор проверяет, чтобы все элементы управления, требующие серверных тегов, имели их во время шага проверки.

Ответ 5

Microsoft Msdn article "Забытые элементы управления: HTML-серверы" объясняет использование runat = "server" с примером в текстовом поле <input type="text"> by преобразуя его в <input type="text" id="Textbox1" runat="server">

Выполнение этого даст вам программный доступ к элементу HTML на сервер до веб-страницы создается и отправляется клиенту. Элемент HTML должен содержать атрибут id. Этот атрибут служит как идентификатор для элемента и позволяет вам программировать элементы по их конкретным идентификаторам. В дополнение к этому атрибуту элемент HTML должен содержать runat = "server". Это сообщает серверу обработки, что  тег обрабатывается на сервере и не должен рассматриваться как традиционный HTML-элемент.

Вкратце, чтобы включить программный доступ к элементу HTML, добавьте runat="server" к нему.

Ответ 6

Если вы используете его на обычных тэгах html, это означает, что вы можете программно манипулировать ими в обработчиках событий и т.д., например, изменить href или класс привязывающего тега на загрузку страницы... только делать это, если вам нужно, потому что Ванильные html-метки идут быстрее.

Что касается пользовательских элементов управления и элементов управления сервером, нет, они просто не будут работать без них, не вникая в внутренности препроцессора aspx, не могли бы точно сказать, почему, но предположили бы, что, вероятно, они просто так писали парсер, ища вещи, явно обозначенные как "сделать что-то".

Если @JonSkeet находится где угодно, он, вероятно, сможет дать гораздо лучший ответ.

Ответ 7

Это там, потому что все элементы управления в ASP.NET наследуют от System.Web.UI.Control, который имеет атрибут "runat".

в классе System.Web.UI.HTMLControl, атрибут не требуется, однако, в классе System.Web.UI.WebControl требуется атрибут.

изменить позвольте мне быть более конкретным. поскольку asp.net - это в значительной степени абстрактное выражение HTML, компилятору нужна какая-то директива, чтобы он знал, что конкретный тег должен работать на стороне сервера. если этого атрибута не было, тогда не будет знать, как обрабатывать его на сервере в первую очередь. если он не существует, он предполагает, что он является обычной разметкой и передает ее клиенту.

Ответ 8

Я думаю, что Microsoft может устранить эту двусмысленность, сделав компилятор добавленным атрибутом runat до того, как страница будет скомпилирована, что-то вроде стирания типа, которое имеет java с генериками, вместо стирания может быть написано runat = server везде, где он видит asp: префикс для тегов, поэтому разработчику не нужно беспокоиться об этом.

Ответ 9

HTML-элементы в файлах ASP.NET по умолчанию обрабатываются как текст. Чтобы эти элементы были программируемыми, добавьте атрибут runat="server" к элементу HTML. Этот атрибут указывает, что элемент должен рассматриваться как серверный элемент управления.

Ответ 10

При отправке данных на веб-сервер ASP.NET элементы управления, указанные как Runat = "server", будут представлены как объекты Dot Net в приложении Server. Вы можете вручную ввести код в элементах управления HTML, а также использовать параметр "Использовать как сервер", щелкнув правой кнопкой мыши в режиме проектирования. Элементы управления ASP.NET автоматически получат этот атрибут, как только вы перетащите его из панели инструментов, где обычно не используются элементы управления HTML.

Ответ 11

Довольно избыточный атрибут, учитывая тег asp, является, очевидно, элементом ASP, и его должно быть достаточно, чтобы идентифицировать его как доступный на стороне сервера элемент.

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

Ответ 12

Я пришел к такому выводу с помощью проб и ошибок: runat = "server" необходим для доступа к элементам во время выполнения на стороне сервера. Удалите их, перекомпилируйте и посмотрите, что произойдет.

Ответ 13

runat="Server" указывает, что для управления HTML будет выполняться обратная передача на сервер.

Веб-формы используют postback постоянно, чтобы сигнализировать серверу о обработке события управления страницей.

Страницы

.NET MVC НЕ используйте postback (кроме формы "submit"). MVC полагается на JQUERY для управления страницей на стороне клиента (таким образом, обходя необходимость большого количества сообщений postback на сервере).

Итак: .NET Веб-формы... использовать "runat" атрибут много в разметке страницы.

.NET MVC вряд ли когда-либо использует атрибут "runat" в разметке страницы.

Надеюсь, что это поможет выяснить, почему runat необходимо...