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

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

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

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

Ответы [ 13 ]

109 голосов
/ 20 ноября 2008

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

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

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

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

Продолжение:

Если <runat=client> требуется для всех клиентских тегов, парсер должен будет проанализировать все теги и удалить часть <runat=client>.

Он продолжает:

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

33 голосов
/ 20 ноября 2008

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

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

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

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

Похожие: Статья из Реестра с некоторой историей .NET.

13 голосов
/ 20 ноября 2008

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

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

По сути, это то же самое, что и

<asp:Button runat=server />

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

8 голосов
/ 05 апреля 2016

Статья 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".

3 голосов
/ 20 ноября 2008

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

2 голосов
/ 02 апреля 2015

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

1 голос
/ 20 ноября 2011

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

1 голос
/ 22 декабря 2008

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

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

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

1 голос
/ 20 ноября 2008

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

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

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

0 голосов
/ 30 декабря 2017

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

...