Создаем статистику для сайта своими руками на ASP.NET


Оглавление (нажмите, чтобы открыть):

Простое приложение ASP.NET Web Forms 4.5

ASP.NET — ASP.NET Web Forms 4.5 — Простое приложение ASP.NET Web Forms 4.5

В этой статье мы создадим очень простое приложение с использованием некоторых средств ASP.NET Web Forms 4.5. В дальнейшем мы будем использовать это приложение в целях тестирования. Если вы уже знакомы с ASP.NET, то рекомендую вам сразу перейти к следующей статье «Описание модульного тестирования».

Создание нового проекта ASP.NET

Запустите Visual Studio 2012 и выберите пункт New Project (Создать проект) в меню File (Файл). Откроется диалоговое окно New Project (Новый проект), которое позволяет создавать новые проекты Visual Studio.

В левой панели этого диалогового окна вы увидите список доступных типов проектов. Перейдите к элементу Installed — Templates — Visual C# — Web (Установленные — Шаблоны — Visual C# — Веб) и в центральной панели отобразится набор проектов ASP.NET, как показано на рисунке ниже:

Удостоверьтесь, что выбрали Visual C#, а не Visual Basic. Попытка выполнить приведенные примеры на C# в проекте Visual Basic приведет к весьма странному поведению и множеству ошибок.

Выберите в центральной панели элемент ASP.NET Empty Web Application (Пустое веб-приложение ASP.NET) — имена некоторых проектов, несмотря на их отличия, выглядят похожими, поэтому внимательно выбирайте нужный тип проекта. Удостоверьтесь, что в раскрывающемся списке в верхней части экрана выбран вариант .Net Framework 4.5 и введите в поле Name (Имя) строку TestAspNet45 в качестве имени проекта. Щелкните на кнопке OK для создания нового проекта.

Среда Visual Studio устанавливает в поле Solution name (Имя решения) строку TestAspNet45 для соответствия имени проекта. Решение Visual Studio — это контейнер для одного или большего числа проектов.

Шаблон ASP.NET Empty Web Application — простейший из всех шаблонов проектов. Он создает проект, содержащий лишь файл Web.config, в котором находится конфигурационная информация для приложения ASP.NET. Среда Visual Studio отображает файлы в окне Solution Explorer (Проводник решения), показанном на рисунке ниже. Окно Solution Explorer является основным инструментом для навигации внутри проекта.

Добавление новой веб-формы

Как вы уже видели при создании проекта Visual Studio, существуют разнообразные типы приложений ASP.NET. Для выбранного типа приложения, контент генерируется из веб-формы (Web Form).

Чтобы добавить в проект новую веб-форму, щелкните правой кнопкой мыши на записи проекта TestAspNet45 в окне Solution Explorer и выберите в контекстном меню пункт Add — Web Form (Добавить — Веб-форма). В появившемся диалоговом окне введите Default в качестве имени нового элемента проекта:

Щелкните на кнопке OK для закрытия диалогового окна и создания нового элемента. Вы заметите в окне Solution Explorer, что среда Visual Studio добавила в проект файл Default.aspx и открыла его для редактирования. Первоначальное содержимое этого файла приведено в коде ниже:

Файл веб-формы в сущности представляет собой расширенный HTML-файл. Наличие элемента, имеющего дескрипторы , говорит о том, что это не обычный файл HTML. То же самое касается атрибутов runat в элементах head и form.

Как показано ниже, в файл Default.aspx было добавлено несколько стандартных HTML-элементов:

В файл Default.aspx были добавлены элементы h1 и p, содержащие простой текст. Они не содержат ничего, связанного с ASP.NET — это стандартные HTML-элементы.

Тестирование примера приложения

Панель инструментов Visual Studio содержит раскрывающийся список с названиями браузеров, которые установлены на рабочей станции (чтобы увидеть этот список, щелкните на небольшой стрелке вниз, расположенной справа от названия браузера).

Пример списка показан на рисунке ниже, где можно видеть несколько браузеров, установленных в системе. Как минимум, в списке будут присутствовать элементы Internet Explorer и Page Inspector (инструмент, который помогает отлаживать HTML-код).

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

Удостоверьтесь, что в списке выбран нужный браузер и затем щелкните на соответствующей кнопке в панели инструментов или выберите пункт Start Debugging (Начать отладку) в меню Debug (Отладка) среды Visual Studio. Проект будет скомпилирован и откроется новое окно браузера, отображающее веб-форму, как показано на рисунке ниже. На данный момент контент веб-формы довольно скуден, но мы, по крайней мере, знаем, что все работает должным образом.

Для этого примера Google Chrome использует следующий URL:

Запустив приложение, вы увидите похожий, но не идентичный URL. Будет присутствовать часть http://, указывающая на применение протокола HTTP, и часть localhost, которая представляет собой специальное имя, ссылающееся на рабочую станцию. Часть URL, касающаяся порта, 40035 в данном случае, назначается произвольно, поэтому вы, скорее всего, увидите другой номер порта. Последняя часть URL, Default.aspx, указывает на необходимость использования содержимого из файла Default.aspx, которое и можно видеть в окне браузера.

Так к чему же относится этот URL? В состав Visual Studio 2012 входит инструмент IIS Express, который представляет собой усеченную версию сервера приложений Microsoft, предназначенную для запуска разрабатываемых приложений ASP.NET. Сервер IIS Express устанавливается автоматически; когда он запущен, в области уведомлений отображается значок. Щелкнув правой кнопкой мыши на этом значке, можно просмотреть список приложений ASP.NET, которые были запущены, и открыть окно браузера для их отображения:

Когда приложение запускается из Visual Studio, сервер IIS Express стартует и начинает прослушивать входящие запросы (на порте 40035 или любом другом). Как только сервер IIS Express запустился, Visual Studio создает новое окно Internet Explorer и применяет его для перехода на URL, который приводит к загрузке файла Default.aspx из IIS Express.

Чтобы просмотреть HTML-код, который сервер IIS Express и платформа ASP.NET Framework (интегрированная в IIS) отправляют браузеру, необходимо щелкнуть правой кнопкой мыши в окне браузера и выбрать в контекстном меню пункт View Source (Просмотр HTML-кода). Этот HTML-код показан ниже, легко заметить, что он отличается от содержимого файла Default.aspx:

Отправленный браузеру HTML-код является результатом обработки файла Default.aspx платформой ASP.NET Framework. Удалены дескрипторы и добавлен скрытый элемент input, но поскольку данный файл Default.aspx не делает ничего особо интересного, его содержимое передается браузеру в основном без изменений.

Итак, вы создали очень простое веб-приложение ASP.NET. Сейчас следует запомнить следующие ключевые моменты:

Пользователь запрашивает URL, которые указывают на файлы веб-форм, добавленные к проекту.

Запросы получает сервер IIS Express, который находит запрашиваемые файлы.

Сервер IIS Express обрабатывает файл веб-формы с целью генерации страницы стандартного HTML-кода.

Код HTML возвращается браузеру, который отображает его для пользователя.

Это сущность любого приложения ASP.NET. Наша цель — воспользоваться тем способом, которым ASP.NET Framework обрабатывает файлы веб-форм, для создания более сложного HTML-кода и последовательностей взаимодействий с пользователем. В последующих разделах мы будем опираться на данный фундамент.

Создание простого приложения

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

Предварительная настройка

Предположим, что ваша подруга решила организовать новогоднюю вечеринку. Она попросила вас создать веб-сайт, который дал бы возможность приглашенным отправлять ответы на приглашение (repondez s’il vous plait — RSVP) по электронной почте. Она высказала пожелание о наличии следующих основных средств:

страница, которая отображает информацию о вечеринке и форму RSVP;

проверка достоверности для формы RSVP, которая будет отображать страницу подтверждения;

страница, на которой выводится список ответов от приглашенных.

В следующих нескольких разделах мы достроим проект ASP.NET по имени TestAspNet45, созданный в начале статьи, добавив указанные средства.

Создание модели данных и хранилища

Почти все веб-приложения полагаются на какую-нибудь разновидность модели данных, независимо от технологии, используемой для их создания. Поскольку мы строим простое приложение, нам нужна лишь простая модель данных. Щелкните правой кнопкой мыши на элементе TestAspNet45 в окне Solution Explorer и выберите в контекстном меню пункт Add Class (Добавить — Класс).

Если пункт меню Class отсутствует или не доступен, это может означать, что вы оставили отладчик Visual Studio в функционирующем состоянии. Среда Visual Studio ограничивает изменения, которые можно вносить в проект, пока выполняется приложение. Выберите пункт Stop Debugging (Остановить отладку) в меню Debug (Отладка) и попробуйте заново.

Откроется диалоговое окно Add New Item (Добавление нового элемента), содержащее шаблоны для всех элементов, которые можно добавлять к проекту ASP.NET. Шаблон Class (Класс) будет уже выбран, так что укажите в качестве имени GuestResponse.cs и щелкните на кнопке Add (Добавить). Среда Visual Studio создаст новый файл класса C# и откроет его для редактирования. Приведите содержимое этого файла в соответствие с кодом:

В классе Guest Response применяется средство языка C# под названием автоматически реализуемые свойства, с которым вы можете быть не знакомы, если имели дело с более старыми версиями .NET Framework.

Обратите внимание, что свойство WillAttend определено с типом bool, допускающим null. Это означает, что свойство может принимать значения true, false или null. Причины выбора этого типа данных объясняются в разделе «Выполнение проверки достоверности» далее в статье.

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

Чтобы определить хранилище, добавьте в проект новый файл класса по имени ResponseRepository.cs и поместите в него код, показанный ниже:

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

Создание и стилизация формы

Следующий шаг заключается в создании страницы, которая содержит информацию о вечеринке и HTML-форму, позволяющую гостям подготовить ответ. Мы будем использовать файл Default.aspx, который был создан ранее. Внесенные в него изменения представлены в коде ниже:

Здесь было изменено значение атрибута id элемента form и добавлены стандартные HTML-элементы, предназначенные для отображения информации о вечеринке, а также для сбора деталей формы RSVP от пользователей. Запустив приложение (либо выбором пункта меню Start Debugging из меню Debug, либо щелчком на кнопке браузера в панели инструментов), можно посмотреть, как выглядят указанные изменения.

Элементы веб-формы стилизуются точно так же, как элементы обычной HTML-страницы — с применением каскадных таблиц стилей (Cascading Style Sheets — CSS). Для добавления к приложению нескольких базовых стилей щелкните правой кнопкой мыши на элементе TestAspNet45 в окне Solution Explorer и выберите в контекстном меню пункт Add StyleSheet (Добавить Таблица стилей). В появившемся диалоговом окне в качестве имени укажите Styles и щелкните на кнопке OK. Среда Visual Studio добавит к проекту новый файл Styles.css. Приведите содержимое этого файла в соответствие с примером ниже. Несмотря на простоту этих стилей CSS, они существенно улучшат внешний вид полей формы.

Таблица стилей CSS ассоциируется с веб-формой с помощью элемента link. В коде ниже показано, как добавить такой элемент в раздел head файла Default.aspx:

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

Обработка данных формы

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

В начале файла Default.aspx находится следующий элемент:

Это называется страничной директивой (или директивой Page). Определенные в ней атрибуты предоставляют ASP.NET детали о файле веб-формы. Нас интересует атрибут CodeBehind. Данный атрибут сообщает ASP.NET, какой файл класса C# содержит код, ассоциированный с веб-формой. В приведенном примере это файл Default.aspx.cs, который является файлом отделенного кода для Default.aspx.

Среда Visual Studio группирует вместе связанные файлы в виде одиночного элемента в окне Solution Explorer, что упрощает навигацию по крупным проектам. Если щелкнуть на стрелке слева от записи Default.aspx, можно увидеть файлы, сокрытые средой Visual Studio. Одним из них является файл Default.aspx.cs, на который производится ссылка с помощью атрибута CodeBehind.

Дважды щелкните на файле Default.aspx.cs, чтобы открыть его в редакторе; отобразится код, приведенный ниже:

Базовым для класса отделенного кода является класс System.Web.UI.Page, который содержит несколько полезных методов и свойств для ответа на веб-запросы. Пока что в классе отделенного кода нас интересует метод Page_Load(), вызываемый ASP.NET Framework при поступлении запросов для Default.aspx и предоставляющий возможность отреагировать на такие запросы.

В рассматриваемом примере метод Page_Load() будет вызван один раз во время первоначальной загрузки страницы и еще раз — когда пользователь отправит форму. В примере ниже показан код, добавленный к методу Page_Load() для реагирования на запросы:

Здесь за счет проверки свойства IsPostBack выясняется, относится ли запрос, на который производится ответ, к форме, отправленной обратно серверу. Если это так, мы создаем новый экземпляр объекта GuestResponse модели данных и передаем его методу TryUpdateModel(), унаследованному от базового класса Page.

Метод TryUpdateModel() выполняет процесс, который называется привязкой модели и предполагает использование значений данных из запроса браузера для заполнения свойств соответствующего объекта модели данных. Еще одним аргументом метода TryUpdateModel() является объект, который платформа ASP.NET должна применять для получения необходимых значений — мы используем класс System.Web.ModelBindlng.FormValueProvider, который предоставляет значения из данных формы. В результате вызова метода TryUpdateModel() свойства объекта GuestResponse обновляются, чтобы отразить значения данных, которые пользователь отправил внутри формы. Затем объект GuestResponse помещается в хранилище.

