Зачем веб-формам ASP.NET нужен атрибут Runat = «Server»?


205

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

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

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


2
Я согласен с этим вопросом, чтобы уточнить немного, разве «asp:» (и другие теги, которые вы указываете в заголовке) не достаточно для анализа? или runat получает удар после того, как элемент управления был преобразован в INPUT, поэтому он неотличим от другого HTML? Я думаю, что Рунат будет поражен, пока он все еще находится в форме управления сервером ...
конец

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:>, когда это может быть безопасным значением по умолчанию.
Белогабоб

33

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

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

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

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

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


5
У вас случайно есть ссылка на сайт, на котором есть какая-то "странная реклама"?
RandomWebGuy

Да, я помню странные объявления. вздох
корм для кошек

13

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

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

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

<asp:Button runat=server />

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


2
Если на сервере работает элемент управления, означает ли это, что вы не можете выбирать элементы с помощью Javascript? например, document.getElementsById ("tvns: treeview");
Кьяран Галлахер

3
Элемент по-прежнему будет находиться в DOM на клиенте, поэтому его можно изменить с помощью javascript / jQuery. Однако работать с элементами, отображаемыми на сервере, довольно сложно, особенно с динамическими элементами управления.
Дейв Сверски,

8

Статья 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"к нему.


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

3
@nhahtdh Ответ: «включить программный доступ к элементу HTML». :)
Разработчик Marius Žilėnas

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

@nhahtdh каков твой ответ?
Разработчик Мариус Жиленас

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
Мой ответ был просто о том, что атрибут runat существует из-за наследования. Мои извинения за то, что не ясно.
Расс Брэдберри

3
Боюсь, что он слишком высок в стеке, мой вопрос был о том, почему он вообще был там. В любом случае, спасибо
johnc 22.12.08

2
Опять же, не совсем отвечаю на вопрос, но я вижу, что вы пытаетесь сказать
johnc

1

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


1

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

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

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


0

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


0

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

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


0

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


-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.