HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#Руководства</a></p>
1 <p><a>#Руководства</a></p>
2 <ul><li>9 сен 2019</li>
2 <ul><li>9 сен 2019</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Что делать, если сайт нужен был вчера, но писать его еще даже не начали? Самое время воспользоваться ASP.NET Web Forms!</p>
4 </ul><p>Что делать, если сайт нужен был вчера, но писать его еще даже не начали? Самое время воспользоваться ASP.NET Web Forms!</p>
5 <p> vlada_maestro / shutterstock</p>
5 <p> vlada_maestro / shutterstock</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p>ASP.NET Web Forms позволяет даже новичку быстро создать простой сайт. Если не планировать очень широкий функционал, то вполне можно справиться и за час.</p>
7 <p>ASP.NET Web Forms позволяет даже новичку быстро создать простой сайт. Если не планировать очень широкий функционал, то вполне можно справиться и за час.</p>
8 <p>Рассказываем, как это сделать, шаг за шагом.</p>
8 <p>Рассказываем, как это сделать, шаг за шагом.</p>
9 <p>Для начала создайте проект ASP.NET:</p>
9 <p>Для начала создайте проект ASP.NET:</p>
10 <p>Затем укажите его имя:</p>
10 <p>Затем укажите его имя:</p>
11 <p>А потом выберите модель Web Forms:</p>
11 <p>А потом выберите модель Web Forms:</p>
12 <p>Как только Visual Studio подготовит шаблон проекта, его можно будет запустить, чтобы проверить. Для этого нажмите кнопку IIS Express:</p>
12 <p>Как только Visual Studio подготовит шаблон проекта, его можно будет запустить, чтобы проверить. Для этого нажмите кнопку IIS Express:</p>
13 <p>Visual Studio скомпилирует все файлы, запустит сайт и откроет его в браузере по умолчанию. Если сайт не открылся, на него можно перейти самостоятельно. Для этого в трее найдите иконку IIS Express и посмотрите там адрес сайта. Он должен быть примерно таким:<a>http://localhost:5000</a>(цифры в конце могут отличаться).</p>
13 <p>Visual Studio скомпилирует все файлы, запустит сайт и откроет его в браузере по умолчанию. Если сайт не открылся, на него можно перейти самостоятельно. Для этого в трее найдите иконку IIS Express и посмотрите там адрес сайта. Он должен быть примерно таким:<a>http://localhost:5000</a>(цифры в конце могут отличаться).</p>
14 <p>Вот как выглядит шаблон сайта:</p>
14 <p>Вот как выглядит шаблон сайта:</p>
15 <p>Тут уже есть несколько страниц и немного стилей. Каждая страница состоит из трех файлов:</p>
15 <p>Тут уже есть несколько страниц и немного стилей. Каждая страница состоит из трех файлов:</p>
16 <ul><li><strong>Page.aspx</strong>. Файл с HTML-кодом страницы.</li>
16 <ul><li><strong>Page.aspx</strong>. Файл с HTML-кодом страницы.</li>
17 <li><strong>Page.aspx.cs</strong>. Класс, который отвечает за логику работы страницы.</li>
17 <li><strong>Page.aspx.cs</strong>. Класс, который отвечает за логику работы страницы.</li>
18 <li><strong>Page.aspx.designer.cs</strong>. Класс, который служит прослойкой между HTML и C#.</li>
18 <li><strong>Page.aspx.designer.cs</strong>. Класс, который служит прослойкой между HTML и C#.</li>
19 </ul><p>Вот как выглядит About.aspx этого проекта:</p>
19 </ul><p>Вот как выглядит About.aspx этого проекта:</p>
20 &lt;%@ Page Title="About" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="WebFormsApp1.About" %&gt; &lt;!--информация о файле--&gt; &lt;asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"&gt; &lt;h2&gt;&lt;%: Title %&gt;.&lt;/h2&gt;&lt;!--Вывод свойства--&gt; &lt;h3&gt;Your application description page.&lt;/h3&gt; &lt;p&gt;Use this area to provide additional information.&lt;/p&gt; &lt;p&gt;&lt;%: Text %&gt;&lt;/p&gt;&lt;!--Вывод свойства--&gt; &lt;/asp:Content&gt;<p>А вот класс, который занимается логикой:</p>
20 &lt;%@ Page Title="About" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="WebFormsApp1.About" %&gt; &lt;!--информация о файле--&gt; &lt;asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"&gt; &lt;h2&gt;&lt;%: Title %&gt;.&lt;/h2&gt;&lt;!--Вывод свойства--&gt; &lt;h3&gt;Your application description page.&lt;/h3&gt; &lt;p&gt;Use this area to provide additional information.&lt;/p&gt; &lt;p&gt;&lt;%: Text %&gt;&lt;/p&gt;&lt;!--Вывод свойства--&gt; &lt;/asp:Content&gt;<p>А вот класс, который занимается логикой:</p>
21 namespace WebFormsApp1 { public partial class About : Page //Класс { public string Text; //Свойство protected void Page_Load(object sender, EventArgs e) //Метод, который запускается при загрузке страницы { Text = "Hello, World!"; //При загрузке задается значение свойству Text } } }<p>В About.aspx находится только фрагмент готовой страницы. Остальная часть располагается в файле Site.Master или Site.Mobile.Master. Контент из тега &lt;asp:Content&gt; (About.aspx) встраивается на место тега &lt;asp:ContentPlaceHolder&gt; (Site.Master) с идентичным ID:</p>
21 namespace WebFormsApp1 { public partial class About : Page //Класс { public string Text; //Свойство protected void Page_Load(object sender, EventArgs e) //Метод, который запускается при загрузке страницы { Text = "Hello, World!"; //При загрузке задается значение свойству Text } } }<p>В About.aspx находится только фрагмент готовой страницы. Остальная часть располагается в файле Site.Master или Site.Mobile.Master. Контент из тега &lt;asp:Content&gt; (About.aspx) встраивается на место тега &lt;asp:ContentPlaceHolder&gt; (Site.Master) с идентичным ID:</p>
22 &lt;asp:ContentPlaceHolder ID="MainContent" runat="server"&gt;&lt;/asp:ContentPlaceHolder&gt;<p>Так на одной странице может быть несколько таких плейсхолдеров с разными ID: MainContent, RelevantArticles, Comments и так далее. Это позволяет легко управлять отдельными блоками страницы (как при использовании функции include () в PHP).</p>
22 &lt;asp:ContentPlaceHolder ID="MainContent" runat="server"&gt;&lt;/asp:ContentPlaceHolder&gt;<p>Так на одной странице может быть несколько таких плейсхолдеров с разными ID: MainContent, RelevantArticles, Comments и так далее. Это позволяет легко управлять отдельными блоками страницы (как при использовании функции include () в PHP).</p>
23 <p>Чтобы создать другие страницы, нажмите правой кнопкой на название проекта и в контекстном меню выберите<em>Add -&gt; Web Form:</em></p>
23 <p>Чтобы создать другие страницы, нажмите правой кнопкой на название проекта и в контекстном меню выберите<em>Add -&gt; Web Form:</em></p>
24 <p>Будет создана страница с таким кодом:</p>
24 <p>Будет создана страница с таким кодом:</p>
25 &lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Form1.aspx.cs" Inherits="WebFormsApp1.Form1" %&gt; &lt;!DOCTYPE html&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;head runat="server"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form id="form1" runat="server"&gt; &lt;div&gt; &lt;/div&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;<p>В этой странице нет тега &lt;asp:Content&gt;, поэтому шаблон из файла Site.Master отображаться не будет. Чтобы изменить это, можно скопировать код из About.aspx.</p>
25 &lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Form1.aspx.cs" Inherits="WebFormsApp1.Form1" %&gt; &lt;!DOCTYPE html&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;head runat="server"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form id="form1" runat="server"&gt; &lt;div&gt; &lt;/div&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;<p>В этой странице нет тега &lt;asp:Content&gt;, поэтому шаблон из файла Site.Master отображаться не будет. Чтобы изменить это, можно скопировать код из About.aspx.</p>
26 <p>Меню находится в Site.Master:</p>
26 <p>Меню находится в Site.Master:</p>
27 &lt;ul class="nav navbar-nav"&gt; &lt;li&gt;&lt;a runat="server" href="~/"&gt;Home&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a runat="server" href="~/About"&gt;About&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a runat="server" href="~/Contact"&gt;Contact&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a runat="server" href="~/Form1"&gt;Form1&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;<p>В начале ссылки ставится знак "~", а название файла указывается без расширения.</p>
27 &lt;ul class="nav navbar-nav"&gt; &lt;li&gt;&lt;a runat="server" href="~/"&gt;Home&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a runat="server" href="~/About"&gt;About&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a runat="server" href="~/Contact"&gt;Contact&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a runat="server" href="~/Form1"&gt;Form1&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;<p>В начале ссылки ставится знак "~", а название файла указывается без расширения.</p>
28 <p><strong>Обратите внимание, что в других файлах знак тильды в начале ставить не нужно.</strong></p>
28 <p><strong>Обратите внимание, что в других файлах знак тильды в начале ставить не нужно.</strong></p>
29 <p>Допустим, есть такая строка:</p>
29 <p>Допустим, есть такая строка:</p>
30 <p>Если ее вывести, то пользователь увидит текст "&lt;b&gt;Hello, World!&lt;/b&gt;", а не жирный шрифт. Чтобы передать в <a>HTML</a>-код строку вместе с тегом, нужно использовать не обычный тип<em>string</em>, а <em>HtmlString</em>:</p>
30 <p>Если ее вывести, то пользователь увидит текст "&lt;b&gt;Hello, World!&lt;/b&gt;", а не жирный шрифт. Чтобы передать в <a>HTML</a>-код строку вместе с тегом, нужно использовать не обычный тип<em>string</em>, а <em>HtmlString</em>:</p>
31 HtmlString PageContent = new HtmlString("&lt;b&gt;Hello, World!&lt;/b&gt;");<p>Дальше нужно получить данные из URL. Например, в ссылке /Article? id=1 хранится свойство id, которое необходимо, чтобы выбрать из базы данных статью с определенным идентификатором.</p>
31 HtmlString PageContent = new HtmlString("&lt;b&gt;Hello, World!&lt;/b&gt;");<p>Дальше нужно получить данные из URL. Например, в ссылке /Article? id=1 хранится свойство id, которое необходимо, чтобы выбрать из базы данных статью с определенным идентификатором.</p>
32 <p>Получить это свойство можно с помощью статического класса Request (в нем хранятся и другие данные о запросе пользователя):</p>
32 <p>Получить это свойство можно с помощью статического класса Request (в нем хранятся и другие данные о запросе пользователя):</p>
33 Request.QueryString["id"]<p>Перед тем как использовать значение, нужно проверить, существует ли оно, а потом привести его к необходимому типу:</p>
33 Request.QueryString["id"]<p>Перед тем как использовать значение, нужно проверить, существует ли оно, а потом привести его к необходимому типу:</p>
34 if (!string.IsNullOrEmpty(Request.QueryString["id"])) //Если значение не пустое { try { int id = Convert.ToInt32(Request.QueryString["id"]); //Попытка конвертировать строку в число } catch (Exception exc) { } }<p>Теперь значение можно использовать, чтобы открывать статьи по ссылке.</p>
34 if (!string.IsNullOrEmpty(Request.QueryString["id"])) //Если значение не пустое { try { int id = Convert.ToInt32(Request.QueryString["id"]); //Попытка конвертировать строку в число } catch (Exception exc) { } }<p>Теперь значение можно использовать, чтобы открывать статьи по ссылке.</p>
35 <p>Описанного выше достаточно, чтобы добавить возможность получать и выводить статьи из базы данных. Для этого создайте класс Article:</p>
35 <p>Описанного выше достаточно, чтобы добавить возможность получать и выводить статьи из базы данных. Для этого создайте класс Article:</p>
36 public class Article { public int ID; public string Title; public string Text; public Article() { this.ID = 0; this.Title = "No such article"; this.Text = "Wrong article ID!"; } public Article(int id, string title, string text) { this.ID = id; this.Title = title; this.Text = text; } }<p>Затем добавьте таблицу в базе данных с идентичными полями:</p>
36 public class Article { public int ID; public string Title; public string Text; public Article() { this.ID = 0; this.Title = "No such article"; this.Text = "Wrong article ID!"; } public Article(int id, string title, string text) { this.ID = id; this.Title = title; this.Text = text; } }<p>Затем добавьте таблицу в базе данных с идентичными полями:</p>
37 <p>Теперь можно создать класс для получения данных из СУБД:</p>
37 <p>Теперь можно создать класс для получения данных из СУБД:</p>
38 public static class Database { private static readonly string cs = @"Data Source=.\SQLEXPRESS;Initial Catalog=Site1;Integrated Security=True;"; //Строка с данными о подключении public static List&lt;Article&gt; Load() //Метод для получения списка статей { List&lt;Article&gt; articles = new List&lt;Article&gt;(); //Создание пустого списка using (SqlConnection connection = new SqlConnection(cs)) //Создание подключения { try { connection.Open(); SqlCommand command = new SqlCommand("SELECT * FROM articles", connection); //Команда для получения списка статей using (SqlDataReader reader = command.ExecuteReader()) //Выполнение запроса { if (reader.HasRows) { while (reader.Read()) //Чтение всех полученных записей { articles.Add(new Article(reader.GetInt32(0), reader.GetString(1), reader.GetString(2))); //Добавление статьи в список } } } } catch (Exception exc) { } } return articles; //Возвращение списка } public static Article Load(int id) //Метод загрузки конкретной статьи { Article article = new Article(); using (SqlConnection connection = new SqlConnection(cs)) { try { connection.Open(); SqlCommand command = new SqlCommand("SELECT * FROM articles WHERE id = @id", connection); command.Parameters.Add(new SqlParameter("@id", id)); using(SqlDataReader reader = command.ExecuteReader()) { if (reader.HasRows) { reader.Read(); article = new Article(reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); } } } catch (Exception exc) { } } return article; } }<p>Теперь можно перейти в код страницы и добавить получение и вывод статей в методе<em>Page_OnLoad ():</em></p>
38 public static class Database { private static readonly string cs = @"Data Source=.\SQLEXPRESS;Initial Catalog=Site1;Integrated Security=True;"; //Строка с данными о подключении public static List&lt;Article&gt; Load() //Метод для получения списка статей { List&lt;Article&gt; articles = new List&lt;Article&gt;(); //Создание пустого списка using (SqlConnection connection = new SqlConnection(cs)) //Создание подключения { try { connection.Open(); SqlCommand command = new SqlCommand("SELECT * FROM articles", connection); //Команда для получения списка статей using (SqlDataReader reader = command.ExecuteReader()) //Выполнение запроса { if (reader.HasRows) { while (reader.Read()) //Чтение всех полученных записей { articles.Add(new Article(reader.GetInt32(0), reader.GetString(1), reader.GetString(2))); //Добавление статьи в список } } } } catch (Exception exc) { } } return articles; //Возвращение списка } public static Article Load(int id) //Метод загрузки конкретной статьи { Article article = new Article(); using (SqlConnection connection = new SqlConnection(cs)) { try { connection.Open(); SqlCommand command = new SqlCommand("SELECT * FROM articles WHERE id = @id", connection); command.Parameters.Add(new SqlParameter("@id", id)); using(SqlDataReader reader = command.ExecuteReader()) { if (reader.HasRows) { reader.Read(); article = new Article(reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); } } } catch (Exception exc) { } } return article; } }<p>Теперь можно перейти в код страницы и добавить получение и вывод статей в методе<em>Page_OnLoad ():</em></p>
39 if (!string.IsNullOrEmpty(Request.QueryString["id"])) //Если есть id в url { Article article = new Article(); try { int id = Convert.ToInt32(Request.QueryString["id"]); //Получение ID article = Database.Load(id); //Загрузка статьи Title = article.Title; //Вывод информации PageContent = new HtmlString(article.Text); } catch (Exception exc) { } } else //Если нет id, то выводится список статей { Title = "Articles"; List&lt;Article&gt; articles = Database.Load(); if (articles.Count &gt;= 1) { string text = ""; foreach (Article article in articles) { text += $"&lt;a href='?id={article.ID}'&gt;{article.Title}&lt;/a&gt;&lt;br&gt;"; } PageContent = new HtmlString(text); } else { PageContent = new HtmlString("There are no articles yet!"); } }<p>Вот как это работает:</p>
39 if (!string.IsNullOrEmpty(Request.QueryString["id"])) //Если есть id в url { Article article = new Article(); try { int id = Convert.ToInt32(Request.QueryString["id"]); //Получение ID article = Database.Load(id); //Загрузка статьи Title = article.Title; //Вывод информации PageContent = new HtmlString(article.Text); } catch (Exception exc) { } } else //Если нет id, то выводится список статей { Title = "Articles"; List&lt;Article&gt; articles = Database.Load(); if (articles.Count &gt;= 1) { string text = ""; foreach (Article article in articles) { text += $"&lt;a href='?id={article.ID}'&gt;{article.Title}&lt;/a&gt;&lt;br&gt;"; } PageContent = new HtmlString(text); } else { PageContent = new HtmlString("There are no articles yet!"); } }<p>Вот как это работает:</p>
40 <p>Вот так примерно за час создается простой сайт с подключением к базе данных и выводом статей. Основная логика готова, но, чтобы выложить его в сеть, нужно еще позаботиться:</p>
40 <p>Вот так примерно за час создается простой сайт с подключением к базе данных и выводом статей. Основная логика готова, но, чтобы выложить его в сеть, нужно еще позаботиться:</p>
41 <ul><li>о внешнем виде;</li>
41 <ul><li>о внешнем виде;</li>
42 <li>ограничении количества выводимых статей;</li>
42 <li>ограничении количества выводимых статей;</li>
43 <li>админской панели;</li>
43 <li>админской панели;</li>
44 <li>наполнении страниц и других важных вещах.</li>
44 <li>наполнении страниц и других важных вещах.</li>
45 </ul><a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
45 </ul><a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>