Почему ASP.NET webforms нужен атрибут Runat="Server"?

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

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

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

13 ответов


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

этот разговор был на блог между ним и Талботом Кроуэллом из Microsoft National Services. Соответствующая информация приведена ниже (первый абзац перефразирован из-за грамматических ошибок в источнике):

[...] но важность <runat="server"> больше для согласованности и расширяемости.

если разработчик должен отметить некоторые теги (viz. <asp: />) для ASP.NET двигатель игнорировать, то есть также потенциальная проблема коллизии пространств имен между тегами и будущими улучшениями. Требуя или "<%" префикс или ИКБ "<!– #include... (...) Кроме того, поскольку ASP.NET предназначен для разрешить разделение веб-дизайнеров (foo.aspx) от веб-разработчиков (foo.аспн.vb), веб-дизайнеры могут используйте свои собственные инструменты web designer для место HTML и JavaScript на стороне клиента без необходимости знать о ASP.NET конкретные теги или атрибуты.


Я обычно не люблю гадать, но я иду на это...

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

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

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

по теме: статья из реестра С некоторой историей .NET.


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

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

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

<asp:Button runat=server />

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


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

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

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


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


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


Это потому, что все элементы управления в ASP .NET наследуются от системы.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.Элемент управления, который имеет атрибут "runat".

в системе класса.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.HTMLControl, атрибут не требуется, однако, в системе классов.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.WebControl атрибут является обязательным.

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


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


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

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

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


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


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

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


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


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

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

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

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

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

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