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

StackOverflow https://stackoverflow.com/questions/304290

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Я всегда считал, что это больше для понимания того, что вы можете смешивать теги 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 определенные теги или атрибуты.

Другие советы

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

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

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

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

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

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

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

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

< asp: Button runat = server / >

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

В статье Microsoft Msdn Забытые элементы управления: элементы управления HTML-сервером объясняется использование из runat = " сервер " с примером в текстовом поле < тип ввода = " текст " > путем преобразования его в < тип ввода = " текст " ID = & Quot; Textbox1 & Quot; Runat = & Quot; Сервер & Quot; & GT;

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.NET MVC страницы НЕ ИСПОЛЬЗУЙТЕ postback (за исключением формы "submit"). MVC полагается на JQUERY управлять страницей на стороне клиента (таким образом минуя необходимость большого количества postback сообщения на сервер).

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top