Пользователю необходимо предоставить какой-либо отклик после того, как он отправил форму, и это делается с помощью метода Response.Redirect (), который выполняет перенаправление пользовательского браузера. Если свойство WillAttend равно true, пользователь придет на вечеринку, поэтому он перенаправляется на файл seeyouthere.html. В противном случае перенаправление происходит на файл sorryyoucantcome.html.

Создание HTML-файлов ответов

Не все страницы в приложении ASP.NET должны генерироваться из файлов веб-форм. Можно также включать обычные, статические HTML-файлы. Чтобы создать первый файл ответа, щелкните правой кнопкой мыши на элементе TestAspNet45 в окне Solution Explorer и выберите в контекстном меню пункт Add New Item (Добавить Новый элемент). В открывшемся диалоговом окне Add New Item укажите шаблон HTML Page (HTML-страница) и назначьте странице имя seeyouthere.html. Наконец, щелкните на кнопке Add (Добавить) для создания HTML-файла. Приведите содержимое нового файла в соответствие с примером ниже:

Повторите описанный процесс для создания файла sorryyoucantcome.html с содержимым, которое показано в примере ниже:

Установка области действия HTML-элементов

Базовая структура приложения в основном построена, однако оно еще не полностью работоспособно. Мы должны сообщить Visual Studio, какой файл необходимо загружать при запуске приложения. Ранее это не имело значения, т.к. существовал только один файл Default.aspx, а среда Visual Studio достаточно интеллектуальна, чтобы определить его в качестве стартового. Но теперь есть еще и пара HTML-файлов, поэтому нужно предоставить Visual Studio некоторую помощь. Щелкните правой кнопкой мыши на элементе Default.aspx в окне Solution Explorer и выберите в контекстном меню пункт Set as Start Page (Установить как стартовую страницу).

Теперь можно запустить приложение, либо выбрав пункт Start Debugging в меню Debug, либо щелкнув на кнопке Google Chrome в панели инструментов. Заполните поля формы и удостоверьтесь, что в элементе select выбран вариант «Да». После отправки формы вы увидите ответ, который должен отображаться в случае выбора варианта «Нет», как показано на рисунке ниже. Очевидно, что-то не в порядке.

Причина этой проблемы в том, что при обработке файлов веб-форм платформа ASP.NET ищет только элементы, которые имеют атрибут runat со значением server. Все остальные элементы игнорируются, и поскольку элементы input и select в файле Default.aspx не имеют указанной комбинации атрибута и значения, процесс привязки модели не имеет возможности найти значения, отправленные внутри HTML-формы. В примере ниже показано, как скорректировать проблему:

Для атрибута runat предусмотрено только значение server. Если опустить атрибут runat или указать значение, отличное от server, то такие HTML-элементы станут невидимыми для ASP.NET. Пропуск атрибутов runat — это первое, что следует проверить в ситуации, когда веб-формы ведут себя не так, как ожидалось.

Снова запустите приложение и заполните форму. На этот раз отправка формы приводит к выдаче корректного ответа:

Создание итогового представления

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

Щелкните правой кнопкой мыши на элементе TestAspNet45 в окне Solution Explorer и выберите в контекстном меню пункт Add Web Form. В открывшемся диалоговом окне укажите Summary для имени веб-формы и щелкните на кнопке OK, чтобы создать новый файл Summary.aspx. Приведите содержимое файла в соответствие с примером:

Поскольку это первое создаваемое приложение ASP.NET, мы хотим продемонстрировать в этой статье максимально возможное количество приемов. Именно поэтому содержимое файла Summary.aspx существенно отличается от содержимого файла Default.aspx.

Вскоре мы подробно опишем различные разделы этого файла, но первое, что должно быть заметно — отсутствие элемента form в файле Summary.aspx. Название «веб-форма» несколько вводит в заблуждение, и хотя обычные формы удобны в большинстве приложений, файл веб-формы — это просто расширенный HTML-файл, который обрабатывается ASP.NET. В файле Default.aspx такие расширения имеют вид файла отделенного кода, поэтому его можно использовать для работы с отправками формы. В файле Summary.aspx дополнительно применяются дескрипторы для добавления динамического контента к генерируемому HTML-коду, когда браузер запрашивает данный файл.

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

Фрагмент кода с открывающим дескриптором .)

Внутри блока кода используются обычные операторы C# для генерации набора HTML-элементов, представляющих собой строки в элементе table; в этих строках перечислены люди, принявшие приглашение на вечеринку. Для получения всех объектов данных из хранилища вызывается метод ResponseRepository.GetRepository().GetAllResponses(), а для выборки всех подтверждающих участие ответов применяется LINQ-метод Where(). Затем в цикле foreach генерируются HTML-строки для каждого объекта данных:

Метод String.Format() позволяет компоновать HTML-строки, содержащие значения свойств из каждого объекта GuestResponse, который необходимо отобразить. Для добавления HTML-кода в вывод, отправляемый браузеру, используется метод Response.Write().

Форматирование динамического HTML-кода

Вы заметите, что в файл Summary.aspx включен элемент link, который импортирует файл Styles.css с содержащимися внутри него стилями. Это сделано для демонстрации того, что элемент, генерируемый в блоке кода, стилизуется точно так же, как статический HTML-элемент на странице. В примере ниже показан стиль, добавленный в файл Styles.css для применения внутри Summary.aspx.

Тестирование динамического кода

Чтобы протестировать файл Summary.aspx, запустите приложение и воспользуйтесь страницей Default.aspx для добавления данных в хранилище — помните, что в этом примере данные не хранятся постоянно, а их нужно вводить заново при каждом запуске приложения. После нескольких отправок формы перейдите на URL вида «/Summary.aspx»; появится вывод, который похож на показанный на рисунке:

Вызов метода из отделенного кода

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

В примере ниже показано, как определить новый метод по имени GetNoShowHtml() в файле отделенного кода Summary.aspx.cs. Этот метод генерирует таблицу строк, аналогичную той, что создавалась в предыдущем разделе:

После этого новый метод можно вызывать внутри фрагмента кода в файле Summary.aspx:

В этом примере применяется фрагмент кода с открывающим дескриптором Required, определенный в пространстве имен System.ComponentModel.DataAnnotations, сообщает ASP.NET, что для свойства, к которому он применен, наличие значения является обязательным. Так как указанный атрибут применен ко всем свойствам в классе GuestResponse, ASP.NET известно, что все свойства класса модели данных являются обязательными. Это довольно простая форма проверки достоверности, поскольку мы не проверяем, полезно ли значение, а только сам факт его предоставления пользователем; тем не менее, такой подход вполне адекватен для рассматриваемого примера.

Когда пользователь отправляет форму в файле Default.aspx, платформа ASP.NET Framework вызывает метод Page_Load() из файла отделенного кода Default.aspx.cs. Ранее в этой статье было показано, как вызывать метод TryUpdateModel() для выполнения привязки модели. После добавления атрибута Required этот метод будет проверять, получены ли значения для всех свойств.

В файл Default.aspx понадобится внести дополнение для отображения пользователям сообщений, когда возникают проблемы с проверкой достоверности данных формы, которая была отправлена. Это дополнение показано в примере ниже:

Здесь был добавлен элемент управления ASP.NET Web Forms. Такой элемент управления генерирует HTML-код внутри страницы — доступны различные виды элементов управления, которые предоставляют удобный способ инкапсуляции функциональности, делающий возможным их повторное использование в рамках приложения. Можно создавать собственные элементы управления либо применять предлагаемые Microsoft. В рассматриваемом примере был добавлен элемент управления ValidationSummary, разработанный в Microsoft, который отображает сообщения об ошибках проверки достоверности.

Для подсветки ошибок красным цветом добавьте следующий стиль в файл Styles.css:

Этот элемент управления генерирует порцию HTML-кода, которая выводит список проблем проверки, найденных в данных формы. Чтобы увидеть, как он работает, запустите приложение и щелкните на кнопке «Отправить приглашение RSVP», не вводя никаких данных. Результат показан на рисунке ниже:

При определении свойства WillAttend в классе GuestResponse применялся тип bool, допускающий null, который может принимать значения true и false, но также может быть null. Эта возможность используется для определения, выбрал ли пользователь значение в элементе select по имени WillAttend:

Существует удобное взаимодействие между процессом привязки модели и атрибутом проверки достоверности Required, которым можно воспользоваться. Процесс привязки модели преобразует значение пустой строки первого элемента option в null, но атрибут Required сгенерирует ошибку проверки достоверности, если не будет получено значение true или false. Такое несоответствие позволяет автоматически генерировать ошибку, если пользователь не выбрал значения «Да» или «Нет» в раскрывающемся списке.

Единственная проблема этого подхода в том, что сообщение проверки достоверности бессмысленно для пользователя, который ничего не знает о том, что элемент select, помеченный как «Вы придете?», соответствует свойству модели данных по имени WillAttend. Чтобы решить эту проблему, необходимо предоставить атрибут Required с другим сообщением для отображения, как показано в примере ниже:

В свойстве ErrorMessage было указано более полезное сообщение, которое отобразится в браузере, если запустить приложение и снова отправить форму, не вводя никаких данных:

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

Создание страниц ASP.NET в среде Visual Studio

Среда Visual Studio существенно облегчает разработку Web-приложений. Основными действиями, выполняемыми в ходе создания приложения в среде, являются создание форм, написание обработчиков событий, добавление файлов (таблиц стилей, страниц и т.п.), отладка

В Visual Studio разных версий предлагается несколько режимов создания Web-приложений, функционирующих на основе ASP.NET, чаще всего используются Website… и Project… В Visual Studio 2005 включен только Website…, в 2008 и 2010 – оба.

В режиме создания Web-сайта (File — New Website…). Visual Studio создает только файлы, относящиеся к сайту (файл с кодом страницы, файл с программами обработчиков и файл конфигурации).

В окне New Web Site могут быть дополнительно указаны параметры: версия .NET, шаблон (выбираем ASP.NET WEB Site), размещение (место хранения файлов Web-сайта), язык программирования. После того, как выбор сделан (нажата ОК) будет создана заготовка Web-приложения (три основных файла). Компиляция страниц будет выполняться средой ASP.NET перед открытием в браузере.

В режиме создания проекта (File — New Project…) кроме основных файлов, генерируется несколько вспомогательных и файл проекта с расширением .csproj, в котором фиксируются составляющие проект файлы и сохраняются некоторые отладочные параметры.

В окне New Project кроме типа (ASP.NET Web Application), места размещения и языка, необходимо выбрать имя (Solution Name), которое затем будет использовано для создания в выбранном месте размещения соответствующего подкаталога.

В отличие от режима создания Web Site, кроме размещения информации в различных файлах, при запуске Web-проекты компилируются Visual Studio (а не ASP.NET). Классы Web-страниц объединяются в одну сборку, которая получает то же имя, что и у Web-проекта (например, WebApplication) и затем размещается в папке bin. В Web-проекте для страниц всегда используют модель отделенного кода, объявления для всех элементов управления содержаться в файле с расширением .aspx.desginer.cs. Во время компиляции файлы с кодами обработчиков и кодами элементов управления будут объединены. В беспроектном Web-сайте файла с объявлениями элементов управления нет, поскольку эта часть кода генерируется во время компиляции системой ASP.NET. Есть и другие отличия (например, в содержании директивы Page и т.п.), останавливаться на которых мы не будем.

Дальнейшие действия по созданию Web-приложения практически не отличаются.

В ходе работы по созданию сайтов используются окна и панели, состав и место расположения которых можно изменять, используя меню View и перетаскивая их мышью. Типичный вид среды при разработке Web-приложений приведен на рис.4.4.

Рис. 4.4. Вид окна для разработки Web-приложений

Панели инструментов, содержат различные команды для форматирования текста, поиска текста и т.д.

Обозреватель решений, отображает файлы и папки веб-узла.

Окно документов обеспечивает отображение документов в различных представлениях и служит визуализированным редактором форм.

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

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

Обозреватель серверов (баз данных) отображает подключения различных служб компьютера, в том числе серверов баз данных.

Окно вывода служит для вывода сообщений среды (ошибки, информация отладчика и т.п.).

Создание форм. Создаваемые документы (формы и файлы с программным кодом) открываются в окне документов. При работе с формами предусмотрено два режима отображения Design и Source. В первом режиме интерфейс можно конструировать визуально, во втором – путем написания кода разметки. Для переключения используются закладки в нижней части окна. В режиме Design можно повысить наглядность отображаемой структуры, выполнив команду Details из меню View.

Мастер Йода рекомендует:  Напишите функцию суммирования двух целых чисел без использования «+» и других арифметических

Форма ASP.NET – документ, на основе которого формируется HTML-страница, отправляемая клиенту. Она создается путем размещения элементов в окне документов. Элементы для размещения выбираются из панели инструментов. В панели элементы сгруппированы по типам.

Чаще всего используются элементы из групп HTML и Standard.

Группа HTML содержит HTML-элементы, соответствующие одноименным элементам обычных Web-страниц. С их использование создается статическая разметка страницы. Однако они могут быть преобразованы в серверные путем добавления атрибута runat=»server» или выполнения команды Run As Server Control из контекстного меню элемента. Их называют серверными HTML-элементами управления, при их обработке перед отправкой формируется только один HTML-тег.

Группа Standard содержит серверные элементы управления с расширенной функциональностью. Среди них имеются полнофункциональные элементы управления, выполняющие генерацию достаточно сложного HTML-кода и клиентских сценариев JavaScript для создания развитого интерфейса на клиенте. Это такие элементы как Calendar, AdRotator, TreeView. Среди них есть и аналоги HTML-элементов (кнопок, текстовых полей и т.д.). Элементы этой группы называют серверными Web-элементами управления, они являются основными при создании форм.

Среди других групп отметим такие.

Login — элементы управления входом в систему. Эти элементы управления поддерживают аутентификацию пользователя, их можно использовать вместо написания своих собственных интерфейсов для входа в систему и создания новых пользователей.

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

Validation — элементы управления проверкой правильности заполнения полей пользователем.

Data — элементы управления данными.

После размещения элемента имеется возможность задания его свойств с помощью окна свойств. Элемент необходимо выделить, в окне отобразятся его свойства, которые можно изменять.

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

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

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

Ваше первое ASP.NET 5 веб приложение, созданное при помощи Visual Studio¶

В этом руководстве вы увидите, как создать простое веб приложение при помощи ASP.NET 5. В этом приложении данные будут связаны с базой данных SQL при помощи Entity Framework (EF), а ASP.NET MVC будет поддерживать операции CRUD.

Начальные реквизиты¶

Прежде чем начать, убедитесь, что вы сделали вот это: Установка ASP.NET 5 для Windows. Мы предполагаем, что у вас установлена Visual Studio 2015 и последняя версия среды и инструментария ASP.NET 5.


Дополнительную информацию по установке ASP.NET 5 на других платформах вы можете получить тут: Начинаем.

Создание нового ASP.NET 5 проекта¶

Запустите Visual Studio 2015. Из меню File выберите New > Project.

Выберите шаблон ASP.NET Web Application. Он находится в Installed > Templates > Visual C# > Web. Назовите проект ContosoBooks и нажмите OK.

В диалоговом окне New ASP.NET Project выберите Web Application под ASP.NET 5 Preview Templates. Кроме того, убедитесь, что галочка не стоит на Host in the cloud, и нажмите OK.

Не меняйте метод аутентификации. Оставьте по умолчанию Individual User Accounts.

Запуск приложения по умолчанию¶

После того как Visual Studio закончит создание приложения, запустите его, нажав Debug -> Start Debugging. Как вариант, вы можете нажать F5.

Для инициализации Visual Studio и нового приложения может потребоваться время. После завершения браузер покажет запущенное приложение.

После запуска приложения закройте браузер и нажмите на иконку “Stop Debugging” в Visual Studio, чтобы остановить приложение.

Просмотр проекта¶

В Visual Studio окно Solution Explorer позволяет вам управлять файлами проекта. Шаблон веб приложения, который вы использовали для создания этого приложения, добавляет следующую базовую структуру папок:

Visual Studio создает некоторые начальные файлы и папки для проекта. Вот первичные файлы, с которыми вам стоит ознакомиться:

Имя файла Цель
project.json Присутствие файла project.json определяет проект .NET Execution Environment (DNX). В файле project.json содержится вся информация, которая нужна DNX, чтобы запустить и упаковать ваш проект. Дополнительную информацию, включая файловую схему project.json, вы можете найти тут: see Работа с DNX проектами.
global.json Visual Studio использует этот файл для конфигурации проекта.
appsettings.json Этот файл позволяет вам включать дополнительную информацию о проекте. Дополнительную информацию вы можете получить тут: Конфигурация.
Startup.cs Класс Startup является начальной точкой приложения. В классе Startup должен быть определен метод Configure , кроме того, здесь может быть определен метод ConfigureServices , и он может быть вызван при запуске приложения. Дополнительную информацию вы можете получить тут: Запуск приложения.
Index.cshtml Здесь view содержит HTML для основной страницы.
_Layout.cshtml Здесь view содержит общий HTML для разных страниц веб приложения.
HomeController.cs Этот controller содержит классы, которые обрабатывают входящие запросы браузера, получают модельные данные, а затем определяют шаблоны представлений, которые возвращают ответ браузеру.

Понимание MVC¶

В этом проекте используется MVC. MVC обозначает Model-View-Controller (модель-представление-контроллер). MVC — это паттерн для разработки приложений, и эти приложения хорошо структурированы, их можно протестировать и легко поддерживать. MVC приложения содержат:

  • Models: Классы, которые представляют данные этого приложения, а затем используют логику валидации для связывания бизнес-правил и данных.
  • Views: Шаблонные файлы, которые использует приложение для динамичных HTML ответов.
  • Controllers: Классы, которые обрабатывают входящие браузерные запросы, получают модельные данные, а затем определяют представления, которые возвращают ответ браузеру.

Понимание .NET Core¶

.NET Core 5 — это модальная реализация среды разработки и библиотек, которая включает в себя некоторые аспекты .NET Framework. .NET Core 5 разрабатывается для Windows, Linux и OS X. .NET Core 5 состоит из набора библиотек “CoreFX” и маленькой среды разработки “CoreCLR”. .NET Core имеет открытый исходный код, так что вы можете отслеживать развитие проекта на GitHub. Больше информации вы можете получить тут: Выбор правильного .NET сервера.

Entity Framework¶

Entity Framework (EF) — это ORM (object-relational mapping) фреймворк. Он позволяет работать с реляционными данными как с объектами, и при этом вам нужно писать намного меньше кода для доступа к данным, чем обычно. Используя EF, вы можете работать с запросами при помощи LINQ, затем получать и обрабатывать данные как строго типизированные объекты. LINQ предлагает паттерны для запроса и обновления данных. Использование EF позволяет сфокусироваться на остальной части проекта, а не на основах доступа к данным.

Откройте файл project.json. В разделе dependencies вы увидите следующие строки, связанные с EF:

Здесь показано, что вы можете использовать команды EF из командного окна, а также что пакет EF NuGet включен в ваш проект.

Создание модели данных и скаффолдинг¶

Entity Framework поддерживает парадигму разработки Code First. Code First позволяет определять модели данных при помощи классов. Класс — это конструкция, которая позволяет создавать собственные пользовательские типы, группируя переменные разных типов, методы и события. Классы могут работать с существующей базой данных или генерируют базу данных. В данном руководстве вы начнете с создания entity-классов, которые определяют модели данных для веб приложения. Затем вы создадите контекстные классы, которые управляют entity-классами и дают данным доступ к базе данных. Далее вы настроите EF и заполните базу данных.

Создание entity-классов¶

Классы, которые вы создаете для определения схемы данных, называются entity-классами. Если вы новичок в работе с базами данных, подумайте об entity-классах как о табличной структуре базы данных. Каждое свойство класса определяет колонку таблицы базы данных. Эти классы предлагают легкий, объектно-реляционный интерфейс, совмещающий объектно-ориентированный код и реляционную табличную структуру базы данных.

В веб приложении будет две сущности:

Вы определите класс для каждой из них в папке Models в Solution Explorer.

Модельный класс вы можете поместить в любое место вашего проекта. Папка Models — это просто соглашение.

Кликните правой кнопкой мышки по папке Models и выберите Add > New Item. В диалоговом окне Add New Item выберите шаблон Class. В поле Name напишите “Author.cs” и нажмите OK.

Замените код по умолчанию следующим кодом:

Повторите эти шаги для создания другого класса Book со следующим кодом:

Чтобы не уложнять приложение, пусть у каждой книги будет один автор. Свойство Author определяет способ управления отношениями между автором и книгой. В EF этот тип свойства называется navigation property. Когда EF создает схему базы данных, EF автоматически вставляет AuthorID , и это будет вторичным ключом для таблицы Authors.

Скаффолдинг¶

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

Чтобы добавить скаффолдинг кликните правой клавишей мышки по папке Controllers в Solution Explorer. Выберите Add –> New Scaffolded Item.

Если вы не видите опцию New Scaffolded Item, убедитесь, что при создании проекта вы использовали Individual User Accounts.

Из диалогового окна Add Scaffold выберите MVC 6 Controller with views, using Entity Framework, а затем нажмите на кнопку Add.

Далее, в диалоговом окне Add Controller в списке с модельными классами выберите Book (ContosoBooks.Models). Также установите контекстный класс на ApplicationDbContext (ContosoBooks.Models). Флажок на Generate views должен быть установлен. Нажмите на кнопку Add.

Как вы видите, диалоговое окно Add Controller дает вам возможность выбирать опции для создания контроллеров и представлений.

Этот скаффолд создает код, который предоставляет контроллер и набор представлений. В представлениях есть UI и код для создания, чтения, обновления, удаления и перечисления данных из базы данных.

Повторите вышеперечисленные шаги по скаффолдингу, чтобы создать контроллер Author и связанные с ним представления. Используйте модельный класс Author (ContosoBooks.Models) и контекстный класс ApplicationDbContext (ContosoBooks.Models), как показано на следующем рисунке.

В Solution Explorer вы увидите, что новые контроллеры добавлены в папку Controller, а новые представления в папку Views.

Настройка приложения перед добавлением данных¶

Далее, к приложению нужно добавить пакет Microsoft.Extensions.DependencyInjection . В Solution Explorer найдите и откройте project.json. В разделе dependencies в конце раздела пропишите эту строку.

IntelliSense помогает вам, когда вы набираете. Когда вы сохраните project.json, Visual Studio автоматически даст ссылку на новый пакет.

После добавления этой строки раздел dependencies в файле project.json будет выглядеть вот так:

Добавление данных¶

Мы не будем вручную набирать данные — мы используем код, который заполнит базу данных. Добавьте класс SampleData в папке Models со следующим кодом:

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

Далее, в Solution Explorer, откройте файл Startup.cs. Добавьте следующую строку кода в методе Configure:

После этого полный файл Startup.cs будет выглядеть вот так:

Обратите внимание, что в ConfigureServices приложение вызывает Configuration[«Data:DefaultConnection:ConnectionString»] , чтобы получить строку соединения с базой данных. Во время разработки эта настройка идет из файла appsettings.json. Когда вы разворачиваете приложение в производственной среде, вы устанавливаете строку соединения в переменную среды на хосте. Если Configuration API находит переменную среды с тем же ключом, то возвращает переменную среды, вместо того значения, что находится в appsettings.json.

Создание веб приложения¶

Чтобы убедиться, что все классы и изменения работают, вы должны создать приложение.

Из меню Build выберите Build Solution.

Отображается окно Output, и если все прошло успешно, вы увидите соответствующее сообщение.

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

Прежде чем запустить приложение, вы должны создать БД, используя миграцию данных.

Использование миграции данных для создания базы данных¶

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

Откройте Command Prompt в директории проекта (ContosoBooks/src/ContosoBooks).

Чтобы открыть Command Prompt, кликните правой кнопкой мышки по кнопке start в Windows и выберите из меню Command Prompt.

Чтобы найти директорию проекта, кликните правой кнопкой мышки в Visual Studio по имени проекта (ContosoBooks) в Solution Explorer и выберите Open Folder in File Explorer. Скопируйте путь к проекту из File Explorer в Command Prompt. Например, введите следующее из Command Prompt, чтобы сменить директорию:

Убедитесь, что вы перешли к папке ContosoBooks, что в папке src.

Из Command Prompt запустите следующие команды:

Если dnu restore не распознается, вам нужно полностью повторить шаг с начальными реквизитами (или частично). Но сперва вам надо проверить Active версию .NET Version Manager (dnvm). Чтобы сделать это, введите dnvm list в командной строке. Если рядом с какой-либо версией нет *, установите активную версию, то есть, введите dnvm use 1.0.0-rc1-update1 -p , так что нужная версия будет выбрана.

.NET Version Manager (dnvm) — это набор утилит командной строки, которые используются для обновления и конфигурации .NET Runtime.

DNX обозначает .NET Execution Environment. Команда ef указана в файле project.json проекта. Больше информации по dnvm , dnu , and dnx , вы можете получить тут: DNX Overview.

Команда “ add Initial ” создает миграцию “Initial”, которая добавляет в проект код, позволяя EF обновлять схему базы данных. Команда update создает актуальную базу данных. После запуска этой команды папка Migrations будет обновлена:

Если вы хотите получить помощь по EF командам, введите следующее в командной строке: dnx ef -? . Для помощи с командой add введите следующее: dnx ef migrations add -? . А для помощи с командой update — следующее: dnx ef database update -? .

Кроме того, вы сможете увидеть новую базу данных в SQL Server Object Explorer.

Добавление навигации¶

Обновите навигацию для веб приложения. Из Solution Explorer откройте файл Views/Shared/_Layout.cshtml. Найдите следующий код:

Замените выше представленный код вот этим:

Данные изменения добавят ссылку к представлению Books и ссылку к представлению Authors. Вы создали эти представления, когда добавили в проект скаффолдинг.

Создание веб приложения¶

Чтобы убедиться, что все работает, вам снова нужно собрать приложение.

Из меню Build выберите Build Solution.

Локальный запуск веб приложения¶

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

В Solution Explorer кликните правой клавишей мышки по названию проекта и выберите View -> View in Browser. Либо же просто нажмите F5.

Откроется браузер и покажет приложение. Нажмите на ссылку Books вверху страницы.

Закройте браузер и нажмите на иконку “Stop Debugging” в Visual Studio.

Публикация приложения на Azure¶

В Solution Explorer в Visual Studio кликните правой кнопкой мышки по проекту и выберите Publish.

В окне Publish Web нажмите на Microsoft Azure Web Apps и залогиньтесь на Azure.

После этого нажмите New, чтобы создать на Azure новое приложение.

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

В Connection в окне Publish Web нажмите Publish.

Прогресс публикации вы можете просмотреть в окне Output или в окне Azure App Service Activity в Visual Studio.

После публикации на Azure ваше приложение, запущенное на Azure, будет отображено в браузере.

Дополнительная информация доступна вот тут: Publishing and Deployment.

PHP против ASP — В примерах, господа!

Данная статья является комментарием к статье «PHP против ASP — делайте ставки, господа!». Из-за его объема и полноты мы решили вынести этот комментарий в отдельную статью.

Написал несколько проектов на PHP. К сожалению ни один не дожил до сегодняшнего дня. Был проект Melodyland, написанный на ASP, www.melodyland.ru , я частично переписал его на ASP.NET (C#) . Сейчас пишу свой сайт на ASP.NET www.melodyland.ru/goodman (потом переедет, сейчас только можно посмотреть фотки, там идет выборка по базе данных). Все работает на связке Win2000+IIS+MS SQLserver2000. Машинка — 500 целерон, 128 памяти чего слышу? ну да ладно, все равно не моя. Оба АСП на ней летали при загрузке 30-50 пользователей на сайте (АСП.НЕТ летал после первичной компиляции).

Ощущения. РНР-скрипт запросто можно написать болкнотом, открывая книжку. ASP.NET без Studio и MSDN (а также в особо тяжелых случаях — Инета) бесполезен (видимо, поэтому и компилятор бесплатен. хех). Большая часть работы в Студио заключается в том, что ты все время учишься использовать жутко навороченную классовую модель и при этом лазишь, лазишь и еще раз лазишь по МСДН. Можно сказать, что треть времени разработчик сидит в МСДНне.

Зато потом. счетчик посещений? — пожалуйста, 5 строчек. Добавить сюда татакую же таблицу? Пожалуста, два щелчка мышкой, 10 строчек. Другой вывод? Пожалуста! Нестим класс, перекрываем процедуру, отлаживаем 5 минут, готово, привязываем к выводу второй таблицы, смотрим. Абстрактно ощущения от работы с .NET — что-то среднее между Delphi и C++

— все время ищещь компоненты, но, при этом головой тоже работать приходится, писать самому. Причем держать схему проекта в голове надо постоянно. Потому что если что забудешь- работа, с того момента, как забыл, становится бессмысленной и приходится возвращаться к «контрольной» точке. Сламое главное в .NET — это стадия плаирования, как общего, так и частного. Без нее все рухнет. Именно поэтому .NET плохо подходит одиноким программистам или маленьким группам (маньяки типа меня, свято верящие в светлое будущее M$, не считаются). Территория .NET — это гигантские, бытро и постоянно расширяющиеся инет-проекты, где один программист в лучшем случае отвечает за один модуль. Ну скажите где еще вы найдете, чтобы в проекте люди писали на разных языках? Только в проектах, которые могут позволить себе нанять профи, пишущего на языке, отличном от проектного основного. Производительность? Не хватает ресурсов? Купим еще компьютеров, лишь бы темпы не падали. Вот в таких проектов РНР-программистам точно труба дело. Почему: потому что им потребуется куча координаторов, которым денег платить нада. Координаторов, большую часть работы которых берет на себя .NET

И, кстати, большинству unix-систем там тоже делать нечего (не надо плеваться! Stand-alone — это прекрасно, но все знают, что сделать кластер на юнихе намного сложнее, и соответственно, денег уйдет больше. Я НЕ говорю о гигантских суперкомпьютерах, я говорю о парке в 20-50 машин), потому что за то время, пока сисадмины на FreeBSD подключат к кластер-серверу дополнительные машины, програмисты на Win уже давно будут писать следующий модуль. Автоматизация взаимодействия между машинами на WinServ2003 — одна из сильнейших сторон этой системы.

Теперь PHP. Если коротко охарактеризовать ощущения от работы с ним — это постоянный дебаг. И дело даже не в том, что нормальная IDE наконец-то выпустили совсем недавно (zend.com),

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

Сценарий работает, но работает неправильно.

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

Итак, в РНР, написав скрипт вы обязательно будете сидеть над ДЕБАГОМ, причем делать его придется руками через вывод чего надо в промежуточных местах алгоритма.

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

За то время, пока вы в С# будете реализовывать нужные классы, сидеть над их документацией и реализацией, приводить типы и писать всякие интерфейсы для коллекций, чтобы потом одним махом за 5 минут написать страницу,в РНР вы ту же страницу 10 раз напишете. Только вот незадача: следущая такая же страница на ASP.NET делается так же за 5 минут, а в РНР приходится затрачивать все то же время. Нужно визуально в выводе что-то на странице изменить — в АСП.НЕТ 5 минут, а в РНР — придется искать и править вывод echo. Придет другой программер и, немного поразбиравшись с вашими классами, и даже не заглядывая в их устройство сможет создать такую же страницу за 5 минут, а программист на РНР предпочтет скорее переписать все заново, чем разбираться в вашем коде.

Надеюсь, по принципам программирования все понятно. Теперь о скорости. Здесь и говорить нечего — РНР летает. Я юзал его через IIS5, IIS6, РНР 4.3 (Win). Почему не через Апач? Потому что удобнее, когда дома можешь тестить и асп и РНР. Потому что виндовый апач я так и не смог нормально запустить службой — он активно оставлял различные ворнинги о нехватке памяти в журнале (хотя и работал). И вообще, потому что ИИС удобнее. Так вот, РНР летает (хотя дотнет после первичной компиляции тоже не особо тормозит). Одни и те же функции РНР выполняет от 10 до х.з сколько % быстрее. Но вот работа с базами данных, отличных от MySQL не особо порадовала. С MS SQL ASP.NET быстрее, причем намного. Через OLE они работают одинаково. ODBC — РНР тормозит. А что такое MySQL? Возможно, я ошибаюсь, но ни для какого БД-сервера я не видел столько багфиксов и статей про критические уязвимости. Со скоростью мне тоже непонятно, не удалось, да и не было времени протестить связки PHP+MySQL и ASP.NET+SQLServer, однако я так понимаю, что в данном случае все очевидно, т. к. скорость никогда не была сильной стороной Микрософта . Впрочем, слабой тоже (кто не согласен — могут потестить различные проги под, например Redhat 8 и WinXp. Я точно уверен насчет кваки и пары-других приложений).

MSSql — это абсолютно нормальный, выделяющийся достаточно большой стабильностью работы и хорошими возмоностями масштабирования сервер, орриетированный на фирмы и небольшие предприятия. Кому нужен ОЧЕНЬ серьезная СУБД- могут идти к Ораклу. А MySQL — это скорее Stand-alone-ориентированная СУБД, как раз то что нужно для не очень больших серверов (что отнюдь не означает, что на них не могут выполняться серьезные приложения. ). Все это плюс бесплатность MySQL и РНР, плюс скорость работы этой связки без сомнения делают их ИДЕАЛЬНЫМИ для маленьких и средних проектов, в которых участвуют несколько или небольшая группа (очень желательно, чтобы сработавшихся) программистов. И для одиночек тоже. У средне-больших или больших-гигантских проектов с РНР очень вряд ли что-то получится за деньги, меньшие или равные, что придется выложить за лицензию Microsoft. Тем же, кому нужны гигантские проекты, просто пойдут и закажут их у HP, IBM или Sun.

А у РНР есть еще один козырь — это система, на которой по умолчанию все должно запускаться — *nix подобная. Во-первых, большинство из них бесплатные или стоят меньше Win (хотя админы для них стоят дороже на 20-50% в месяц; поддержка тоже стоит денег, причем неслабых). Во- вторых, хотя я с пеной у рта буду долго спорить, по поводу того, что устойчивее в целом Unix ведет себя предсказуемее. В — третьих, в нашей стране до фига непонятных людей, которые способны ради удовольствия иметь СВОЮ систему терпеть различные тормоза, сидеть под риском, что твою ветку закроют (это я про Linux), без конца копаться в man’ах и говорить, когда к ним приходишь «а я не могу подключить твой зард, на нем NTFS, приноси комп с сетевухой» (это я тоже про линукс; почему-то я свои FreeBSD’ные партиции в конце концов смог подключить к винде). Дабы не спорить насчет устойчивости могу сказать: в одной компании, где я работал, Wi

Win2000, державшая на IIS 250 динамических (ASP) веб-сайтов за три года упала всего раз, и то на пару часов, потребовалась лишь переустановка самого IIS. В другой сервер на FreeBSD стабильно падал пару раз в месяц, причем пару раз насмерть, поэтому я абсолютно уверен, что стабильность системы зависит вовсе не от типа ОС, а от наличия или отсутствия кривых рук у сисадмина.

Таким образом, еще раз повторяю, что ASP.NET (и вообще вся .NET) — система для больших проектов (а киким еще нужно быть ПО УМОЛЧАНИЮ кроссплатформенными?).

Написав программу на C# ее будет очень легко портировать на Pocket PC, с небольшими изменениями перенести прямо в Web; для того, чтобы запустить ее на Linux, вообще уже ничего не нужно кроме Mono (www.mono-project.com).

Напоследок могу посоветоваь: зайдите на job.ru и посмотрите на ситуацию с вакансиями. На одну ASP, ASP.NET вакансию приходится 10-15 РНР — вакансий. Только вот ASP.NET-программеру сходу предлагают зарплату как минимум в 2 раза больше, чем РНР.

Как и должно быть. Гемморой стоит денег.

На прощание предлагаю вам 2 варианта одной и той же программы, написанной на ASP.NET и PHP. Обе они написаны «в лоб» (специально 🙂 и решают одну и ту же задачу: вывод колчиества букв во введенной строке.

Это только файл с программой; к счастью, большая его часть сгенерирована Visual Studio и собственно моя программа находится в обработчике Button1_Click

К нему прилагается еще шаблон HTML-файла, благодаря именно котрому можно почти мгновенно полностью менять дизайн страницы (пишушие на РНР оценят:)

ASP.NET MVC: История одного проекта «Готовимся к старту» (часть 1)

ru-RU | создано: 25.04.2012 | опубликовано: 25.04.2012 | обновлено: 02.01.2020 | просмотров за всё время: 442568

Этой статьей я хочу начать цикл, который будет рассказывать о том,как сделать свой сайт на ASP.NET MVC 3. Разработка затронет все основные этапы от проектирования до публикации.

Содержание

Историческая справка

В стародавние времена, когда NET Framework стоял у своих истоков, а я писал код исключительно на Pascal’e. Хм. кажется, так слишком долго получается, поэтому упрощу схему описания. Когда начинался сайт www.calabonga.com он был простым до безобразия. Со временем пришлось его использовать как тестовую площадку для реализации идей применимых на других сайта изготавливаемых на заказ. По прошествию некоторого количества лет сайт с юмором превратился в мусорку (до недавнего времени такое название и красовалось в заголовке). Пришло время переделать сайт, причем использую нововведения в сфере разработки под web и в частности ASP.NET MVC. Я буду использовать ASP.NET 3 потому что не хочется связываться с ASP.NET 4 Beta в силу опять же beta параметра в версии. Просто скажу, что в проекте, который работаю на работе, слишком много недочетов и недоделок в этой версии.

Инструменты

Итак, раз уж пошел разговор про инспользуемые инструменты, перечислю их:

  • Visual Studio 2010 Ultimate
  • Nuget Manager
  • ASP.NET MVC 3
  • MvcScaffolding
  • EntityFramework 4.3.1 Code First
  • Unity for MVC

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

Начало

Создаю новый проект под названием Calabonga.Mvc.Humor в параметрах MVC выбираю Internet Application и движок Razor.

Запускаю. Компилируется. Работает. Красота.

Выбор jQuery UI

Выбрал цветовую схему на сайте www.jqueryui.com чтобы проще было в дальнейшем управлять дизайном. Выбрал такую цветовую гамму:

Подключу ее немного позже, когда потребуется.


На сколько свежий ты, товарищ?

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

PM> update-package

Выполнение команды обновления можно видеть на логе консоли:

Теперь немного полезных утилит

Я добавлю пару пакетов. Один пакет называется MvcTools, второй — PagerListExt. Устанавливаю:

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

Наведем порядок. Для этого надо удалить старый файл шаблона _Layout.cshtml, а новый прописать на использование по умолчанию в файле _ViewStart.cshtml:

Перед тем как запусть проект на компиляцию, надо в файле _LayoutExtended.cshtml поправить версии файлов скриптов и каскадных таблиц в соответствии с обновления полученными в результате работы команды Update-Package. У меня на момент написания статьи версии получились такие:

Обратите внимание на строку кода, который подключает скрипт от jquery-ui-1.8.19.custom.min.js (jQuery UI), следует добавить в проект файл этого скрипта. Да и каскадые стили тоже в папку /content/theme. Как я уже упоминал, дизайном я займусь позже, а скрипты и css-файлы надо всё-таки добавить в проект — мешать не будут. Запускаю проект. Главная страница показалась — уже хорошо! Кликаю на LogIn — получаю ошибку, что jQuery не найден. К счастью, я знаю почему так получилось поэтому поведаю и вам. Надо обернуть на странице (View) Login.cshtml скрипты в специальный тег, который появился после установки MvcTools.

Почему и зачем так сделано, можно посмотреть в сгенерирумом HTML-коде после запуска сайта. Теперь все скрипты помещаются после основного HTML перед самым закрывающим тегом

ASP.Net. Лекция 12. Шаблоны дизайна страниц ASP.NET (исходники)

Шаблоны дизайна — это визуальное наследование страниц, впервые появившееся в ASP.NET 2.0. Вы можете создавать основу для любого количества страниц приложения. Шаблоны позволяют легче создавать и поддерживать приложения. Visual Studio 2005 включает поддержку создания и редактирования шаблонов страниц. Эта лекция рассматривает использование шаблонов страниц в приложении и начинается с объяснения их преимуществ.

Примечание: терминология в этой области не устоялась. В некоторых книгах используют выражение «эталонные страницы». Можно применять термин «главная страница», хотя его можно спутать с Default.aspx.

Зачем нужны шаблоны дизайна страниц?

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

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

Некоторые разработчики копируют и вставляют повторяющиеся элементы во всех страницах. Это неэффективно, если нужно изменить одну деталь в этих общих элементах, изменения придется вводить во всех страницах. Можно помещать повторяющиеся куски кода во включаемые файлы с помощью команды HTML include. Но так трудно увидеть окончательный вид страницы в среде разработки. В ASP.NET 1.1 стало возможным создавать пользовательские элементы управления. Можно создать такой элемент с нужным содержанием и помещать его на все страницы. Развитием этой идеи стало создание шаблонов страниц. Это тоже пользовательский элемент управления, только он находится не в странице, а вне ее.

Основы Master Pages

С помощью шаблонов страниц вы определяете некоторое общее содержание и помещаете ее в страницу с расширением .master. Естественно, таких страниц в приложении может быть несколько. Этой шаблон могут использовать любое количество дочерних страниц, которые как и обычные страницы, имеют расширение aspx.

Начиная с этой лекции, будем разбирать проект, который Visual Studio 2005 создает по шаблону Personal Web Site Starter Kit. В нем показаны шаблоны страниц, темы и персонализация и навигация. Элементы управления навигации сосредоточены на странице шаблона Default.master. И это естественное решение, так как навигация нужна везде.

В страницу шаблона также включают общие заголовки и нижние колонтитулы.

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

Когда дочерняя страница редактируется в среде разработки, на вкладке Design видна полная страница вместе с элементами из шаблона, но они показаны серым цветом. Их редактировать нельзя. Можно редактировать то, что находится в элементах Content.

В диалоге Add New Item выберите тип страницы Master Page. Как и обычные страницы, их можно создавать с отделенным кодом или кодом, встроенным в страницу. Это никак не влияет на модель разделения кода дочерних+ страниц. Кроме того, главная и дочерняя страницы могут разрабатываться на разных языках.

Чтобы получить четкое разделение страницы на логические части, используют таблицы. Построим таблицу с 3 строками, где в верхней строке находится заголовок всех страниц, во второй произвольное содержание, она состоит из двух ячеек, в каждой из которых по одному ContentPlaceHolder. В нижнем ряду находится правовая информация. Таблица создается очень просто из меню Layout-Insert Table. Создайте таблицу 2 на 3. После этого объедините ячейки верхней и нижней строк, а в среднюю вставьте ContentPlaceHolder. Создайте содержание заголовка и подвала. Должна получиться подобная страница:

Первое отличие этой страницы от обычной в том, что она начинается с директивы Master, а не Page. Класс мастер-страницы определен в файле MasterPage.master.cs.

Класс шаблона — наследник System.Web.UI.MasterPage, который в свою очередь наследует от System.Web.UI.UserControl.

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

Теперь нужно создать страницу содержания. Она создается как обычно, только отмечается флажок с надписью Select Master Page. Появляется диалог, в котором необходимо выбрать шаблон страницы.

Атрибут MasterPage директивы Page определяет шаблон дизайна, или эталонную страницу данной страницы.

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

нужно вставить элемент:

Но и в этом случае назначение главной страницы в директиве Page имеет приоритет над назначением на уровне приложения. Установка web.config действует на тех страницах, в которых masterPageFile не указан, но определены элементы управления Content. Эта установка не действует на обычные aspx-страницы.

Шаблон можно назначить не всем страницам, а выборочно, например, расположенным в определенной папке приложения.

Элемент location вставляется в главный узел configuration. Здесь указано, что все страницы из папки Lections используют шаблонную страницу Lections.master.

На странице-наследнице шаблона могут быть только элементы типа Content, каждый из который соответствует одному элементу ContentPlaceHolder шаблона. Нельзя вставлять содержание вне этих элементов, иначе ASP.NET не сможет объединить главную страницу со страницей содержания. Идентификатор ContentPlaceHolder должен совпадать с атрибутом ContentPlaceHolderID соответствующего элемента Content.

Программа создала дочернюю страницу с 2 элементами управления Content. Если переключиться на вкладку Design, эти два элемента Content показаны в виде пустых прямоугольников, расположенных рядом друг с другом, так как в шаблоне они находятся в двух соседних ячейках таблицы. Директива Page отличается от обычной, кроме атрибута MasterPageFile, наличием атрибута Title. Так как теги , , наследуются из файла шаблона, это единственная возможность переопределить заголовок браузера. Заменим значение атрибута

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

На самой странице отображается только содержание, заданное в странице шаблона.

Шаблон можно в любой момент отредактировать, и изменения отразятся на всех производных страницах. Например, добавим картинку перед текстом заголовка.

(Ее можно найти в установке .NET «Microsoft.NET\Framework\v2.0.xxx\ASP.NETWebAdminFiles\Images)

Дочерняя страница в браузере теперь выглядит так:

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

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

Содержание по умолчанию

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

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

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

Программное назначение мастер страницы

В странице содержания можно переназначить ее главную страницу программно. Для этого нужно присвоить нужное значение свойству Page.MasterPageFile. Шаблон поменяется независимо от того, какой шаблон был назначен в директиве @Page. Но если попробуете проделать это в функциях Page_Load или Page_Init, получите ошибку времени выполнения.

Это свойство можно изменить только во время обработки события Page_PreInit. Событие Page_PreInit — самая ранняя фаза жизненного цикла страницы, к которой можно получить доступ. Во время события Init главная и дочерняя страница уже сливаются в одну, поэтому уже поздно менять шаблон. По этой причине событие Page_PreInit единственное, в обработчике которого можно работать с главной страницей отдельно от страницы содержания.

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

Страницы шаблона могут иметь методы и свойства. Чтобы можно было обращаться к ним, нужно использовать директиву @MasterType. При этом становится доступен класс страницы шаблона дизайна через строго типизированную ссылку. Атрибут TypeName задает имя типа, а VirtualPath путь относительно корневого каталога веб-приложения к файлу шаблона.

Таким образом страница разрешает доступ извне к свойствам своих элементов.

Страница содержания меняет это свойство, а элемент управления AdRotator находит с помощью FindControl:

Вложенные мастер-страницы

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

Страница, описывающая нарциссы, находится в разделе многолетних цветов и наследует шаблон SectionPerrenials.

Последовательность событий

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

Инициализация вложенных элементов управления главной страницы.

Инициализация вложенных элементов управления страницы содержания.

Инициализация самой главной страницы.

Инициализация страницы содержания.

Загрузка(Page_Load) страницы содержания.

Загрузка(Page_Load) главной страницы

Событие Page_LoadComplete страницы содержания

Загрузка дочерних элементов управления управления главной страницы.

Загрузка дочерних элементов управления управления страницы содержания.

Событие LoadComplete было введено для того, чтобы можно было обратиться из страницы содержания к элементам главной страницы, созданным в ее Page_Load. Это нельзя сделать в обработчике Page_Load страницы содержания, так как она загружается до главной страницы.

Страницы шаблонов для конкретных платформ

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

Поэтому ASP.NET 2.0 позволяет в атрибуте MasterPageFile директивы Page определить разные страницы шаблона для конкретных контейнеров.

Заключение

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

Создание макета сайта с помощью эталонных страниц (C#) Creating a Site-Wide Layout Using Master Pages (C#)

В этом учебнике показано основы главной страницы. This tutorial will show master page basics. А именно, каковы главные страницы, как один создать главную страницу, каковы содержимого заполнители, как один создает страницу ASP.NET, которая использует главной страницы, как изменение главной страницы автоматически отражаются в его связанные содержимого страницы и т. д. Namely, what are master pages, how does one create a master page, what are content place holders, how does one create an ASP.NET page that uses a master page, how modifying the master page is automatically reflected in its associated content pages, and so on.

Вступление Introduction

Одним из атрибутов хорошо спроектированный веб-сайта является согласованный сайта макет страницы. One attribute of a well-designed website is a consistent site-wide page layout. Возьмем для примера на веб-сайте www.asp.net. Take the www.asp.net website, for example. Во время написания этой статьи каждая страница имеет то же содержимое, в верхней и нижней части страницы. At the time of this writing, every page has the same content at the top and bottom of the page. Как показано на рис. 1, самой верхней части каждой страницы отображается серую линию со списком сообщества Майкрософт. As Figure 1 shows, the very top of each page displays a gray bar with a list of Microsoft Communities. Под то есть логотипа веб-узла, список языков, в которых была переведена сайта и в основных разделах: Домашняя, приступить к работе, Дополнительные сведения, загрузки и т. д. Beneath that is the site logo, the list of languages into which the site has been translated, and the core sections: Home, Get Started, Learn, Downloads, and so forth. Аналогично нижней части страницы включает в себя сведения о рекламе на www.asp.net заявление об авторских правах и ссылку на заявление о конфиденциальности. Likewise, the bottom of the page includes information about advertising on www.asp.net, a copyright statement, and a link to the privacy statement.

Рис 01: Www.asp.net веб-сайт использует согласованную выглядят и чувствовать через все страницы (Просмотр полноразмерного изображения) Figure 01: The www.asp.net Website Employs a Consistent Look and Feel Across All Pages (Click to view full-size image)

Другой атрибут хорошо спроектированной узла заключается в простоте, с помощью которого можно изменить внешний вид веб-узла. Another attribute of a well-designed site is the ease with which the site’s appearance can be changed. Рис. 1 показан на домашней странице www.asp.net, начиная с марта 2008 г., но между текущей датой и публикации в этом руководстве, могло измениться внешний вид. Figure 1 shows the www.asp.net homepage as of March 2008, but between now and this tutorial’s publication, the look and feel may have changed. Возможно пунктов меню в верхней будет расширен для включения новый раздел для MVC. Perhaps the menu items along the top will expand to include a new section for the MVC framework. Или может быть совершенно новый дизайн с различные цвета, шрифты и макет будет. Or maybe a radically new design with different colors, fonts, and layout will be unveiled. Применение таких изменений на весь сайт должен быть быстрой и простой процесс, который не требует изменения тысячи веб-страницы, входящие в состав сайта. Applying such changes to the entire site should be a fast and simple process that does not require modifying the thousands of web pages that make up the site.

Создание шаблона всех страниц в ASP.NET можно воспользоваться главные страницы. Creating a site-wide page template in ASP.NET is possible through the use of master pages. По сути, Главная страница — это специальный тип страницы ASP.NET, которая определяет разметки, который является общим для всех страниц с контентом а также области, которые можно настраивать на основе содержимого страницы, содержимое страницы. In a nutshell, a master page is a special type of ASP.NET page that defines the markup that is common among all content pages as well as regions that are customizable on a content page-by-content page basis. (Страницу содержимого является страницей ASP.NET, который привязывается к главной страницы). Каждый раз, когда изменяется макет главной страницы или форматирования, все выходные данные его содержимого страницы аналогично немедленно обновляется, что делает применение изменений внешнего вида всего веб-узла, так же просто, как обновление и развертывание одного файла (а именно, главной страницы). (A content page is an ASP.NET page that is bound to the master page.) Whenever a master page’s layout or formatting is changed, all of its content pages’ output is likewise immediately updated, which makes applying site-wide appearance changes as easy as updating and deploying a single file (namely, the master page).

Это первый учебник в серии учебников, в которых рассматриваются использование главных страниц. This is the first tutorial in a series of tutorials that explore using master pages. В ходе этой серии руководств мы: Over the course of this tutorial series we:

  • Изучите создание главных страниц и их связанные содержимого страницы Examine creating master pages and their associated content pages,
  • Рассматриваются разнообразные советы, приемы и ловушки, Discuss a variety of tips, tricks, and traps,
  • Определить типичные проблемы главной страницы и изучение обходные пути, Identify common master page pitfalls and explore workarounds,
  • Как получить доступ к главной странице из страницы содержания и a обратно, см. в разделе See how to access the master page from a content page and vice-a-versa,
  • Узнайте, как указать страницу содержимого главной страницы во время выполнения, и Learn how to specify a content page’s master page at runtime, and
  • Другие дополнительные разделы главной страницы. Other advanced master page topics.

Учебных курсах предусмотрена краткая форма изложения и предоставляются поэтапные указания со множеством снимков экранов покажем процесс визуально. These tutorials are geared to be concise and provide step-by-step instructions with plenty of screen shots to walk you through the process visually. Каждое руководство доступно в C# и Visual Basic версии и загрузить полный код, используемый. Each tutorial is available in C# and Visual Basic versions and includes a download of the complete code used.

Это первая статья руководства начинается со взгляда на главную страницу основы. This inaugural tutorial starts with a look at master page basics. Мы обсудим, как функционируют главные страницы, рассмотрим создание главной страницы и связанного содержимого страниц, с помощью Visual Web Developer и см. в разделе, как изменения к главной странице немедленно отражаются в его страниц. We discuss how master pages work, look at creating a master page and associated content pages using Visual Web Developer, and see how changes to a master page are immediately reflected in its content pages. Давайте начнем! Let’s get started!

Основные сведения о том, как функционируют главные страницы Understanding How Master Pages Work

Создание веб-сайта с макетом согласованные страницы сайта требует, что каждой веб-странице создавать общие форматирования разметку в дополнение к его пользовательское содержимое. Building a website with a consistent site-wide page layout requires that each web page emit common formatting markup in addition to its custom content. Например, во время публикации руководства или форум на www.asp.net включать свои собственные уникальные материалы, каждой из этих страниц также визуализировать серии общих

Существуют различные методы для создания веб-страниц с помощью согласованного внешнего вида и поведения. There are a variety of techniques for creating web pages with a consistent look and feel. Наивный подход — просто скопируйте и вставьте распространенных макета разметки во все веб-страницы, но такой подход имеет ряд недостатков. A naive approach is to simply copy and paste the common layout markup into all web pages, but this approach has a number of downsides. Во-первых каждый раз при создании новой страницы, не забудьте скопировать и вставить общего содержимого на страницу. For starters, every time a new page is created, you must remember to copy and paste the shared content into the page. Такое копирование и вставка операций богатыми возможностями ошибка как случайно может скопировать только подмножество общих разметки в новую страницу. Such copying and pasting operations are ripe for error as you may accidentally copy only a subset of the shared markup into a new page. И ко всему, такой подход делает, заменив существующий внешний вид сайта новый настоящие боль, потому что каждый одной страницы на сайте необходимо отредактировать для использования нового интерфейса. And to top it off, this approach makes replacing the existing site-wide appearance with a new one a real pain because every single page in the site must be edited in order to use the new look and feel.

До ASP.NET версии 2.0, странице разработчики часто размещаются общие разметки в пользовательские элементы управления и затем добавить эти пользовательские элементы управления для каждой отдельной страницы. Prior to ASP.NET version 2.0, page developers often placed common markup in User Controls and then added these User Controls to each and every page. Этот подход требуется разработчик вручную добавьте пользовательские элементы управления для каждой страницы, что допускается для изменения проще всего сайта, так как при обновлении общих разметку только пользовательские элементы управления необходимо изменить. This approach required that the page developer remember to manually add the User Controls to every new page, but allowed for easier site-wide modifications because when updating the common markup only the User Controls needed to be modified. К сожалению Visual Studio .NET 2002 и 2003 — версиях Visual Studio используется для создания приложений ASP.NET 1.x — к просмотру пользовательских элементов управления в режиме конструктора, как серые поля. Unfortunately, Visual Studio .NET 2002 and 2003 — the versions of Visual Studio used to create ASP.NET 1.x applications — rendered User Controls in the Design view as gray boxes. Следовательно разработчикам страниц, при таком подходе была недоступна WYSIWYG среды разработки. Consequently, page developers using this approach did not enjoy a WYSIWYG design-time environment.

Описанные недостатки использования пользовательских элементов управления в ASP.NET версии 2.0 и Visual Studio 2005 с появлением главные страницы. The shortcomings of using User Controls were addressed in ASP.NET version 2.0 and Visual Studio 2005 with the introduction of master pages. Главная страница — это специальный тип страницы ASP.NET, которая определяет разметку сайта и регионах там, где связанные страниц с контентом определить их пользовательской разметки. A master page is a special type of ASP.NET page that defines both the site-wide markup and the regions where associated content pages define their custom markup. Как мы увидим в шаге 1, эти регионы определяются элементы управления ContentPlaceHolder. As we will see in Step 1, these regions are defined by ContentPlaceHolder controls. Элемент управления ContentPlaceHolder просто указывает позицию в иерархии элементов управления на главной странице, где могут внедряться пользовательское содержимое, страницы содержимого. The ContentPlaceHolder control simply denotes a position in the master page’s control hierarchy where custom content can be injected by a content page.

Основные понятия и функциональные возможности главных страниц не изменялась после ASP.NET версии 2.0. The core concepts and functionality of master pages has not changed since ASP.NET version 2.0. Тем не менее Visual Studio 2008 предлагает поддержку времени разработки для вложенные главные страницы, это функция, которая не было в Visual Studio 2005. However, Visual Studio 2008 offers design-time support for nested master pages, a feature that was lacking in Visual Studio 2005. Мы рассмотрим использование вложенные главные страницы в следующем учебном курсе. We will look at using nested master pages in a future tutorial.

Рис. 2 показано, как может выглядеть на главную страницу для www.asp.net. Figure 2 shows what the master page for www.asp.net might look like. Обратите внимание на то, что главная страница определяет общий макет сайта — разметку в верхней, нижней и правой части каждой страницы — а также ContentPlaceHolder в середине левом углу, где находится уникальным контентом для каждого отдельного веб-страницы. Note that the master page defines the common site-wide layout — the markup at the top, bottom, and right of every page — as well as a ContentPlaceHolder in the middle-left, where the unique content for each individual web page is located.

Рис. 02: Определяет главной страницы макета всего веб-узла, а также области редактирования на основе содержимого страницы, содержимое страницы Figure 02: A Master Page Defines the Site-Wide Layout and the Regions Editable on a Content Page-by-Content Page Basis

После определения главной страницы его можно привязать к новых страниц ASP.NET через такта флажок. Once a master page has been defined it can be bound to new ASP.NET pages through the tick of a checkbox. Эти страницы ASP.NET — страницы содержимого с именем — включают элемент управления содержимым для каждого из элементов управления ContentPlaceHolder на главной странице. These ASP.NET pages — called content pages — include a Content control for each of the master page’s ContentPlaceHolder controls. При посещении страницы содержимого через браузер модуль ASP.NET создает иерархию элементов управления на главной странице и внедряет иерархии элементов управления страницы содержимого в соответствующих местах. When the content page is visited through a browser the ASP.NET engine creates the master page’s control hierarchy and injects the content page’s control hierarchy into the appropriate places. Эта иерархия объединенный элемент управления отрисовывается и результирующий HTML возвращается обозревателю конечного пользователя. This combined control hierarchy is rendered and the resulting HTML is returned to the end user’s browser. Следовательно страницы содержимого выдает общие разметки, определенные в его главной страницы за пределами элементов управления ContentPlaceHolder и разметку страницы, определенные в свои собственные элементы управления содержимым. Consequently, the content page emits both the common markup defined in its master page outside of the ContentPlaceHolder controls and the page-specific markup defined within its own Content controls. Этот принцип показан на рис. 3. Figure 3 illustrates this concept.

Рис 03: Разметка страницы запрошенный является включенные в главной страницы (Просмотр полноразмерного изображения) Figure 03: The Requested Page’s Markup is Fused into the Master Page (Click to view full-size image)

Теперь, когда мы рассмотрели, как функционируют главные страницы, давайте рассмотрим создание главной страницы и связанного содержимого страниц, с помощью Visual Web Developer. Now that we have discussed how master pages work, let’s take a look at creating a master page and associated content pages using Visual Web Developer.

Для достижения максимально широкой аудиторией, веб-узла ASP.NET, мы создаем данной серии учебных курсов будет создан с помощью ASP.NET 3.5 с помощью бесплатной версии Visual Studio 2008, корпорации Майкрософт Visual Web Developer 2008. In order to reach the widest possible audience, the ASP.NET website we build throughout this tutorial series will be created using ASP.NET 3.5 with Microsoft’s free version of Visual Studio 2008, Visual Web Developer 2008. Если вы еще не обновлены до ASP.NET 3.5, не беспокойтесь — обсуждавшиеся в этих руководствах работают одинаково хорошо с ASP.NET, 2.0 и Visual Studio 2005. If you have not yet upgraded to ASP.NET 3.5, don’t worry — the concepts discussed in these tutorials work equally well with ASP.NET 2.0 and Visual Studio 2005. Тем не менее некоторые демонстрация приложения могут использовать новые возможности .NET Framework версии 3.5; При использовании функции 3.5, я включил примечание, которое описывает, как реализовать аналогичные функциональные возможности в версии 2.0. However, some demo applications may use features new to the .NET Framework version 3.5; when 3.5-specific features are used, I include a note that discusses how to implement similar functionality in version 2.0. Имейте в виду, что демонстрационных приложений, доступных для загрузки из каждого учебника целевого объекта .NET Framework версии 3.5, что приводит к Web.config файл, который содержит элементы конфигурации 3.5 и ссылки на пространства имен 3.5 зависящие в using инструкций в классы фонового кода страницы ASP.NET. Do keep in mind that the demo applications available for download from each tutorial target the .NET Framework version 3.5, which results in a Web.config file that includes 3.5-specific configuration elements and references to 3.5-specific namespaces in the using statements in ASP.NET pages’ code-behind classes. Короче говоря, если вы еще установка .NET 3.5 на компьютере, затем загружаемые веб-приложение не будет работать без предварительного удаления разметки 3.5 зависящие от Web.config . Long story short, if you have yet to install .NET 3.5 on your computer then the downloadable web application will not work without first removing the 3.5-specific markup from Web.config . См. в разделе разбор ASP.NET версии 3.5 Web.config файл Дополнительные сведения по этой теме. See Dissecting ASP.NET Version 3.5’s Web.config File for more information on this topic. Также необходимо будет удалить using инструкций, ссылающихся на конкретных 3.5 пространства имен. You will also need to remove the using statements that reference 3.5-specific namespaces.

Шаг 1. Создание главной страницы Step 1: Creating a Master Page

Прежде чем мы можем рассмотреть создание и использование страницах, необходимо сначала на веб-сайте ASP.NET. Before we can explore creating and using master and content pages, we first need an ASP.NET website. Начните с создания нового файла на основе системы веб-узла ASP.NET. Start by creating a new file system-based ASP.NET website. Для этого запустите Visual Web Developer и затем перейдите к меню «файл» и выберите новый веб-сайт, отображение диалогового окна нового веб-сайта (см. рис. 4). To accomplish this, launch Visual Web Developer and then go to the File menu and choose New Web Site, displaying the New Web Site dialog box (see Figure 4). Выберите шаблон веб-сайт ASP.NET, задайте раскрывающемся списке расположение в файловой системе, выберите папку для размещения веб-сайта и задать язык C#. Choose the ASP.NET Web Site template, set the Location drop-down list to File System, choose a folder to place the web site, and set the language to C#. Это создаст новый веб-сайт с Default.aspx страницы ASP.NET, App_Data папки и Web.config файла. This will create a new web site with a Default.aspx ASP.NET page, an App_Data folder, and a Web.config file.

Visual Studio поддерживает два режима управления проектом. Проекты веб-сайтов и проектов веб-приложений. Visual Studio supports two modes of project management: Web Site Projects and Web Application Projects. Проектов веб-сайтов не хватает файл проекта, тогда как Web Application Projects имитируют архитектура проекта в Visual Studio .NET 2002/2003 — они включают файл проекта и компиляции исходного кода проекта в единую сборку, которая помещается в /bin папка. Web Site Projects lack a project file, whereas Web Application Projects mimic the project architecture in Visual Studio .NET 2002/2003 — they include a project file and compile the project’s source code into a single assembly, which is placed in the /bin folder. Проекты Visual Studio 2005 изначально только поддерживаемые веб-узла, несмотря на то что модели проекта веб-приложения был снова с пакетом обновления 1; Visual Studio 2008 включает в себя оба проекта модели. Visual Studio 2005 initially only supported Web Site Projects, although the Web Application Project model was reintroduced with Service Pack 1; Visual Studio 2008 offers both project models. Visual Web Developer 2005 и 2008 выпусков, однако поддерживают только проектов веб-сайтов. The Visual Web Developer 2005 and 2008 editions, however, only support Web Site Projects. Я использую модели проекта веб-сайта для приводить свои примеры в этой серии руководств. I use the Web Site Project model for my demos in this tutorial series. Если вы используете отличных от Express edition и хотите использовать модели проекта веб-приложения, вместо этого, вы можете сделать это, но имейте в виду, что могут существовать некоторые несоответствия между отображаемые на экране и шаги, которые необходимо предпринять и снимки экрана и инструкций в этих учебниках NS. If you are using a non-Express edition and want to use the Web Application Project model instead, feel free to do so but be aware that there may be some discrepancies between what you see on your screen and the steps you must take versus the screen shots shown and instructions provided in these tutorials.

Рис. 04: Создание веб-сайта New File System-Based (Просмотр полноразмерного изображения) Figure 04: Create a New File System-Based Web Site (Click to view full-size image)

Затем добавьте главную страницу на сайт в корневом каталоге, щелкнув правой кнопкой мыши имя проекта и Добавление нового элемента и выбрав шаблон главной страницы. Next, add a master page to the site in the root directory by right-clicking on the Project name, choosing Add New Item, and selecting the Master Page template. Обратите внимание на то, что главные страницы заканчиваться расширением .master . Note that master pages end with the extension .master . Имя этой новой главной страницы Site.master и щелкните «Добавить». Name this new master page Site.master and click Add.

05 рис: Добавление именованных Master страницы Site.master на веб-сайт (Просмотр полноразмерного изображения) Figure 05: Add a Master Page Named Site.master to the Website (Click to view full-size image)

Добавление нового файла главной страницы через Visual Web Developer создает эталонную страницу со следующей декларативной разметке: Adding a new master page file through Visual Web Developer creates a master page with the following declarative markup:

В первой строке в декларативной разметке @Master директива. The first line in the declarative markup is the @Master directive. @Master Аналогична директиве @Page директива , отображаемый на страницах ASP.NET. The @Master directive is similar to the @Page directive that appears in ASP.NET pages. Он определяет язык на стороне сервера (C#) и сведения о расположении и наследования класса фонового кода на главной странице. It defines the server-side language (C#) and information about the location and inheritance of the master page’s code-behind class.

DOCTYPE И декларативной разметке страницы появится под @Master директива. The DOCTYPE and the page’s declarative markup appears beneath the @Master directive. На странице имеется статический HTML вместе с четырьмя элементами управления на стороне сервера: The page includes static HTML along with four server-side controls:

Программист ASP.NET MVC C#

Кнопка для разрабоки, просьба не нажимать

Asp.net для начинающих: Архитектура сайта

Архитектура сайта у всех компаний своя и все считают ее идеальной, и привыкать к чужому построению сайта весьма сложно. Расскажу, как распологаю файлы проекта я. Мое архитектурное решение не самое лучшее, по этому все предложения и критика по улучшению принаются.

Создаем Asp.Net MVC 3 Web Application с Unit Test Project. После этого у нас появиться один Solution и два проекта в нем (веб сайт и юнит тесты)

Следующим шагом создаем проект для связи с базой данных. Я использую ORM Entity Framework. ORM лучше выносить в отдельный проект, что бы ее можно было легко менять или используват другие методы связи с БД или вообще использовать другое хранилище. Проект как правило я называю .Data Его тип будет «Class Library»

В созданом проекте удаляем файл Class1.cs, он нам не к чему. И добавляем ORM.

Для этого нажимаем на названии проекта и в контекстном меню выбираем пункт «Add»->»New Item. «. Выбираем «ADO.NET Entity Data Model» Пишем имя нашей ORM

После этого нам откроется Wizard создания подключения к БД. На первом шаге выбираем «Generate from database». Дальше жмем кнопку «New Connection. » и указываем параметры подключения и нужную database.

Жмем «OK». Выбираем параметр «Yes, include the sensitive data in the connection string» и жмем «Next>». На следующем шаге Вы должны выбрать таблицы, которые будут задействованы в проекте (если их нету, то прийдется создать, например табл. Persons и Blogs). Одно из особенностей этой ORM заключается в том, что все таблицы имели primary key. Жмем Finish. После этого в наш проект добавится два файла (*.edmx и App.Config). В файле App.Config находится строка подключения к базе.

Нужно скопировать строку:

и вставить ее в файл Web.config сайта.

У нас теперь там будет две строки подключения. Вторую мы будем использовать для настройки авторизации пользователя (membership).

Теперь создаем проект, в котором будет находится вся бизнес логика системы. Назовем проект .BL Его тип тоже будет «Class Library». Файл Class1.cs нужно удалить.

Додаем класс DataManager к проекту. Он будет урпавлять (а точнее хранить) бизнес объекты системы (repository)

В этом классе пишем конструктор, в котором мы будет инициализировать объект ORM. С помощью этого объекта мы будем получать доступ к базе данных:

public class DataManager
<
private dbItFreelanceEntities datacontext;
public DataManager()
<
datacontext = new dbItFreelanceEntities();
>
>

Теперь сделаем так что бы проекты узнали друг про друга. Для этого додаем Reference проекта «.Data» в «.BL». А Reference «.BL» в проект нашего сайта. Таким образом получается связь Data->BL->Сайт. Обратите внимание, что Сайт ничего не знает про Data, и будет общаться с ней через BL.

Для добавление Reference, нужно нажать мышкой на название проекта и в контекстному меню выбрать пункт «Add Reference. «. В появившимся окне на вкладке Projects нужно выбрать нужный проект (для .BL додаем .Data, а для сайта .BL)

Запускаем Solution (F5) смотрим что все работает. (Скорее всего в проект .BL вам нужно будет добавить Reference «System.Data.Entity» из закладки «.NET»)

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

Жмем правой клавишей мышки на папке Controllers и добавляем контролер с названием ControllerMain.

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

public class ControllerMain : Controller
<
private DataManager _dm;
public DataManager dm < get < return _dm; >>

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
<
base.Initialize(requestContext);
_dm = new DataManager();
>
>

Перейдем к работе с базой данных.

Мы будем использовать базу данных для получения имени и фамилии пользователя Выгdm.Persons.GetInfoUser(UserID)) Для реализации этого мы добавим класс Persons_Repository в проект .BL. Для каждого логического объекта системы будем создаваться похожий класс, главное что бы этот класс имел методы, которые относятся только к нужному объекту.

В этом классе реализуем конструктор, который будет принимать dbItFreelanceEntities datacontext и DataManager dm, это нужно для того что бы класс имел доступ к базе:

public class Persons_Repository
<
private Data.dbItFreelanceEntities datacontext;
private DataManager dm;
public Persons_Repository(Data.dbItFreelanceEntities datacontext, DataManager dataManager)
<
this.datacontext = datacontext;
this.dm = dataManager;
>
>

Теперь будем добавлять в этот класс методы для работы с объектом Person. Главный критерий, который нужно поддерживать, это не выносить классы, которые создала ORM за пределы проекта .BL. Это означает что проект mvc-сайта не должен использовать классы созданые ORM, если нужно передать какую-то информацию то для нее создаем отдельный класс.

Для примера реализуем метод GetInfoUser. Сначала создаем в проекте папку .BL ViewModels. В ней и будут хранится наши классы для обмена информации между проеками и контролерами и Views. В этой папке создаем новую папку Person, это нужно для удобной группировки классов. И уже в эту папку додаем класс TPersonInfo.


Теперь напишем метод, который будет возращать этот класс, так же добавим необходимые свойства в класс:

public TPersonInfo GetInfoUser(Guid? UserID)
<
var data = datacontext.Persons.Where(pr => pr.Person > .Select(l => new TPersonInfo()
<
Person > Role > r.RoleId).FirstOrDefault(),
FirstName = l.FirstName,
LastName = l.LastName,
IsDelete = l.IsDelete,
>).FirstOrDefault();
return data;
>

Следующим шагом откроем класс DataManager и добавим там свойство Persons

public class DataManager
<
private dbItFreelanceEntities datacontext;
public DataManager()
<
datacontext = new dbItFreelanceEntities();
>

private Persons_Repository _Persons;
public Persons_Repository Persons
<
get
<
if (_Persons == null)
_Persons = new Persons_Repository(datacontext, this);
return _Persons;
>
>
>

Итак, что мы имеем. Во первых, у нас есть класс DataManager, который имеет ссылки на классы для работы с объектами (пример такого класса Persons_Repository). Эти классы имеют методы с помощью которых мы можем добавлять/удалять/изменять/получать данные с базы данных (пример метода GetInfoUser в котором мы получаем информацию о пользователе). Во вторых, у нас есть главный контролер (ControllerMain) от него будут наследоваться все контролеры системы, и в себе он будет иметь ссылку на объект типа DataManager.

Теперь откроем контролер HomeController. Сделаем, что бы он наследовался от класса ControllerMain. В action Index мы получим информацию о пользователе с ИД <90A793FD-5391-41AE-8A5F-8A5C92091136>(такого пользователя нету, ничего страшного):

public class HomeController : ControllerMain
<
public ActionResult Index()
<
ViewBag.Message = «Welcome to ASP.NET MVC!»;

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

Создаем класс UserLoginInfo (правой клавишей на папке Models и в контекстном меню выбираем «Add»->»Class. » и пишем название UserLoginInfo) (для того что бы понять где какие файлы находяться смотри рисунок выше)

Этот класс будет иметь такие свойства (это общая информация о пользователе):

public System.Web.Security.MembershipUser User < get; private set; >
public Guid? UserID < get; private set; >
public string UserName < get; private set; >
public Guid RoleID

public bool IsAdmin < get < return false; >>
public bool IsAutoriaze < get < return User >
public string FirstName < get; private set; >
public string LastName

Теперь реализуем в этом классе статический метод с помощью, которого будем получать этот класс

public static UserLoginInfo GetAccountInfo(DataManager dm)
<
if (dm == null)
dm = new DataManager();
return new UserLoginInfo(dm);
>

В этом методе используется контруктор, давайте реализуем.

public UserLoginInfo(DataManager dm)
<
this.User = System.Web.Security.Membership.GetUser();
if (this.User == null)
return;

this.UserName = User.UserName;
this.User > var InfoUset = dm.Persons.GetInfoUser(UserID);

if (InfoUset == null)
return;

this.User > this.FirstName = InfoUset.FirstName;
this.LastName = InfoUset.LastName;
this.Role > >

В этом конструкторе мы получаем Ид пользователя(UserID) с помощью стандартных методов Membership.

Теперь перейдем к методу Initialize гланого контролера (ControllerMain). В нем мы будем получать инфу о текущем пользователи и хранить ее в HttpContext.Items[«_AccountInfo»]. Смотрим код:

public class ControllerMain : Controller
<
private DataManager _dm;
public DataManager dm < get < return _dm; >>
private UserLoginInfo _AccountInfo;
public UserLoginInfo AccountInfo < get < return _AccountInfo; >>

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
<
base.Initialize(requestContext);
_dm = new DataManager();

if (requestContext.HttpContext.Items[«_AccountInfo»] == null)
<
_AccountInfo = UserLoginInfo.GetAccountInfo(dm);
//можем получит инфу о текущем пользователе, обратившись к HttpContext.Items[«_AccountInfo»]

requestContext.HttpContext.Items.Add(«_AccountInfo», AccountInfo);
//InitCulture(requestContext.RouteData, requestContext);
>
_AccountInfo = (UserLoginInfo)requestContext.HttpContext.Items[«_AccountInfo»];
ViewBag.AccountInfo = AccountInfo;
>
>

Теперь напишем пару методов, которые мы будем использовать на вющках (Views) для получение инфы о авторизированом пользователе:

namespace System.Web.Mvc
<
public static class UserLoginInfoWork
<

public static UserLoginInfo GetUserLoginInfo(this System.Web.Mvc.UrlHelper url)
<
return (UserLoginInfo)url.RequestContext.HttpContext.GetUserLoginInfo();
>

public static UserLoginInfo GetUserLoginInfo(this System.Web.Mvc.HtmlHelper url)
<
var account = (UserLoginInfo)url.ViewContext.Controller.ViewBag.AccountInfo;
return account ?? (UserLoginInfo)url.ViewContext.HttpContext.GetUserLoginInfo();
>

public static UserLoginInfo GetUserLoginInfo(this HttpContextBase url)
<
var AccountInfo = (UserLoginInfo)url.Items[«_AccountInfo»];
if (AccountInfo == null)
<
AccountInfo = new UserLoginInfo(null);
>
return AccountInfo;
>
>
>

Теперь еще раз откроем action Index Home-контроллера и получим там инфу о пользователе:

public ActionResult Index()
<
ViewBag.Message = «Welcome to ASP.NET MVC!»;

var ThisUser = AccountInfo;

Исходный код можно скачать здесь

Asp.net для начинающих. Содержание.

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

Очень интересно. Только не понятно, как работать с хранимками. И как строку подключения к ORM перенести из библиотеке в сам проект.

Счетчик посещений для веб-сайта MVC ASP.NET

Как создать счетчик посещений (счетчик посетителей) для каждой страницы на веб-сайте MVC? И хранить информацию в базе данных MS SQL. То же, что и stackoverflow, используя на каждой странице.

Пожалуйста, покажите мне пример. Спасибо u

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

Я смог сделать это с помощью переменных Session, sql server db в ASP.NET MVC.

Примечание. Я использовал переменные сеанса вместо хранения IP-адреса клиента. Поскольку сохранение всего адреса клиента переполнит вашу базу данных. Это работает так же, как и свойство Stackoverflow, отображаемое для каждого вопроса в правом верхнем углу.

Вот как это сработало для меня.

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

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

Ваше первое ASP.NET 5 веб приложение, созданное при помощи Visual Studio¶

В этом руководстве вы увидите, как создать простое веб приложение при помощи ASP.NET 5. В этом приложении данные будут связаны с базой данных SQL при помощи Entity Framework (EF), а ASP.NET MVC будет поддерживать операции CRUD.

Начальные реквизиты¶

Прежде чем начать, убедитесь, что вы сделали вот это: Установка ASP.NET 5 для Windows. Мы предполагаем, что у вас установлена Visual Studio 2015 и последняя версия среды и инструментария ASP.NET 5.

Дополнительную информацию по установке ASP.NET 5 на других платформах вы можете получить тут: Начинаем.

Создание нового ASP.NET 5 проекта¶

Запустите Visual Studio 2015. Из меню File выберите New > Project.

Выберите шаблон ASP.NET Web Application. Он находится в Installed > Templates > Visual C# > Web. Назовите проект ContosoBooks и нажмите OK.

В диалоговом окне New ASP.NET Project выберите Web Application под ASP.NET 5 Preview Templates. Кроме того, убедитесь, что галочка не стоит на Host in the cloud, и нажмите OK.

Не меняйте метод аутентификации. Оставьте по умолчанию Individual User Accounts.

Запуск приложения по умолчанию¶

После того как Visual Studio закончит создание приложения, запустите его, нажав Debug -> Start Debugging. Как вариант, вы можете нажать F5.

Для инициализации Visual Studio и нового приложения может потребоваться время. После завершения браузер покажет запущенное приложение.

После запуска приложения закройте браузер и нажмите на иконку “Stop Debugging” в Visual Studio, чтобы остановить приложение.

Просмотр проекта¶

В Visual Studio окно Solution Explorer позволяет вам управлять файлами проекта. Шаблон веб приложения, который вы использовали для создания этого приложения, добавляет следующую базовую структуру папок:

Visual Studio создает некоторые начальные файлы и папки для проекта. Вот первичные файлы, с которыми вам стоит ознакомиться:

Имя файла Цель
project.json Присутствие файла project.json определяет проект .NET Execution Environment (DNX). В файле project.json содержится вся информация, которая нужна DNX, чтобы запустить и упаковать ваш проект. Дополнительную информацию, включая файловую схему project.json, вы можете найти тут: see Работа с DNX проектами.
global.json Visual Studio использует этот файл для конфигурации проекта.
appsettings.json Этот файл позволяет вам включать дополнительную информацию о проекте. Дополнительную информацию вы можете получить тут: Конфигурация.
Startup.cs Класс Startup является начальной точкой приложения. В классе Startup должен быть определен метод Configure , кроме того, здесь может быть определен метод ConfigureServices , и он может быть вызван при запуске приложения. Дополнительную информацию вы можете получить тут: Запуск приложения.
Index.cshtml Здесь view содержит HTML для основной страницы.
_Layout.cshtml Здесь view содержит общий HTML для разных страниц веб приложения.
HomeController.cs Этот controller содержит классы, которые обрабатывают входящие запросы браузера, получают модельные данные, а затем определяют шаблоны представлений, которые возвращают ответ браузеру.

Понимание MVC¶

В этом проекте используется MVC. MVC обозначает Model-View-Controller (модель-представление-контроллер). MVC — это паттерн для разработки приложений, и эти приложения хорошо структурированы, их можно протестировать и легко поддерживать. MVC приложения содержат:

  • Models: Классы, которые представляют данные этого приложения, а затем используют логику валидации для связывания бизнес-правил и данных.
  • Views: Шаблонные файлы, которые использует приложение для динамичных HTML ответов.
  • Controllers: Классы, которые обрабатывают входящие браузерные запросы, получают модельные данные, а затем определяют представления, которые возвращают ответ браузеру.

Понимание .NET Core¶

.NET Core 5 — это модальная реализация среды разработки и библиотек, которая включает в себя некоторые аспекты .NET Framework. .NET Core 5 разрабатывается для Windows, Linux и OS X. .NET Core 5 состоит из набора библиотек “CoreFX” и маленькой среды разработки “CoreCLR”. .NET Core имеет открытый исходный код, так что вы можете отслеживать развитие проекта на GitHub. Больше информации вы можете получить тут: Выбор правильного .NET сервера.

Entity Framework¶

Entity Framework (EF) — это ORM (object-relational mapping) фреймворк. Он позволяет работать с реляционными данными как с объектами, и при этом вам нужно писать намного меньше кода для доступа к данным, чем обычно. Используя EF, вы можете работать с запросами при помощи LINQ, затем получать и обрабатывать данные как строго типизированные объекты. LINQ предлагает паттерны для запроса и обновления данных. Использование EF позволяет сфокусироваться на остальной части проекта, а не на основах доступа к данным.

Откройте файл project.json. В разделе dependencies вы увидите следующие строки, связанные с EF:

Здесь показано, что вы можете использовать команды EF из командного окна, а также что пакет EF NuGet включен в ваш проект.

Создание модели данных и скаффолдинг¶

Entity Framework поддерживает парадигму разработки Code First. Code First позволяет определять модели данных при помощи классов. Класс — это конструкция, которая позволяет создавать собственные пользовательские типы, группируя переменные разных типов, методы и события. Классы могут работать с существующей базой данных или генерируют базу данных. В данном руководстве вы начнете с создания entity-классов, которые определяют модели данных для веб приложения. Затем вы создадите контекстные классы, которые управляют entity-классами и дают данным доступ к базе данных. Далее вы настроите EF и заполните базу данных.

Создание entity-классов¶

Классы, которые вы создаете для определения схемы данных, называются entity-классами. Если вы новичок в работе с базами данных, подумайте об entity-классах как о табличной структуре базы данных. Каждое свойство класса определяет колонку таблицы базы данных. Эти классы предлагают легкий, объектно-реляционный интерфейс, совмещающий объектно-ориентированный код и реляционную табличную структуру базы данных.

В веб приложении будет две сущности:

Вы определите класс для каждой из них в папке Models в Solution Explorer.

Модельный класс вы можете поместить в любое место вашего проекта. Папка Models — это просто соглашение.

Кликните правой кнопкой мышки по папке Models и выберите Add > New Item. В диалоговом окне Add New Item выберите шаблон Class. В поле Name напишите “Author.cs” и нажмите OK.

Замените код по умолчанию следующим кодом:

Повторите эти шаги для создания другого класса Book со следующим кодом:

Чтобы не уложнять приложение, пусть у каждой книги будет один автор. Свойство Author определяет способ управления отношениями между автором и книгой. В EF этот тип свойства называется navigation property. Когда EF создает схему базы данных, EF автоматически вставляет AuthorID , и это будет вторичным ключом для таблицы Authors.

Скаффолдинг¶

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

Чтобы добавить скаффолдинг кликните правой клавишей мышки по папке Controllers в Solution Explorer. Выберите Add –> New Scaffolded Item.

Если вы не видите опцию New Scaffolded Item, убедитесь, что при создании проекта вы использовали Individual User Accounts.

Из диалогового окна Add Scaffold выберите MVC 6 Controller with views, using Entity Framework, а затем нажмите на кнопку Add.

Далее, в диалоговом окне Add Controller в списке с модельными классами выберите Book (ContosoBooks.Models). Также установите контекстный класс на ApplicationDbContext (ContosoBooks.Models). Флажок на Generate views должен быть установлен. Нажмите на кнопку Add.

Как вы видите, диалоговое окно Add Controller дает вам возможность выбирать опции для создания контроллеров и представлений.

Этот скаффолд создает код, который предоставляет контроллер и набор представлений. В представлениях есть UI и код для создания, чтения, обновления, удаления и перечисления данных из базы данных.

Повторите вышеперечисленные шаги по скаффолдингу, чтобы создать контроллер Author и связанные с ним представления. Используйте модельный класс Author (ContosoBooks.Models) и контекстный класс ApplicationDbContext (ContosoBooks.Models), как показано на следующем рисунке.

В Solution Explorer вы увидите, что новые контроллеры добавлены в папку Controller, а новые представления в папку Views.

Настройка приложения перед добавлением данных¶

Далее, к приложению нужно добавить пакет Microsoft.Extensions.DependencyInjection . В Solution Explorer найдите и откройте project.json. В разделе dependencies в конце раздела пропишите эту строку.

IntelliSense помогает вам, когда вы набираете. Когда вы сохраните project.json, Visual Studio автоматически даст ссылку на новый пакет.

После добавления этой строки раздел dependencies в файле project.json будет выглядеть вот так:

Добавление данных¶

Мы не будем вручную набирать данные — мы используем код, который заполнит базу данных. Добавьте класс SampleData в папке Models со следующим кодом:

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

Далее, в Solution Explorer, откройте файл Startup.cs. Добавьте следующую строку кода в методе Configure:

После этого полный файл Startup.cs будет выглядеть вот так:

Обратите внимание, что в ConfigureServices приложение вызывает Configuration[«Data:DefaultConnection:ConnectionString»] , чтобы получить строку соединения с базой данных. Во время разработки эта настройка идет из файла appsettings.json. Когда вы разворачиваете приложение в производственной среде, вы устанавливаете строку соединения в переменную среды на хосте. Если Configuration API находит переменную среды с тем же ключом, то возвращает переменную среды, вместо того значения, что находится в appsettings.json.

Создание веб приложения¶

Чтобы убедиться, что все классы и изменения работают, вы должны создать приложение.

Из меню Build выберите Build Solution.

Отображается окно Output, и если все прошло успешно, вы увидите соответствующее сообщение.

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

Прежде чем запустить приложение, вы должны создать БД, используя миграцию данных.

Использование миграции данных для создания базы данных¶

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

Откройте Command Prompt в директории проекта (ContosoBooks/src/ContosoBooks).

Чтобы открыть Command Prompt, кликните правой кнопкой мышки по кнопке start в Windows и выберите из меню Command Prompt.

Чтобы найти директорию проекта, кликните правой кнопкой мышки в Visual Studio по имени проекта (ContosoBooks) в Solution Explorer и выберите Open Folder in File Explorer. Скопируйте путь к проекту из File Explorer в Command Prompt. Например, введите следующее из Command Prompt, чтобы сменить директорию:

Убедитесь, что вы перешли к папке ContosoBooks, что в папке src.

Из Command Prompt запустите следующие команды:

Если dnu restore не распознается, вам нужно полностью повторить шаг с начальными реквизитами (или частично). Но сперва вам надо проверить Active версию .NET Version Manager (dnvm). Чтобы сделать это, введите dnvm list в командной строке. Если рядом с какой-либо версией нет *, установите активную версию, то есть, введите dnvm use 1.0.0-rc1-update1 -p , так что нужная версия будет выбрана.

.NET Version Manager (dnvm) — это набор утилит командной строки, которые используются для обновления и конфигурации .NET Runtime.

DNX обозначает .NET Execution Environment. Команда ef указана в файле project.json проекта. Больше информации по dnvm , dnu , and dnx , вы можете получить тут: DNX Overview.

Команда “ add Initial ” создает миграцию “Initial”, которая добавляет в проект код, позволяя EF обновлять схему базы данных. Команда update создает актуальную базу данных. После запуска этой команды папка Migrations будет обновлена:

Если вы хотите получить помощь по EF командам, введите следующее в командной строке: dnx ef -? . Для помощи с командой add введите следующее: dnx ef migrations add -? . А для помощи с командой update — следующее: dnx ef database update -? .

Кроме того, вы сможете увидеть новую базу данных в SQL Server Object Explorer.

Добавление навигации¶

Обновите навигацию для веб приложения. Из Solution Explorer откройте файл Views/Shared/_Layout.cshtml. Найдите следующий код:

Замените выше представленный код вот этим:

Данные изменения добавят ссылку к представлению Books и ссылку к представлению Authors. Вы создали эти представления, когда добавили в проект скаффолдинг.

Создание веб приложения¶

Чтобы убедиться, что все работает, вам снова нужно собрать приложение.

Из меню Build выберите Build Solution.

Локальный запуск веб приложения¶

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

В Solution Explorer кликните правой клавишей мышки по названию проекта и выберите View -> View in Browser. Либо же просто нажмите F5.

Откроется браузер и покажет приложение. Нажмите на ссылку Books вверху страницы.

Закройте браузер и нажмите на иконку “Stop Debugging” в Visual Studio.

Публикация приложения на Azure¶

В Solution Explorer в Visual Studio кликните правой кнопкой мышки по проекту и выберите Publish.

В окне Publish Web нажмите на Microsoft Azure Web Apps и залогиньтесь на Azure.

После этого нажмите New, чтобы создать на Azure новое приложение.

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

В Connection в окне Publish Web нажмите Publish.

Прогресс публикации вы можете просмотреть в окне Output или в окне Azure App Service Activity в Visual Studio.

После публикации на Azure ваше приложение, запущенное на Azure, будет отображено в браузере.

Дополнительная информация доступна вот тут: Publishing and Deployment.

Добавить комментарий