Что такое код asp maxbandwidth

Содержание

Как стиль asp: DropDownList с max-w >

Я мог бы использовать некоторую помощь при стилизации моего DropDownList и установить его на max-width: 100%. Попробовали несколько вещей, но ничего не работает. Я пробовал до сих пор:

Вход не работал в Asp: DropDownList, но отлично работал с Asp: TextBox. Я не хочу устанавливать ширину в пикселях, как W , потому что она должна изменить размер, потому что она отзывчива.

Код

Как вы можете видеть в коде, у меня есть два Asp: DropDownLists, которые должны быть встроены друг в друга. Какие у меня варианты?

Я вижу, что вы используете класс form-inline Bootstrap, чтобы попытаться сделать два списка встроенными. Вместо этого используйте вместо этого form-horizontal :

Вы можете использовать Id своего DropDownList чтобы при необходимости DropDownList его. Во-первых, я бы порекомендовал проверять, что Идентификатор будет отображаться один раз на стороне клиента, а затем соответствующим образом нарисует его. На моем локальном dev идентификатор DropDownList отображается следующим образом

Итак, все, что вам нужно в CSS

У меня есть два Asp: DropDownLists, которые должны быть встроены друг в друга.

означает, что вы хотите, чтобы ваши два ddl были в одной строке? если это так, он должен работать, просто измените max-width для этого style=»width:49%»

Ширина составляет 49% из-за заполнения/границ элементов управления, вы можете установить его на 50%, но тогда вы должны избавиться от двух свойств

РЕДАКТИРОВАТЬ

Это не выглядит правильно, когда размер экрана идет в режиме ipad/iphone

AFAIK — это то, как он должен работать, из документации по форме Bootstrap Inline

Добавьте.form-inline в свою форму (которая не обязательно должна быть a) для элементов с выравниванием по левому краю и встроенного блока. Это относится только к формам в видовых экранах шириной не менее 768 пикселей.

Обходной путь, если вы хотите получить такое же поведение, вместо этого используйте таблицу

Веб-элементы управления

Серверные элементы управления HTML предлагают относительно быстрый, но не наилучший способ миграции на ASP. NET, поскольку имена элементов управления HTML и их атрибуты не всегда интуитивно понятны и не обладают одинаковой поддержкой на этапе проектирования для связывания с обработчиками событий. Элементы управления HTML также обладают определенными ограничениями, например, свойства стилей должны устанавливаться с применением синтаксиса CSS (более сложного, чем установка прямого свойства), а события изменения не могут генерироваться до тех пор, пока страница не будет отправлена в ответ на другое действие.

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

Для решения этих проблем ASP.NET предоставляет высокоуровневую модель веб-элементов управления. Все веб-элементы управления определены в пространстве имен System.Web.UI.WebControls и являются производными от базового класса WebControl, реализующего более абстрактную и согласованную модель, чем модель серверных элементов управления HTML. Веб-элементы управления также поддерживают дополнительные средства, такие как автоматическая обратная отправка. Но действительно примечательным является то, что многие усовершенствованные элементы управления не просто отображаются на отдельный HTML-дескриптор, но генерируют более сложный вывод, состоящий из нескольких HTML-дескрипторов и JavaScript-кода. В качестве примеров можно привести списки флажков, переключатели, календари, редактируемые сетки и т.д.

Ниже показана часть иерархии наследования веб-элементов управления:

Базовый класс WebControl

Все веб-элементы управления унаследованы от класса WebControl. Сам класс WebControl, в свою очередь, наследуется от Control. Поэтому многие его свойства и методы, например, Controls, Visible и FindControl(), похожи на свойства и методы серверных элементов управления HTML. Однако класс WebControl добавляет еще и свойства, перечисленные ниже:

Свойства класса WebControl

Свойство Описание
AccessKey Возвращает или устанавливает сокращенную клавиатурную комбинацию, позволяющую быстро переместиться на элемент управления. Например, при установке в А пользователь может переместить фокус на этот элемент управления, нажав комбинацию
BackColor Возвращает или устанавливает цвет фона
BorderColor Возвращает или устанавливает цвет границы
BorderStyle Одно из значений перечисления BorderStyle: Dashed, Dotted, Double, Groove, Ridge, Inset, Outset, Solid и None
BorderWidth Возвращает или устанавливает ширину границы
CssClass Возвращает или устанавливает стиль CSS для элемента управления. Стиль CSS может быть определен в разделе в верхней части страницы или же в отдельном файле CSS, на который ссылается страница
Enabled Возвращает или устанавливает активизированное состояние элемента управления. При значении false элемент управления становится неактивным (отображается серым цветом)
Font Возвращает объект со всей информацией о стилях шрифта, используемого для текста элемента управления
ForeColor Возвращает или устанавливает цвет изображения, например, цвет текста элемента управления
Height Возвращает или устанавливает высоту элемента управления
TabIndex Число, позволяющее управлять порядком обхода по клавише . Элемент управления с нулевым TabIndex получает фокус при первой загрузке страницы. Нажатие клавиши перемещает пользователя на элемент управления со следующим наиболее низким TabIndex при условии, что он активен. Это свойство поддерживается только в браузере Internet Explorer 4.0 и в последующих его версиях
Tooltip Отображает текстовое сообщение, когда пользователь наводит на элемент управления курсор мыши. Во многих более старых браузерах это свойство не поддерживается
Width Возвращает или устанавливает значение ширины элемента управления

Многие из этих свойств заключают в себе атрибуты стиля CSS наподобие цвета изображения либо фонового цвета, шрифта, высоты, ширины и прочего. Эти свойства позволяют намного проще конфигурировать внешний вид веб-элемента управления и уменьшают вероятность ошибок.

Базовые классы веб-элементов управления

В состав ASP.NET входят веб-элементы управления, дублирующие каждый из серверных элементов управления HTML и предоставляющие точно такие же функциональные возможности. Эти веб-элементы управления унаследованы от класса WebControl и вдобавок имеют ряд собственных свойств и событий. Все они кратко перечислены в следующей таблице:

Базовые классы веб-элементов управления

.
Объявление дескриптора ASP.NET Генерируемая HTML-разметка Ключевые члены
или Text, CausesValidation, PostBackUrl, ValidationGroup, событие Click
AutoPostBack, Checked, Text, TextAlign, событие CheckedChanged
FileBytes, FileContent, FileName, HasFile, PostedFile, SaveAs()
Value
. ImageUrl, NavigateUrl, Target, Text
AlternateText, ImageAlign, ImageUrl
CausesValidation, ValidationGroup, событие Click
HotSpotMode, HotSpots (коллекция), AlternateText, ImageAlign, ImageUrl
. Text, AssociatedControlID
Text, CausesValidation, ValidationGroup, событие Click
BackImageUrl, DefaultButton, GroupingText, HorizontalAlign, Scrollbars, Wrap
AutoPostBack, Checked, GroupName, Text, TextAlign, событие CheckedChanged
.
BackImageUrl, CellPadding, Cellspacing, GridLines, HorizontalAlign, Rows (коллекция)
. ColumnSpan, HorizontalAlign, RowSpan, Text, VerticalAlign, Wrap
Cells (коллекция), HorizontalAlign, VerticalAlign
или AutoPostBack, Columns, MaxLength, Readonly, Rows, Text, TextMode, Wrap, событие TextChanged

Все свойства веб-элементов управления интуитивно понятны. Одной из целей веб-элементов управления является упрощение установки атрибутов элемента управления с помощью свойств с согласованными именами без необходимости думать о деталях их преобразования в код HTML (хотя хорошее знание HTML, безусловно, поможет).

Для начала ознакомления с некоторыми ключевыми отличиями между серверными элементами управления HTML и веб-элементами управления рассмотрим следующий дескриптор веб-элемента управления:

По сути, этот дескриптор генерирует текстовое поле шириной в 250 пикселей, с красным цветом переднего плана и светло-желтым цветом фона. Текст выводится шрифтом Verdana размером 20 и полужирным начертанием. Ниже описаны различия между предыдущим объявлением и соответствующим объявлением дескриптора HTML:

Элемент управления объявляется с использованием имени класса (TextBox) вместо имени дескриптора HTML (input).

Содержимое по умолчанию устанавливается с помощью свойства Text, а не менее очевидного атрибута Value.

Атрибуты стилей (цвета, ширина и шрифт) устанавливаются через прямые свойства вместо группировки их в одном атрибуте стиля.

В объявлении каждого элемента управления обязательно должен либо присутствовать соответствующий закрывающий дескриптор, либо использоваться /> (синтаксис пустого элемента) в конце открывающего дескриптора. Другими словами, дескрипторы ASP.NET следуют тем же правилам, что и дескрипторы XHTML. Если не закрыть дескриптор, во время выполнения обязательно возникнет ошибка. Тем не менее, нарушение этого правила при работе с серверными элементами управления HTML ни к каким неблагоприятным последствиям не приводит.

Все веб-элементы управления должны объявляться внутри дескриптора серверной формы (и может существовать только одна серверная форма на страницу), даже если они не вызывают обратной отправки. В противном случае вы получите ошибку времени выполнения. Это правило необязательно при работе с серверными элементами управления HTML в отсутствие необходимости обработки обратных отправок.

Если запросить страницу с таким дескриптором, то при ее визуализации соответствующий элемент управления будет преобразован в следующий дескриптор HTML:

Единицы измерения

Все свойства элементов управления, использующие размеры, в том числе BorderWidth, Height и Width, требуют структуры Unit, комбинирующей числовое значение с единицей измерения (пиксели, проценты и т.п.). Это означает, что при установке этих свойств в дескрипторе элемента управления вы должны добавить к числу рх (для пикселей) или % (для процентов) для указания типа единицы измерения.

Ниже приведен пример с элементом управления Panel, высота которого равна 300 пикселей, а ширина составляет 50 процентов размера текущего окна браузера:

При установке основанного на единицах свойства в коде необходимо использовать один из статических методов типа Unit. Применяйте Pixel() для значения в пикселях и Percentage() — для значения в процентах:

Перечисления

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

В файле .aspx перечисление устанавливается за счет указания в строке одного из допустимых значений. Имя перечислимого типа не задается, а определяется автоматически.

Цвета

Свойство Color относится к объекту Color из пространства имен System.Drawing. Объекты Color можно создавать несколькими способами:

Использование цветового значения ARGB (альфа-канал, красная, зеленая и синяя составляющие). Каждое значение задается в виде целого числа.

Использование предопределенного в .NET имени цвета. Из класса Color выбирается свойство с соответствующим именем, доступное только для чтения. Эти свойства включают все цвета HTML.

Использование имени цвета HTML. Это значение задается в виде строки с использованием класса ColorTranslator.

Для использования одного из этих методов потребуется импортировать пространство имен System.Drawing:

В следующем коде демонстрируется несколько способов определения цвета:

Полный список имен цветов можно найти в документации Visual Studio. В качестве альтернативы можно использовать шестнадцатеричное представление цвета (в формате # ), как показано ниже:

Шрифты

Свойство Font в действительности ссылается на полный объект FontInfo, определение которого содержится в пространстве имен System.Web.UI.WebControls. Каждый объект FontInfo имеет несколько свойств, которые определяют имя, размер и стиль шрифта. Хотя свойство WebControl.Font доступно только для чтения, все свойства FontInfo (перечисленные ниже) можно изменять:

Свойства FontInfo

Свойство Описаниеs
Name Строка, обозначающая имя шрифта (например, Verdana)
Names Массив строк с именами шрифтов, которые упорядочиваются согласно имеющимся предпочтениям
Size Размер шрифта в форме объекта FontUnit. Может представлять абсолютный или относительный размер
Bold, Italic, Strikeout, Underline и Overline Булевские свойства, которые либо применяют данный атрибут стиля, либо игнорируют его

В коде можно присваивать значения различным свойствам шрифта:

В файле .aspx следует применять специальный синтаксис прохода по объекту для определения таких свойств объекта, как шрифт. Синтаксис прохода по объекту использует дефис (-) для разделения свойств.

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

Чтобы предоставить список возможных шрифтов, вместо свойства FontInfo.Name необходимо использовать свойство FontInfo.Names. Свойство Names принимает в качестве значения массив имен, которые будут визуализироваться в виде упорядоченного списка (причем наиболее предпочитаемые имена будут отображаться в самом верху этого списка). Например:

Свойства Names и Name поддерживаются в синхронизированном состоянии, и установка значения для одного из них обязательно влияет на другое. Например, когда устанавливается значение для свойства Names, свойству Name автоматически присваивается первый элемент из массива, который был указан для свойства Names. Если же устанавливается значение для свойства Name, свойству Names автоматически присваивается массив, состоящий из единственного элемента. Поэтому использовать нужно только либо Name, либо Names, но ни в коем случае не оба свойства одновременно.

Фокус

В отличие от серверных элементов управления HTML, каждый веб-элемент управления предоставляет метод Focus(). Фокус оказывает влияние только на элементы управления вводом (элементы управления, принимающие нажатия клавиш от пользователя). После визуализации страницы в клиентском браузере пользователь начинает работу с элемента управления, имеющего фокус.

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

После визуализации страницы пользователь может перемещаться между элементами управления с использованием хорошо известной клавиши .

Конечно, если вы знакомы со стандартом HTML, то знаете, что не существует встроенного способа передачи фокуса элементу управления вводом. В этом следует полагаться на JavaScript-код. Здесь-то и кроется секрет реализации ASP.NET. В конце сгенерированного кода страницы ASP.NET добавляет дополнительный блок JavaScript-кода. Этот JavaScript-код просто устанавливает фокус на последний элемент управления с инициированным методом Focus().

Ниже показан код, который ASP.NET добавит к визуализируемой веб-странице для перемещения фокуса на элемент управления по имени TextBox2:

Если вы вообще не вызывали метод Focus(), этот код не генерируется. Если вы вызывали его для нескольких элементов управления, то JavaScript-код выбирает элемент управления, получивший фокус раньше других.

Вместо программного вызова метода Focus() установить элемент управления, который должен всегда иметь фокус, можно в разметке. Это делается с помощью свойства DefaultFocus следующим образом:

Обработчик событий просто добавляет новое сообщение в окно списка и прокручивает его в конец:

Автоматическая обратная отправка не всегда приносит только пользу. Отправка страницы обратно серверу на некоторое время прерывает работу пользователя. Если страница имеет большие размеры, задержка в работе может стать довольно заметной. Если страница является довольно длинной, и пользователь успел прокрутить ее до конца, то при ее обновлении он утратит текущую позицию и будет снова возвращен в начало страницы. Из-за этих особенностей всегда лучше тщательно взвешивать, действительно ли обратная отправка столь необходима, и стараться не применять ее просто в «косметических» целях. В качестве одного из альтернативных вариантов можно использовать вместо нее функциональные возможности AJAX.

Двойное условие в операторе @media

17.03.2020, 12:41

Разница между @media и атрибутом media в CSS
Доброго времени суток! Очень каноничный ламер, буквально 2 дня назад начал читать про разметку.

Не выполняется условие в операторе If.
Здравствуйте уважаемые форумчане. Не срабатывает оператор в коде. Что не так, или это баг VS2010.

Условие в операторе switch
как записать условие х-у>0 с помощью case

17.03.2020, 13:05 2 17.03.2020, 13:18 3 17.03.2020, 15:04 4

Или перед and допишите screen

[CSS]@media screen and (max-width: 414px), screen and (max-width: 417px)<>

Добавлено через 3 минуты
Dzendev, помоему при этом условии второе выражение никогда не будет выполнятся, и разве можно так писать?

@media screen and (max-width:414px) and (max-height:417px) — оба условия должны выполняться

Добавлено через 54 секунды
Имею ввиду второй раз and?

Обмен данными сложной структуры с использованием ASP.NET Web API

Предпосылкой для написания этой статьи стал комментарий к статье «Использование AJAX в ASP.NET MVC», который был оставлен 26 февраля 2020 года одним из гостей сайта.

В комментарии говорилось, что в статье не хватает примера обмена данными сложной структуры.

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

Введение

Для начала давайте выясним, что собой представляю те данные сложной структуры, о которых пойдёт речь в этой статье.

Дело в том, что при помощи HTTP запросов можно передавать не только отдельно взятые параметры (как это делалось в статье по ссылке), но также их массивы и сложные объекты.

В чистом виде ASP.NET MVC и Web Forms не способны эффективно обрабатывать подобные HTTP запросы. Поэтому для решения подобных задач следует воспользоваться платформой ASP.NET Web API .

Эта платформа, разрабатываемая Microsoft, позволяет легко построить web сервис на основе HTTP, который будет осуществлять обмен такими данными и может работать совместно с любым клиентским приложением, которое поддерживает HTTP, включая те же web приложения с использованием AJAX.

Первый проект ASP.NET Web API

Создадим проект ASP.NET Web API с помощью стандартного диалогового окна Visual Studio.

Обратите внимание, что в шаблоне проекта по умолчанию уже подключены как Web API, так и ASP.NET MVC. Это на самом деле не случайно.

Дело в том, что в основе платформы Web API л ежит паттерн MV C. Поэтому реализация даже шаблонного проекта опирается на соответствующую платформу.

Ниже приведён скриншот со структурой стандартного шаблона WebAPI проекта. На первый взгляд, это самый обычный ASP.NET MVC проект, но отличия заключаются не в структуре (хотя она и включает по умолчанию, так называемую, страницу помощи (папка Areas\HelpPage ), которую можно спокойно удалить), а во внутреннем содержании.

Одно из основных отличий состоит в том, что API запросы обрабатываются контроллерами, которые являются наследниками базового класса ApiController. Этот класс позволяет контроллеру обрабатывать не только GET и POST, но и другие типы HTTP запросов. Что позволяет разрабатывать Web API приложения в стиле RESTful.

Предлагаемый Visual Studio, шаблон контроллера по умолчанию уже содержит набор методов для поддержки GET, POST, PUT и DELETE запросов и ниже показан пример такого контроллера.

Как использовать функцию контроля пропускной способности на беспроводном маршрутизаторе TP-Link?

Для чего необходим контроль пропускной способности?

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

Решением данной проблемы может стать функция Badwidth Control (далее-«Контроль пропускной способности»), которая позволит уменьшить негативное влияние, оказываемое перегруженным каналом на локальную сеть. Используя функцию контроля пропускной способности, мы можем указать определенную минимальную или максимальную пропускную способность для каждого компьютера. Пожалуйста, следуйте нижеуказанным шагам, чтобы настроить данную функцию.

Как настроить функцию контроля пропускной способности?

Нижеуказанный сценарий указывает 3 компьютера, которые делят 512 Кбит/c исходящей полосы пропускания и 4 Мбита/c входящей полосы пропускания в качестве примера, а также объясняет, как использовать функцию Контроля пропускной способности для соответствующей оптимизации распределяемой пропускной способности.

Что такое код asp maxbandwidth

Самым актуальный способом создать REST сервис в стеке технологий Майкрософт на сегодняшний день является ASP.NET Web API. До того эта технология значилась как WCF Web API и больше по названию тяготела к WCF. Но уже тогда там использовались сходные походы как в ASP.NET MVC, включая роутинг (routing). До нее существовали такие вещи как WCF 4 REST, WCF REST Starter Kit 3.5. Их все еще можно встретить на старых проектах и stackoverflow пестрит вопросами о них. Но то что ASP.NET Web API используется на новых проектах, а некоторые старые конвертируются, чтобы его использовать – радует. Так как предшественники были хуже как в плане технологии (приходилось писать много boilerplating code), удобства использования так и документации.

В предыдущих постах были рассмотрены некоторые теоретические аспекты REST – теперь создадим простой REST сервис с помощью Web API и рассмотрим ключевые элементы такого сервиса.
Начать стоит с подключения NuGet packages (и/или установки ASP.NET MVC):

  1. Web API, в случае если хостимся в ASP.NET:AspNetWebApi
  2. Self-hosted Web API:AspNetWebApi.Selfhost
  3. HttpClient включая XML и JSON форматеры:System.Net.Http.Formatting
  4. JsonValue для навигации и манипуляции JSON:System.Json

В нашем случае, мы создадим просто сервис, который хостится на ASP.NET MVC, а также посмотрим на принцип создания интеграционных тестов к нему, которые будут поднимать self-hosted REST сервис в тестовом контексте. Акцент на Data access layer делятся не будет, если в процессе вам необходимо прикрутить DAL, например, с использованием Entity Framework Code First, то я писал об одном из возможных подходов раньше.

Перед тем как создавать такой сервис необходимо также понимать что использовать Web API стоит если есть тесная связка с веб-клиентом, если сервис содержит логику выходящую за рамки CRUD операций. Если же у вас сервис по сути своей поставщик данных, т.е. операции в основном CRUD, то лучше использовать WCF Data Services, так как там много вещей из коробки генерится под базу — и CRUD операции и нормальная поддержка OData и IQuerable (в ASP.NET Web API она ограничена), которые позволяют делать запросы к сервису и данным с помощью Uri и специального OData синтаксиса.

Итак преступим. Для начала создадим новый проект ASP.NET MVC4:

Изображение 1
Естественно темплейт (шаблон) для MVC 4 нагенерит нам типичную структуру ASP.NET MVC проекта (файл ValuesController я уже успел переименовать на DocumentsController). Отличие в дополнительном контроллере для Web API. По умолчанию это ValuesController, естественно его необходимо переименовать.

В нашем случае он стал DocumentsController. Из темплейта этот контроллер содержит операции заглушки для Get, Post, Put, Delete. В просто случае переопределим эти операции для DocumentsController и ресурса Document. Получится вот такой вот контроллер:

Это простой вариант, и здесь не используются фильтры для обработки сообщений или dependency resolvers. В свою очередь IDocumentRepository реализовано как простая заглушка и если дальше развивать тему с нормальным доступом к данным то реализацию можно подставить любую.
Теперь проверим операции. Это сделать можно используя Fiddler и правильно сформировав запрос. Например операция получения всех документов, используем адрес http://127.0.0.1:81/api/documents/. Используется стандартный роутинг из коробки:

Итак, запрос на http://127.0.0.1:81/api/documents/ должен вызвать метод IEnumerable Get() :

Так и есть, нам вернулся список в виде XML из двух элементов. Теперь попробуем content negotiation из коробки в действии. К тому же самому вызову добавим HTTP заголовок – Accept:application/json. Итак запрос:

Ответ ожидаем в Json:

Из коробки идут два стандартных форматера – XML и Json, но есть возможность добавлять свои.

Аналогичным образом будут работать остальные операции. Единственное попробуем еще запросить документ с недействительным идентификатором. Будем вызывать метод Document Get(string id) по адресу http://127.0.0.1:81/api/documents/9505a3b549b54881b3ed83fc19510534, где 9505a3b549b54881b3ed83fc19510534 – недействительный идентификатор, изменили последнюю цифру.

Ожидается ответ 404 NotFound. Результат запроса:

Вот таким вот образом можно создать и протестировать на работоспособность простенький REST сервис на базе ASP.NET Web API.

Основные концепты — ApiController

Так как мы имеем дело с REST сервисом. То из всего этого добра нас интересуют на начальном этапе контроллеры и роутинг. Контроллеры для Web API REST сервиса наследуются от от класса ApiController, который в свою очередь от интерфейса IHttpController. И ApiController несет с собой много добра, кроме конечно того что она автоматом распознается и выполняется. Из всего этого добра самое интересное являются свойства Request и Configuration.

Основные концепты – Routing (Роутинг)

При вызове операций с контроллера важный момент играет routing. Именно routing позволяет подсистеме WebApi связать Uri адрес и конкретную операцию из контроллера. Причем есть несколько вариантов — либо операция-action помечается атрибутом, либо используется договоренность именовать операции с префиксом – Http Verb. Например, в методе PostDocument – именно префикс Post позволяет сказать Web Api что эта операция связанна с Uri и вызывается по соответствующему адресу с HTTP Verb – POST.
Еще одним вариантом для того, чтобы помочь выделить среди методов контроллера операции, которые связанны с URL – использование атрибутов — HttpGet, HttpPut, HttpPost, или HttpDelete, каждый из них соответствует такому же HTTP Verb – GET, PUT, POST, DELETE. Для того, чтобы навесить на операцию больше чем один HTTP Verb, или операцию отличную от 4 базовых (GET, PUT, POST, DELETE), используется атрибут – AcceptVerbs. Использование атрибутов также дает возможность отказаться от конвенции именования методов, когда префиксом выступает HTTP Verb.

А для того чтобы избежать мапинга (mapping) метода как action используется атрибут NonAction без параметров.
Есть еще способ роутинга, когда каждый мапинг делается по средством атрибутов на метод, а не глобальным роутингом через Global.asax.cs, но о нем позже, так как он не стандартный. Хотя на этапе WCF Web API использовался именно он.

Routing по-умолчанию в Web API устанавливается как в методе RegisterRoutes на изображении 5 ниже. При использовании такого routing необходимо придерживаться конвенции именования методов в контроллере, когда каждый метод начинается с HTTP Verb префикса.

Ну и естественно важная часть маппинга – routing в Global.asax.cs:

Соответственно под роутинг «api//» подпадают URLs и примерные имена методов:
Можно также сделать роутинг по имени action. Он не создается по-умолчанию темплейтом проекта. Например:
В случае с таким роутингом необходимо использовать атрибуты HttpGet, HttpPut, HttpPost, HttpDelete или AcceptVerbs чтобы указать на какие методы мапить . В WCF WebAPI использовался роутинг с помощью атрибутов, его тоже можно прикрутить, но об этом отдельно.

Основные концепты — HttpResponseMessage, HttpRequestMessage

По сути это два спец класса которые используются достаточно часто. Они нужны для того чтобы иметь возможность оперировать запросом и ответом. HttpRequestMessage можно получить через свойство Request от ApiController (Изображение 6). Tак как Web API контроллеры всегда наследуются от ApiController, то его можно получить в середине любого из наших контроллеров. HttpRequestMessage позволяет нам управлять запросом, например извлекать из него данные из HTTP Body либо HTTP Headers которые нам нужны.

HttpResponseMessage можно создать, чтобы вернуть результат, либо просто Response код (Изображение 7), либо еще и с нагрузкой, запаковав в его свойство Content, нужный нам HttpContent, например для бинарных данных подойдет наследник от HttpContent – StreamContent. Из свойства Request можно вычитать бинарные данные документа, который пришел с клиента:

Возврат ошибок — HttpResponseException

Вернуть ответ с ошибкой можно как с помощью HttpResponseMessage, указав код ошибки, так и с помощью специального класса HttpResponseException. Например, на изображении 7 на клиент возвращается ошибка InternalServerError = 500 с коротким описанием. Описание умеют читать далеко не все клиенты или клиентские библиотеки (были проблемы с iPad), в таком случае в тело сообщения с ошибкой можно писать объект более детально описывающий проблему, например свой кастомный объект с сообщением и кодом ошибки.

Хостинг

Само собой разумеется, что Web API REST сервис может хоститься на IIS либо вместе с ASP.NET MVC клиентом либо раздельно. Также его можно легко захостить вместе с ASP.NET MVC Web Role в облаке на Windows Azure. Но интересно, что Web API также можно хостить у себя в приложении, в памяти. Это значительно расширяет круг сценариев, в которых Web API может использоваться. Например с self-hosted Web API можно легко делать интеграционные тесты, которые поднимут во время тестирования self-hosted Web API сервис.

Например, на изображение 8 ниже, показано как поднимается с self-hosted Web API сервис для интеграционного теста в методе BecauseOf.

Клиент

Клиентов к Web API REST может быть большое множество – есть куча библиотек под разные платформы для REST, можно обращаться к REST сервису c веб страницы по средством JavaScript и jQuery, можно использовать “старенький” класс WebClient для десктоп клиента. Вместе с Web API новым для .NET является также новый HttpClient, который очень легко использовать с десктоп клиента или тестового сценария (пример на изображении 8 метод should_make_tivial_get), и к тому же он изначально спроектирован асинхронным.

Что такое код asp maxbandwidth

ASP – веб-технология, которую в декабре 1996 года представила компания Microsoft для возможности создания интерактивных веб-приложений. ASP – это аббревиатура от Active Server Pages, что переводится, в соответствии с логикой технологии, как «активные серверные страницы». Важно понимать, что ASP не является языком программирования, она только позволяет встраивать в обычный HTML-код сценарии на каком-либо скриптовом языке(Visual Basic Script или Java Script). Таким образом, за счет использования ASP на веб-страницы могут встраиваться элементы с заранее настроенным программным управлением.

Изначально в любом текстовом редакторе создается исходный код программы. По умолчанию используется Visual Basic – если ничего дополнительно не указывать, система будет считать, что программа написана именно на этом языке. Затем файл, которому задается расширение .asp, выкладывается в каталог, имеющий права на выполнение, чтобы сервер мог исполнить этот файл, когда браузер пользователя запросит его. Для пользователя этот файл не виден, поскольку сначала загруженный файл с программой интерпретирует сервер таким образом, что программный код будет отображаться непосредственно в HTML-коде страницы, в скобках вида скобки .

ASP просуществовала в чистом виде до 2002 года. 1 января этого года увидел свет релиз ASP.NET, технологии, в которой были учтены ошибки и недочеты ASP. Устранить их получилось благодаря тому, что новая технология была основана на более функциональной платформе Microsoft .NET.

Синонимы: нет
Все термины на букву «A»
Все термины в глоссарии

ASP.Net. Лекция 3. Серверные элементы управления (исходники, документация)

Одной из самых важных веб-задач разработчика является получение и обработка данных, введенных пользователем. Информация посылается серверу через форму . Форма содержит элементы управления, которые позволяют вводить информацию различными способами.

Формы применяются в большинстве сайтов. Например, если вы пишете письмо в веб-интерфейсе, появляется форма с текстовыми полями, соответствующими адресату, теме, и тексту письма. Нажатием на кнопку можно добавить прилагаемый файл и окончательно послать письмо кнопкой Send.

Форма HTML содержит теги, такие как текстовое поле, выпадающий список, переключатели (radiobuttons) и флажки (checkbox), кнопки.

Форма ASP.NET отличаются от обычных форм наличием свойства runat=»server». Они обрабатываются ASP.NET на сервере. Формы являются одним из полей страницы. На странице находятся элементы управления . Многие из них должны быть расположены внутри формы. ASP.NET позволяет запоминать состояние элементов управления, то есть текст, который был введен в текстовое поле, или выбранный переключатель, передавать его на сервер и обратно на страницу после ее обновления.

Все формы обрабатываются методом POST. Атрибут Action можно задавать, но не обязательно. По умолчанию это текущая страница.

У элементов управления ASP.NET. тоже имеется свойство runat=»server». Второй обязательный атрибут — это его идентификатор, или id. Он нужен, чтобы обращаться к элементу в программе, то есть это имя члена страницы, по которому мы можем его идентифицировать. Примеры мы уже видели в предыдущих лекциях.

Перечислим группы элементов управления.

Элементы управления HTML

Элементы управления HTML являются наследниками класса System.Web.UI.HtmlControls.HtmlControl. Они непосредственно отображаются в виде элементов разметки HTML. Их отображение не зависит от типа браузера. Свойства таких элементов полностью соответствуют атрибутам тегов HTML.

Сравните обычный тег

с элементом управления HTML

Разница заключается только в наличии атрибута =»server». Но он дает колоссальную разницу. Теги сервер отображает как есть, а элементом управления можно манипулировать в коде. Так можно написать в функции-методе страницы только во втором случае.

что равносильно this.Reset1.Value = «АСП»;

Следовательно, Reset1 становится одним из членов класса страницы.

Их можно использовать, если необходимо получить определенные теги HTML, или если нужно конвертировать старые страницы asp. Элементы управления HTML можно размещать на одной странице вперемешку с серверными элементами.

Стандартные или серверные элементы управления

Серверные элементы мощнее, потому что они привязаны не к разметке, а к функциональности, которую нужно обеспечить. Многие элементы не имеют аналогов в HTML, например, календарь. Их отрисовка полностью контролируется ASP.NET. Перехватывая события PreRender, Init, Load, можно вмешаться в этот процесс. Объявления серверного элемента управления начинаются с блока и заканчиваются

Возможно также закрыть объявление тегом />, если внутри блока нет текста.

Свойства этих элементов строго типизированы в отличие от HTML-элементов.

В этой таблице приведены элементы управления, которые имеют пару среди тегов HTML. Вообще их гораздо больше. Некоторые элементы генерируют не только HTML-код, но и JavaScript. В ASP .NET 2.0 было добавлено множество новых сложных элементов управления, например, MultiView, TreeView, Wizard, GridView. Возможностей одного GridView хватит, чтобы написать целую статью.

Таблица соответствия некоторых серверных элементов управления web тегам HTML
Элемент управления ASP..NET Соответствующий тег HTML Назначение
Отобразить текст
, между которыми находятся один или несколько тегов .

DropDownList выдаст тот же самый код, если будет определен так:

Итак, если мы хотим перейти с написания страниц HTML к написанию кода asp:

Отличие серверных элементов управления в том, что их можно программировать на сервере, и получать информацию от них тоже на сервере.

Попробуем написать такую страницу:

Запустите ее на выполнение, выберите Компакт-диски и нажмите на кнопку. На форме появится надпись «Вы выбрали Компакт-диски».

Вот код этой страницы в браузере:

Итак, браузеру посылается простая страница, на которой нет скриптов. То же поведение можно было бы запрограммировать с помощью JavaScript. Разница в том, что пользователь смог бы увидеть бы увидеть код на JavaScript, скопировать и использовать его на своих страницах. В этом нет ничего плохого, но иногда люди хотят сохранить свой код в тайне в целях защиты интеллектуальной собственности.

Посмотрим, как ASP .NET интерпретировал заголовок формы:

Событие SelectedIndexChanged имеется и тут, как и у всех классов-наследников от абстрактного класса ListControl.

Panel

Часто бывает нужно вставить элемент управления в точно определенное место страницы. Например, объединим два предыдущих примера.

Эта страница работает не так, как нам хотелось. Текст оказался после выпадающего списка, хотя логичней было бы, чтобы текст шел в начале. В Javascript для этого используют элемент разметки

Чтобы заставить метку отображаться перед списком, необходимо поместить перед DropDownList обьект Panel.

после чего вызывать метод Controls.Add(. ) от этого оьекта.

Свойство HorizontalAlign элемента Panel полезно, если нужно установить выравнивание содержащихся в нем элементов управления. Поменяем код в предыдущем примере:

Текст теперь размещается в центре метки.

Булевское свойство Wrap элемента Panel заставляет переносить текст на новую строку, есть установлено, или расширять раздел, если текст не помещается в одну строку, если не установлено.

Если в программе установить свойство Visible панели в False, можно сделать невидимыми все элементы, которые в нем находятся. Стили, установленные в панели, наследуются всеми вложенными элементами.

Новая возможность в ASP.NET 2.0 — задавать для Panel полосы прокрутки, как бы имитируя встроенное в страницу окно. Это делается с помощью свойства ScrollBars. Он может принимать следующие значения: None, Both, Vertical, Horizontal, Auto. Если вы установите его в Auto, полосы прокрутки появятся, если содержимое панели не умещается в его видимые размеры.

Реализуется такая возможность с помощью атрибута css overflow.

Ставить свойство ScrollBars в Vertical или Horizontal я вам не рекомендую. этом случае генерируется стиль overflow-x, а это не работает в браузере Opera 9.0. Стиль overflow не поддерживается Opera 6.

Вертикальную полосу прокрутки можно установить и слева. Для этого поменяйте свойство Direction в RightToLeft.

Для Panel можно задать фоновую картинку с помощью свойства BackImageUrl.

Заключение

Серверные элементы управления предоставляют в распоряжение программиста свойства, методы и события. При их помощи мы можем абстрагироваться от деталей HTML кода и работать со страницей и ее элементами как с объектами. Мы рассмотрели часть серверных элементов управления. С новыми интересными элементами управления познакомимся в следующей лекции.

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

CSS3 продолжает одновременно восхищать и разочаровывать веб дизайнеров и разработчиков. Восхищают возможности, которые предоставляет CSS3, но разочаровывает практически полное отсутствие поддержки в Internet Explorer 8. В данной статье демонстрируется техника использования CSS3, которая не поддерживается в Internet Explorer 8. Однако, для тех, кому приходится обеспечивать поддержку мобильных устройств (например, iPhone или тех, которые используют Android) такой недостаток будет безразличен.

В данной статье объясняется, как с помощью нескольких правил CSS3 можно создать рабочую версию сайта для iPhone. Будет представлен очень простой пример, а также демонстрация того, как добавить стиль маленького экрана мобильного устройства к уже существующему сайту.

Медиа запросы

Если вам когда-нибудь приходилось создавать стиль для печати страниц веб сайта, то вы уже знакомы с идеей создания специальных таблиц стилей, которые работают в определенных условиях (в данном случае таблица стилей используется при печати страницы). Такой функционал был добавлена в CSS2 с помощью типов носителей . Типы носителей позволяют задавать целевой тип носителя информации, то есть можно определить стили для целей print (печать), handheld(мобильное устройство) и так далее. К сожалению, типы носителей никогда не получали широкой поддержки в устройствах, поэтому они, за исключением типа носителя print, очень редко используются.

Медиа запросы в CSS3 подхватывают данную идею и развивают ее. Но в дополнение к определению типа устройства они позволяют получить сведения о его возможностях. Например:

  • ширина и высота окна просмотра
  • ориентация – например, мобильное устройство выводит информацию в альбомном или портретном режиме?
  • разрешение

Если у пользователя браузер, который поддерживает медиа запросы, то мы можем написать CSS специально для определенной ситуации. Например, определить, что пользователь использует маленькое устройство (например, смартфон) и выдать ему специфический шаблон страницы.Примером применения такой техники может служить сайт конференции dConstruct.

Веб сайт dConstruct 2010 в браузере Safari на экране компьютера.

Веб сайт dConstruct 2010 на экране iPhone

На выше приведенном примере видно, что сайт не просто уменьшается в размерах, а изменяется архитектура его контента, чтобы облегчить восприятие информации на маленьком экране мобильного устройства. Некоторые могут подумать, что просто используется шаблон iPhone, но это не так.. Такой же вид будет и в Opera Mini в телефоне с ОС Android. С помощью медиа запросов и определения возможностей устройства веб сайт dConstruct может обслуживать любой вид устройств, даже таких, о которых разработчики понятия не имели!

Использование медиа запросов для создания таблицы стилей для телефонов

Чтобы начать давайте рассмотрим очень простой пример. Шаблон, представленный ниже — очень простой и имеет всего две колонки.

Простой шаблон с двумя колонками.

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

Первый способ использования медиа запросов — создание альтернативной секции CSS прямо в той же таблице стилей. Так, чтобы определить целью маленькие устройства, можно использовать следующий синтаксис:

Затем можно добавить альтернативные правила CSS для маленького экрана в секцию, ограниченную фигурными скобками. Таким образом мы просто переопределяем любые правила, установленные для обычных браузеров ранее в нашей CSS таблице. Так как данная секция располагается последней в файле CSS, то она изменяет предыдущие правила. Таким образом, для линеаризации шаблона и уменьшения секции заголовка нужно добавить следующие строки:

В приведенном коде используется альтернативное фоновое изображение и уменьшается высота и ширина заголовка, затем устанавливаются опции для контента и навигации float: none; и изменяется установка ширины, которая определялась ранее в таблице стилей. Данные правила действуют только для устройств с маленьким размером экрана.

Вид примера на экране iPhone.

Присоединение отдельной таблицы стилей с использованием медиа запросов

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

Присоединение таблицы стилей для мобильных устройств:

Testing media queries

Если вы являетесь владельцем iPhone, телефона с ОС Android или другого устройства, которое имеет браузер, поддерживающий медиа запросы, то можно проверить работу измененного CSS на них. Хотя потребуется загрузить код сайта, чтобы посмотреть на него. А как быть в том случае, если такого устройства нет или нужно провести проверку локально?

В процессе разработки вам может помочь отличный сайт ProtoFluid. Он предоставляет форму для ввода URL и просмотра дизайна, как он будет отображаться на экране iPhone, iPad или другого подобного устройства. Изображение ниже показывает вид сайта dConstruct, который представлен сервисом ProtoFluid для iPhone.

Сайт dConstruct, представленный сервисом ProtoFluid для вида на iPhone.

Можно также ввести размер окна, если нужно проверить отображение сайта на определенном устройстве с известным размером экрана.

Для использования ProtoFluid вам нужно немного изменить медиа запрос, который мы использовали ранее, чтобы добавить опцию max-width. Это будет означать, что медиа запрос будет действовать в том случае, если пользователь использует обычный браузер, но в очень маленьком окне.

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

Теперь все готово, чтобы использовать ProtoFluid. Основное преимущество ProtoFluid заключается в том, что можно использовать инструменты разработчика , такие как FireBug, для настройки дизайна, что весьма затруднительно на iPhone. Конечно, вы можете пробовать ваш сайт на различных устройствах, но ProtoFluid делает процесс разработки и тестирования значительно проще.

Если вам не нужно, чтобы шаблон сайта изменялся, когда кто-нибудь уменьшает размер окна браузера, вам нужно просто удалить часть max-width запроса перед тем, как открыть доступ к сайту. Таким образом только те, кто смотрит сайт с маленького устройства, будут видеть измененный шаблон страниц.

Настройка существующего сайта

Выше используемый пример очень простой. Он предназначен для демонстрации техники. Однако ее можно легко использовать для существующего сайта, чтобы сделать версию для маленьких экранов. Одним из преимуществ использования CSS для шаблона является возможность обеспечивать альтернативный вариант для готового дизайна. Для демонстрации будет использоваться реальный веб сайт для которого будет использована описываемая техника.

Шаблон страниц

Рассматриваемый сайт использует шаблон фиксированной ширины с тремя колонками. Дизайн был разработан пару лет назад и медиа запросы тогда не принимались во внимание во время разработки.

Добавление нового файла стилей

Чтобы сделать линеаризацию сайта нужно провести много изменений, таким образом, нужно добавить новый файл с таблицей стилей после основного и с условием использования только при значении max-width меньше 480 px.

Для создания нового файла с таблицей стилей берем основной файл сайта и сохраняем его как small-device.css. Таким образом, он начинает жить как копия основного фала с таблицей стилей. Далее в нем надо переписать несколько правил и удалить все ненужное.

Сжатие заголовка

Сначала подгоняем размер логотипа так, чтобы он смотрелся хорошо на маленьких экранах. Просто загружаем другое изображение. Также нужно уменьшить фон для области, в которой выводится логотип.

Линеаризуем шаблон

Далее нужно линеаризовать шаблон и сделать одну колонку. Шаблон создан с использованием плавающих блоков, поэтому надо найти все правила, которые делают колонки плавающими и установить для них свойства float: none и width:auto. Таким образом все колонки выстроятся одна под другой.

«Причесываем»

Теперь посмотрим на шаблон в ProtoFluid и точно настроим размеры полей и отступов для различных областей, которые будут отличаться от того, что установлено для обычного шаблона. С использованием Firebug для ProtoFluid такая работа выполняется быстро и легко, а получившийся набор правил CSS затем копируется в таблицу стилей.

Проверяем сайт в ProtoFluid.

Проверка сайта на iPhone

При проверке на iPhone выяснилось, что сайт не масштабируется в одну чудесную колонку. На сайте разработчиков Safari есть решение для такой проблемы — нужно добавить тег meta к заголовку сайта. в котором устанавливается ширина окна просмотра равной ширине дисплея устройства.

После добавления тега meta сайт стал выводиться как было задумано — в одну колонку:

Вид сайта на экране iPhone.

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

Заключение

Использованием медиа запросов может ввести CSS3 в вашу повседневную деятельность. Стоить помнить о том, что браузеры, которые поддерживают медиа запросы, также поддерживают все остальные свойства CSS3. Таким образом можно использовать все возможности CSS3, когда пользователь использует iPhone или другое мобильное устройство.

Медиа запросы (@media CSS)

Медиа запросы ( @media ) позволяют сделать из одного сайта несколько версий дизайна в зависимости от характеристик устройства, на котором осуществляет просмотр. К примеру, на мобильных устройствах экраны небольшие, а значит для них лучше использовать резиновую или блочную верстку, чтобы повысить читабельность.

Примечание
Медиа запросы не делают несколько версий сайта для конкректных устройств, а позволяют сделать несколько вариантов дизайна за счет применения разных стилей. Сделать разные стили гораздо проще и дешевле, чем делать разные сайты.

Синтаксис CSS @Media

Где тип устройства может принимать следующие значения:

  • all — для всех типов устройств (по умолчанию используется это значение)
  • braille — для устройств Брайля (для чтения слепыми людьми)
  • embossed — для принтеров Брайля
  • handheld — для смартфонов или портативных устройств
  • print — для принтеров
  • projection — для проекторов
  • screen — для экранов компьютеров, планшетов, смартфонов и т.д.
  • speech — для речевых браузеров
  • tty — для устройств с фиксированным шагом символов, такие как телетайпы и терминалы
  • tv — для телеэкранов

Примечание
Практические все устройства идентифицируют себя как тип screen (смартфоны и планшеты, ноутбуки и настольные компьютеры).

Примечание
Запятая воспринимается как оператор or.

Рассмотрим какие есть медиа особенности.

Медиа особенности

  • aspect-ratio (min-aspect-ratio, max-aspect-ratio) — определяет отношение ширины и высоты области просмотра
  • color (min-color, max-color) — определяет количество бит на цвет для устройства
  • color-index (min-color-index, max-color-index) — определяет количество цветов, которое устройство может отображать
  • device-aspect-ratio (min-device-aspect-ratio, max-device-aspect-ratio) — определяет соотношение сторон экрана устройства через. Записывается через слэш
  • device-height (min-device-height, max-device-height) — определяет всю доступную высоту экрана устройства
  • device-width (min-device-width, max-device-width) — определяет всю доступную ширину экрана устройства
  • grid — отвечает за вывод у устройства. Бывает два вида: сеточный и точечный. Терминалы, дисплей телефона поддерживают только один шрифт, что равносильно значению 1.
  • height (min-height, max-height) — высота области просмотра
  • width (min-width, max-width) — ширина области просмотра
  • orientation ([landscape] | [portrait]) — определяет в каком положение находится экран (альбомном или портретном)
  • resolution (min-resolution, max-resolution) — определяет разрешение устройства вывода

Из всех выше описанных медиа особенностей лишь два используются наиболее часто min-width и max-width .

Примеры с медиа запросами

Пример №1. Ограничение на максимальную ширину

Например, данный код будет работать для устройств с шириной экрана меньше 800px. Атрибут screen and можно не писать.

Пример №2. Задание диапазона на ширину

Этот код только будет работать только в случае, если ширина экрана находится в диапазоне от 640 до 1024 пикселей.

Пример №3. Исключение диапазона

Этот код только будет работать только в случае, если ширина экрана меньше 640 пикслей или наоборот больше 1024 пикселей.

Пример №4. Исключение устройства

Стиль будет работать для всех устройств кроме смартфонов handheld .

Чтобы не создавать путаницу в стилях и облегчить загрузку сайта, файлы со стилем для медиа запросов можно подгружать только в том случае, если это необходимо. Делается это через тег link:

Илон Маск рекомендует:  Что такое код cast()
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL