Создание asp net приложений на c. Добавление новой веб-формы

Once Visual Studio is successfully installed, go ahead and launch it in order to build your very first ASP.NET web application using C#. If you are using Windows 10, you can find Visual Studio by typing in the search textbox beside the Start Menu icon:

A good idea would be to right-click and select "Pin to Taskbar" as a convenient way for you to launch the application from the Windows taskbar:

Step 1: Getting Familiar with Visual Studio

Once Visual Studio launches you will be lead to an account login prompt. This second login is for synching up settings from other installs of Visual Studio that you may have signed into previously. This includes settings such as fonts, colors, window placement, and so on.

Tip:

It may appear, at first glance, that Visual Studio, C#, and ASP.NET are inextricably linked together. However, that is not necessarily the case. The way you can think of it is that Visual Studio is just a shell environment that lets you edit and manage your projects, which in this case is made up of C# and ASP.NET files.

After logging in you will see a "Start Page" that has a few interesting features. The largest part in the middle (1) is dedicated to providing news related items or links into MSDN (Microsoft Developer Network). This news section features valuable resources, such as, articles and videos that can help you learn more about programming in Visual Studio and keep up to date with the latest features.

On the left-hand side (2) is a convenient way to create a new project, open an existing project or access a list of recent projects, which is a list that will grow larger as we add new projects over the coming lessons. One thing you should keep an eye out for is you might see a little flag in the upper right-hand corner (3) that holds important notifications. If you click it, you will see whether or not there are any suggested updates that you should apply. It’s a good idea to make sure that Visual Studio - as well as anything relating to C#, and ASP.NET - is up to date:


Step 2: Setting Up Line Numbers and Font Size

A simple adjustment to make code lines easier to follow, is to enabling line numbers for the left margin. To do so, go to the menu bar in Visual Studio and select:
Tools > Options

Select from the left-hand menu:
Text Editor > All Languages > Line Numbers


And now you should see line numbers appearing in the left margin:

While you are in the Options menu, note that you can also adjust the font size under:
Environment > Fonts and Colors


Step 3: Create a New ASP.NET Application

Once all of that is taken care of, go ahead and create a new project by either following the link on the start page or from the file menu:

File > New Project

Next you will see the New Project dialogue window. From here you will have to navigate the Installed Templates. Within the Installed Templates menu, continue until you find:
Templates > Visual C# > Web

Just make sure that you are using Visual C# templates and not Visual Basic. Select the entry in the middle called "ASP.NET Web Application":


Now change the name of your project to "MyFirstWebApp," ensuring that no whitespace is used when naming the application. Also, be aware of the capitalization scheme shown. Go ahead and click “OK” in the lower right-hand corner to continue.

Note that there are several different types of ASP.NET applications, but in this series we will focus on Web Forms. However, in the next step be sure to select "Empty" in order to start from an empty template that lets us add a Web Form later. You will also want to select the option to "Add folders and core references for Web Forms" and make sure that the "Host in the Cloud" option is unselected:


Tip

The process of creating and setting up new ASP.NET projects outlined here will be the basis for all of the other lessons. Be sure to refer back to this lesson if you have trouble remembering how to get your projects set up in future lessons.

Step 4: Introducing the Solution Explorer

After you click the “OK” button, Visual Studio will go through the process of creating a new project for you. A project can be thought of as a collection of all the file settings, references, and assets (such as, images or sounds) that will be used to create your web app. Once your project loads, take a look at the "Solution Explorer" found on the right-hand side of Visual Studio:

The "Solution" (1) is almost always found at the very top of the list within the Solution Explorer, which can be viewed as a hierarchy tree of files and references used in the project. Although you can have more than one project (2) per Solution, most of our lessons will stick to just one. Note that if the Solution Explorer is not visible, you can make it visible by selecting from the Visual Studio Menu:
View > Solution Explorer

The first thing you will want to do within the Solution Explorer is right-click the "MyFirstWebApp" project (making sure not to select the Solution itself but rather the second entry below the Solution):

When the context menu pops up, select from it:
Add > Web Form

Following that, you will be prompted to specify a name. Call it "Default," and then click "OK." This will create a page titled Default.aspx (the .aspx file name indicates that it’s a Web Form). Once this launches, you will see some HTML mixed with ASP.NET declaratives:


Step 5: Using the Designer to Make Webpages

Ignore the background HTML/ASP markup for the Default.aspx file for now as you will be mainly working within the Design mode (or, the “Designer”). This provides a rough approximation of what your web page will look like once it’s running on the client"s web browser. The Designer is a convenient WYSIWYG visual editor that allows you to add markup to your page without having to access the HTML/CSS code behind it. Enter the Designer view by selecting the "Design" button located at the bottom left-hand corner of Visual Studio. Your initial goal in the Designer is to add text and Controls to the page. You should see a dashed box at the very top with the body/div tag above it:


Inside of the dashed box near the body tag, type the question: "What is your first name?” with two spaces following the question mark so that we can insert a Control item:

Step 6: Insert Controls via the ToolBox

Now, navigate to the Toolbox and find a Server Control called "TextBox." If the Toolbox is not visible for you, you can make it visible by going to the Visual Studio menu and selecting:
View > Toolbox

Tip:

In the upper right hand corner of the Toolbox, you will notice a little pin that allows you to enable or disable auto-hide for that window. Pinning and unpinning is very useful, especially if you find yourself accessing a menu item frequently. Pinning this menu will come in handy for now.

Double-click the TextBox option in order to insert it into the web page where your cursor was last at (the two spaces after the question). Now, making sure that your cursor is positioned after this TextBox, hit the enter key twice on the keyboard and type "What is your last name?" followed again by two spaces. Now, repeat the previous step to insert another TextBox control after this phrase. You should now have something that looks like this:

Once again position your cursor at the end of the last line and hit the Enter key two more times. Returning to the Toolbox you will find, near the top, an option that inserts a button inside of your web page:

After the button is inserted, once again press enter twice and back in the Toolbox find and insert a Label Control:

Step 7: Customizing Controls via the Properties Window

The next thing to do is set some properties for these Controls (which are actually called ASP.NET Server Controls). Go ahead and select the first TextBox:

And while it is selected go to its Properties in the right-hand pane. If you don’t see the Properties pane go to the menu and select:
View > Properties Window

Alternatively, you can just press the F4 key to display the Properties window. In this window, change the programmatic ID for the first TextBox to “firstNameTextBox.” This name will let us keep track of what was entered in the TextBox, so we can later reference it within code:

While naming is somewhat arbitrary, a good rule of thumb to follow is to pick one that communicates the intent of the Control. Another good rule of thumb is to use the capitalization convention shown, called camel-case (lower-case first letter, followed by upper-case first letters for each word, while using no spaces to separate the words). Next, select the second TextBox and set its ID accordingly, with “lastNameTextBox”:

Now, selecting the Button Control in the Designer, go to its Properties window and change its ID to “okButton,” and also change its Text label (under “Appearance”) to “Click Me”. Now the button in the Designer should change as well:

And finally, select the Label control in the Designer and change its programmatic ID to “resultLabel”, while also removing the value in the “Text” field:

Removing the text for the Label ensures that nothing is shown by default (this will instead be determined in code later). The part that says “” will only be visible in the Design view, but will not be visible within the public-facing web page. At the end of all of this, the Design view should look like this:

Step 8: Write C# Code to Determine Page Behavior

Now, double click the “Click Me” button and a new tab will launch for a file called Default.aspx.cs. In this file, you will see a bunch of C# code with the cursor situated in between curly braces for a block of code called okButton_Click:


Within this set of curly braces type in the following code exactly as shown here. (Make sure to include the spaces in the literal strings)


Tip

Beginners will often run into errors that usually trace back to incorrectly typed code. Double-check that your code follows along exactly with the lesson material. If you see red squiggly underlines – it’s an indicator that you omitted, or mistyped, something in your code. Unlike writing text messages and emails, coding is an exercise in precision!

Step 9: Save and Run Your Application

The final thing you will want to do for this lesson is save all of your work (meaning all of the changes we have made to all of the files in our entire project). To do so, click on the “Save All” icon in the Visual Studio menu, or else from the menu select:
File > Save All

Now, let’s see the result of all of our work by running the application. Click on the green arrow icon in the Visual Studio menu to run the application in your web browser of choice:

You can now test out the application in the browser by entering your information in the form, and see the result posted back to you after hitting “Click Me”:


Дорогие друзья! В этой статье я Вам расскажу о двух способах создания Web-приложений ASP.NET (а они могут создаваться либо как базовые Web-сайты без вспомогательных файлов, либо как Web-проекты) в интегрированной среде разработки (Integrated Development Environment – IDE) Visual Studio Team System 2008. Мы с Вами также рассмотрим модель кода, используемого для Web-страниц ASP.NET, и процесс компиляции, применяемый для Web-приложений ASP.NET.

В Visual Studio предлагается два способа создания Web-приложений, функционирующих на основе ASP.NET:

  • Проектная разработка (или разработка с использованием проекта) . Когда создаётся Web-проект, Visual Studio генерирует файл проекта с расширением.csproj (если код пишется на языке C#), в котором фиксируются составляющие проект файлы и сохраняются некоторые отладочные параметры. При запуске Web-проекта, прежде чем запустить Web-браузер, Visual Studio сначала компилирует весь написанный разработчиком код в одну сборку;
  • Беспроектная разработка (или разработка без использования проекта) . Это альтернативный подход, который подразумевает создание просто Web-сайта безо всякого файла проекта. При таком подходе Visual Studio предполагает, что каждый файл в каталоге Web-сайта (и всех его подкаталогах) является частью Web-приложения. В этом случае Visual Studio не требуется предварительно компилировать код. Вместо этого ASP.NET компилирует уже сам Web-сайт при первом запросе какой-нибудь входящей в его состав страницы. Разумеется, разработчик может применить предварительную компиляцию и устранить связанные с первым запросом непроизводительные издержки для развёртываемого Web-приложения. О том, как именно он может это сделать, мы поговорим с Вами в следующих статьях.

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

Создание беспроектного Web-сайта

Cначала необходимо открыть Microsoft Visual Studio 2008:

Start (Пуск) -> All programs (Все программы) -> Microsoft Visual Studio 2008 -> Microsoft Visual Studio 2008

File (Файл) пункт New (Создать) Website… (Веб-узел…) – см. рис. 1.

Рис. 1. Создание нового веб-узла

Рис. 2. Диалоговое окно Новый веб-узел

В окне New Web Site (Новый веб-узел) могут быть указаны четыре следующих параметра:

  1. Версия.NET. VS 2008 поддерживает такие версии.NET: .NET 2.0, .NET 3.0, .NET 3.5. Создавать разрешается Web-приложение, функционирующее под управлением любой из этих версий.NET. Выбор нужно сделать в списке, который отображается в правом верхнем углу окна Новый веб-узел. При необходимости версию.NET можно будет изменить и уже после создания приложения, как именно – будет рассказываться позже в статье про “Многовариантность”.
  2. Шаблон. Шаблон определяет, с каких файлов должен начинаться Web-сайт. VS поддерживает два типа базовых приложений ASP.NET: приложения типа Web-сайтов и приложения типа Web-служб. Эти приложения компилируются и выполняются фактически одинаковым образом. На самом деле, вполне допускается добавлять Web-страницы в приложения типа Web-служб, а Web-службы – в приложения типа Web-сайтов. Единственным отличием являются файлы, которые VS создаёт по умолчанию: в случае приложения типа Web-сайта, это образец Web-страницы, а в случае приложения типа Web-службы – образец Web-службы. Дополнительно в VS предлагаются и более сложные шаблоны для сайтов определённых типов, а также возможность создавать свои собственные шаблоны (и возможность загружать шаблоны, созданные сторонними разработчиками).
  3. Размещение. Размещение отвечает за то, где будут храниться файлы Web-сайта. Обычно выбирается вариант File System (Файловая система), а затем указывается либо папка на локальном компьютере, либо сетевой путь. Однако Web-сайт также допускается редактировать и непосредственно через HTTP или FTP (File Transfer Protocol – протокол передачи файлов). Такой подход иногда удобен, когда требуется “вживую” выполнять редактирование Web-сайта на каком-то удалённом Web-сервере. С другой стороны он влечёт за собой дополнительные накладные расходы. Конечно, редактировать напрямую сам производственный сервер не следует никогда, поскольку такие изменения являются автоматическими и необратимыми. Вместо этого лучше ограничивать свои изменения только тестовыми серверами.
  4. Язык. Этот параметр позволяет указывать язык программирования.NET, который будет использоваться для написания кода Web-сайта. Выбираемый язык становится просто языком по умолчанию для проекта. Это означает, что разработчик может явно добавлять Web-страницы, написанные на Visual Basic, к Web-сайту на C# и наоборот (что было невозможно в предыдущих версиях VS).

Чтобы не вводить путь размещения файлов вручную, можно щёлкнуть на кнопке Browse (Обзор), что приведёт к открытию диалогового окна Choose Location (Выбор папки). Вдоль левой стороны этого окна будут отображаться четыре кнопки, позволяющие выбирать различные варианты размещения файлов:

  • File System (Файловая система). Это самый простой вариант, поскольку он подразумевает просто просмотр дерева дисков и каталогов или общих ресурсов, отображаемых другими компьютерами в сети, и выбор подходящего каталога. При желании создать новый каталог нужно всего лишь щёлкнуть на пиктограмме Create New Folder (Создать новую папку), которая отображается в правом верхнем углу дерева каталогов. (Заставить Visual Studio создать новый каталог ещё также можно и путём добавления имени нового каталога в конце пути.)
  • Local IIS (Локальный веб-сервер IIS). Этот вариант позволяет просматривать виртуальные каталоги, которые делает доступными предоставляющее Web-хостинг программное обеспечение IIS, при условии, конечно, что таковое установлено на данном компьютере. Более подробно о виртуальных каталогах и способах их создания с помощью IIS Manager (Диспетчер IIS) будет рассказываться в отдельной статье. Наиболее впечатляет то, что виртуальные каталоги также можно создавать, не покидая Visual Studio. Все, что для этого требуется, это просто выбрать узел Default Web Site (Web-сайт по умолчанию) и затем щёлкнуть на пиктограмме Create New Web Application (Создать новое Web-приложение) в правом верхнем углу дерева виртуальных каталогов.
  • FTP Site (FTP-узел). Этот вариант является не таким удобным, как поиск нужного каталога, поскольку предполагает ввод всей информации, которая необходима для установки соединения, а именно: имени FTP-сайта, номера порта, названия каталога, имени пользователя и пароля.
  • Remote Web Site (Удалённый веб-узел). Этот вариант позволяет получать доступ к определённому Web-сайту с определённым URL-адресом по протоколу HTTP. Чтобы он работал, на Web-сервере, к которому требуется получить доступ, должен быть установлен компонент FrontPage Extensions. Вдобавок, при подключении потребуется ввести имя пользователя и пароль.

На рис. 3 показаны все перечисленные варианты размещений.

Рис. 3. Выбор размещения Web-сайта

После того, как вы сделаете свой выбор и щёлкните на кнопке Open (Открыть) , Visual Studio вернёт Вас в диалоговое окно New Web Site. Щёлкните на кнопке OK, и Visual Studio создаст новое Web-приложение. Изначально новый Web-сайт будет состоять из трёх файлов (рис. 4): файла главной Web-страницы (Default.aspx) , файла её исходного кода (Default.aspx.cs) и конфигурационного файла web.config .

Рис. 4. Обозреватель решений

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

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

  • Она упрощает сам процесс разработки. Требуется просто скопировать все файлы из каталога Web-сайта на Web-сервер: нет никаких ни проектных, ни отладочных файлов, которых следовало бы избегать.
  • Она упрощает управление файлами. При желании удалить страницу, можно просто удалить ассоциируемые с нею файлы с помощью любой предпочитаемой программы для управления файлами. При желании добавить новую страницу или перенести какую-нибудь страницу из одного Web-сайта в другой, необходимо опять-таки лишь скопировать ассоциируемые с нею файлы: ни иметь дело с Visual Studio, ни редактировать файл проекта не требуется. Из-за отсутствия файла проекта, о котором нужно было бы заботиться, в Web-страницы даже авторские коррективы можно вносить другими средствами.
  • Она упрощает совместную командную работу. Разные люди могут по отдельности работать над разными Web-страницами, и блокировать никакие проектные файлы при этом не требуется.
  • Она упрощает отладку. В случае, когда создаётся Web-проект, при изменении даже одной единственной страницы заново необходимо компилировать всё приложение. В случае беспроектной разработки каждая страница компилируется отдельно, причём только тогда, когда запрашивается впервые.
  • Позволяет смешивать языки Поскольку каждая Web-страница компилируется отдельно, разработчик волен писать код для своих страниц на разных языках. В случае проектной разработки, ему для этого придётся создавать либо отельные Web-проекты (что усложнит управление), либо отдельные проекты библиотеки классов.

Разработка, основанная на проектах

При создании Web-проекта Visual Studio генерирует ряд дополнительных файлов, включая пользовательские файлы проекта с расширением.csproj, а также файл решения с расширением.sln. При компоновке приложения Visual Studio генерирует временные файлы, которые размещает в подкаталоге obj, и один или более.pdb-файлов с отладочными символами, которые размещает в подкаталоге bin. Ни один из этих файлов не должен развёртываться на Web-сервере, когда Web-приложение будет готово. Более того, также не должны развёртываться и файлы исходного кода на C# (файлы с расширением.cs), поскольку Visual Studio предварительно компилирует их в DLL-сборку.

К числу наиболее важных преимуществ Web-проектов относятся перечисленные ниже:

  • Система проектной разработки является более чёткой, чем система беспроектной разработки. Всё дело в том, что в файле проекта явно перечисляются все файлы, которые должны входить в этот проект. Это позволяет перехватывать вероятные ошибки (вроде недостающих файлов) и даже анализировать возможные варианты атак (вроде добавления злонамеренным пользователем нежелательных файлов).
  • Web-проекты предусматривают больше возможностей для управления файлами. Одним из примеров может служить случай, когда создаётся несколько проектов, и все они размещаются в подкаталогах внутри одного и тоже же виртуального каталога. В таком сценарии получается, что файлы хранятся отдельно для целей разработки, но при этом по сути всё равно являются частью одного и того же приложения для развёртывания. В случае беспроектной разработки возможности размещать файлы отдельно в таких подкаталогах не существует.
  • Web-проекты предусматривают возможность настройки процесса развёртывания. Файлы проектов Visual Studio работают с утилитой MSBuild, которая позволяет настраивать и автоматизировать процесс компиляции проекта, а также управлять генерируемой для Web-приложения сборкой, присваивая ей подходящее имя, добавляя в неё подпись и т.д.
  • Web-проекты работают лучше в некоторых сценариях миграции. По этой причине ASP.NET автоматически преобразовывает Web-проекты Visual Studio .NET 2003 в Web-проекты Visual Studio 2008. Это преобразование требует внесения в страницы меньшего количества изменений.

Доступные функциональные возможности ASP.NET как при беспроектной, так и при основанной на проектах разработке выглядят одинаково. Более того, показатели производительности и в том, и в другом случае тоже ничем не отличаются. Так какой же тогда вариант лучше выбирать при создании нового Web-сайта ASP.NET? У каждого подхода имеются свои сторонники. Официально Microsoft рекомендует пользоваться более простой моделью Web-сайта во всех случаях, кроме тех, когда существует серьёзная причина использовать всё-таки именно Web-проект.

Создание Web-проекта

Cначала необходимо открыть Microsoft Visual Studio 2008: Start (Пуск) ->All programs (Все программы) -> Microsoft Visual Studio 2008 ->Microsoft Visual Studio 2008 . В результате будет открыта MS VS 2008.

После чего Вам необходимо выбрать в меню File (Файл) пункт New (Создать) -> Project… (Проект…) – см. рис. 5.

После этого Visual Studio отобразит диалоговое окно New Project (Создать проект) . В нём необходимо развернуть в дереве Project Types (Типы проектов) узел Visual C# ->Web и выбрать элемент ASP.NET Web Application (Веб-приложение ASP.NET) как показано на рис. 6.

Рис. 5. Создание нового веб-проекта

Рис. 6. Диалоговое окно Создать проект

Далее нужно указать место размещения, либо в виде пути к файлу, либо в виде URL-адреса, указывающего на локальный или удалённый Web-сервер IIS, а также имя проекта, которое затем будет использовано для создания в выбранном месте размещения соответствующего подкаталога (или виртуального каталога, если применяется URL-адрес). Как и при создании беспроектного Web-сайта, с помощью списка, отображаемого в правом верхнем углу окна, можно изменить целевую версию.NET Framework.

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


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

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

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

Итак, как же выглядит веб сервис для разработчика? Первое – файл web-сервиса имеет расширение asmx. Второе – создание web-сервиса немногим отличается от создания веб-формы в.NET Framework. Третье – файл веб сервиса должен начинаться с директивы WebService. Четвертое – класс web-сервиса может (но не должен) быть потомком класса System.Web.Services.Webservice. Ну и последнее (пока что) – метод, вызываемый через веб, должен имет атрибут WebMethod.

Основываясь на вышесказанном начнем реализовывать веб сервис (все примеры в этой главе основаны на codebehind и сделаны с помощью Visual Studio.NET).

Создадим новое приложение в VS.NET и добавим к нему файл веб сервиса nw.asmx (ну или откроем notepad и создадим 2 файла – nw.asmx и nw.asmx.cs).

Файл nw.asmx содержит единственную строку – директиву WebService, которая утверждает, что этот файл – действительно веб сервис. Этот файл меняться не будет, так что можете взглянуть на него и пока забыть:).

<%@ WebService Language="c#" Class="WebServicesExample.nw" %>

Весь код веб сервиса будет располагаться в codebehind файле nw.asmx.cs. Изначально этот файл (созданный в Visual Studion.NET) имеет следующий вид:

Using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; namespace WebServicesExample { ///

/// Summary description for nw. /// public class nw: System.Web.Services.WebService { public nw() { //CODEGEN: This call is required by the ASP.NET Web Services Designer InitializeComponent(); } #region Component Designer generated code //Required by the Web Services Designer private IContainer components = null; /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { } /// /// Clean up any resources being used. /// protected override void Dispose(bool disposing) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion // WEB SERVICE EXAMPLE // The HelloWorld() example service returns the string Hello World // To build, uncomment the following lines then save and build the project // To test this web service, press F5 // // public string HelloWorld() // { // return "Hello World"; // } } }

Как видите ребята из Microsoft сразу же позаботились о начинающих программистах и лишили работы многие поколения учителей, жутко любивших начинать свои рассказы с крика «Hello, World!»:). Теперь вы сами не прилагая никаких усилий можете создать этот код просто откомментировав объявление метода HelloWorld() :).

Ну что ж, сделаем это (зря, что ли ребята старались? :) и запустим, предварительно откомпилировав проект, на выполнение наш веб сервис (откроем в браузере страницу http://localhost/WebServicesExample/nw.asmx). В браузере нарисуется вот такая страница:


ASP.NET для отображения web-сервиса использует файл шаблона DefaultWsdlHelpGenerator.aspx, расположенный в папке %SYSTEM_ROOT%\Microsoft.NET\Framework\<номер версии Microsoft .NET Framework>\CONFIG. На выводимой странице веб сервиса есть название веб сервиса (отмечено 1), ссылка на описание сервиса (2) (эта ссылка в дальнейшем будет интересовать нас при создании клиентов к веб сервису) и список веб методов, объявленных в веб сервисе (3). Остальная часть страницы посвящена тому, как плохо использовать неймспейс по умолчанию для веб сервиса, и рекомендациям срочно исправить это упущение:). Нет проблем и пока это свежо у нас в памяти поступим как рекомендуют – добавим атрибут WebService с параметром Namespace к классу веб сервиса:

Итак, перейдем к странице описания web-метода SayHello (просто кликните по ссылке SayHello на странице описания web-сервиса).


Как видите на ней также присутствует название веб сервиса, ссылка на первую страницу веб сервиса, название веб метода. Кроме этого на странице расположена форма, предназначеная для вызова web метода через GET запрос (данное правило не выполняется, если web метод не может быть вызван таким образом) и примеры запросов для вызова данного веб метода с помощью SOAP, HTTP POST (если такой вызов возможен) и HTTP GET (если такой вызов возможен). Также представлены примеры ответов вызова web метода.

При желании вы можете сейчас протестировать метод нажав на кнопку Invoke (у меня уже такого желания нет:)). Лучше перейдем к созданию более полезных веб методов.

Я долго думал какой же веб метод предложить первым для изучения. Что-то простое, возвращающее единственное значение, или помонструозней да с DataSetами? И решил все таки в первом же примере показать как можно больше возможностей веб сервисов.

Итак, задача – торговая фирма, имеющая БД со всеми необходимыми ей для работы данными (ну как тут без Northwind обойтись:)), открывает филиал в другом районе/городе/конце земного шара. При этом возникает естесственная потребность работникам филиала обеспечить доступ к БД фирмы. Но вокруг одни ограничения – база централизована и копию создавать нельзя, а в филиале вообще всего пара компьютеров, которые только и могут, что выйти в интернет. Но работать им как-то с базой все таки надо... :). Хотя бы иметь возможность получать заказы по указанным клиентам.

Задача поставлена, теперь необходимо ее реализовывать. Для начала мы создадим веб сервис, возвращающий DataSet с заказами указанного клиента, а потом напишем 2 клиента для этого веб сервиса, один на DHTML для IE, второй на ASP.NET (через некоторое время филиал все таки разбогател и купил себе компьютер для веб сервера:)).

Для получения интересующих нас данных мы будем использовать несколько измененную хранимую процедуру CustOrdersOrders:

CREATE PROCEDURE CustOrdersOrdersDetails @CustomerID nchar(5) AS SELECT OrderID, OrderDate, RequiredDate, ShippedDate FROM Orders WHERE CustomerID = @CustomerID ORDER BY OrderID SELECT Products.ProductName, .UnitPrice, .Quantity, .Discount, .OrderID FROM INNER JOIN Products ON .ProductID = Products.ProductID where OrderID in (SELECT OrderID FROM Orders WHERE CustomerID = @CustomerID)

Веб метод, возвращающий данные по выбранному клиенту, имеет следующий вид:

Public DataSet GetCustOrders(string CustomerID) { SqlConnection myConn = new SqlConnection("server=localhost;database=Northwind;uid=sa;pwd=Manowar"); SqlDataAdapter myData = new SqlDataAdapter("CustOrdersOrdersDetails", myConn); myData.SelectCommand.CommandType = CommandType.StoredProcedure; myData.SelectCommand.Parameters.Add(new SqlParameter("@CustomerID", SqlDbType.Char, 5)); myData.SelectCommand.Parameters["@CustomerID"].Value = CustomerID; DataSet ds = new DataSet(); myData.Fill(ds); ds.Tables.TableName = "Orders"; ds.Tables.TableName = "OrderDetails"; ds.Relations.Add(ds.Tables.Columns["OrderID"], ds.Tables.Columns["OrderID"]); return ds; }

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

Протестируем нашу работу с помощью страницы веб сервиса. Откройте в браузере страницы веб сервиса (у меня это http://localhost/WebServicesExample/nw.asmx), нажмите на GetCustOrders для перехода с странице веб метода, введите в поле ввода ID клиента из базы Northwind (например ALFKI) и нажмите кнопку Invoke. Откроется новая страница, содержащая в себе XML. Это и есть результат вызова нашего веб метода – необходимый нам DataSet со списком заказов клиента ALFKI. Ниже представлены фрагменты страницы с результатами.

10643 1997-08-25T00:00:00.0000000+03:00 1997-09-22T00:00:00.0000000+03:00 1997-09-02T00:00:00.0000000+03:00 10692 1997-10-03T00:00:00.0000000+03:00 1997-10-31T00:00:00.0000000+02:00 1997-10-13T00:00:00.0000000+03:00 Rössle Sauerkraut 45.6 15 0.25 10643 Chartreuse verte 18 21 0.25 10643

Рассмотрим повнимательней что же нам верноул веб метод.

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

  • Возвращаемый результат имеет тип DataSet (это видно как из названия корневого узла, так и из строки в описании схемы).
  • Возвращаемый DataSet содержит 2 таблицы – Orders и OrderDetails.
  • В схеме доступна полная онформация о таблицах, а также запись о созданном нами отношении между таблицами.

Конечно же, если бы нам для вызова web-метода приходилось заходить на страницу его описания, вручную задавать параметры вызова web-метода и вызывать его, толку от этого было бы мало. Как я уже говорил, web-методы можно вызывать с помощью HTTP GET, HTTP POST и SOAP запросов.

Сейчас мы рассмотрим возможности работы с созданным web-сервисом с помощью HTTP GET (или HTTP POST) из браузера Internet Explorer (тот самый случай, когда работники филиала нашей гипотетической фирмы не имеют ничего кроме компьютера с выходом в интернет), а также SOAP вызов с помощью небольшой программы, написанной на C#.

Как же это делается? Воспользуемся объектом Microsoft.XMLHTTP, позволяющим передавать и получать данные с помощью запросов GET или POST. Мы создаем запрос к соответствующему web-методу нашего web-сервиса, передаем (если необходимо) параметры и выводим на страницу полученный в ответ XML код, используя небольшой xsl-файл.

Ниже представлен код orders.xsl (предназначенного для отображения полученного результата) и DhtmlClient.htm (основного файла).

Order:
Date:
Ship:
Product:Price:Quantity:Discount:
Клиент

Откройте файл DhtmlClient.html в броузере, введите код клиента в поле ввода (ALFKI подойдет просто замечательно) и нажмите кнопку «Заказы». JavaScript метод getOrders() направит запрос через HTTP POST к веб методу и затем преобразует возвращенный результат с помощью таблицы стилей orders.xsl и выведет его на страницу (если вы хотите протестировать вызов веб метода через HTTP GET – откомментируйте первую строку метода и закомментируйте три последующих). При этом у вас получится страница, похожая на вот это:


Теперь рассмотрим вызов web-метода из.NET-приложения. Для вызова web-сервисов.NET-приложение использует прокси-класс, генерируемый либо с помощью утилиты командной строки wsdl, либо с помощью добавления Web Reference в проект Visual Studio .NET. Прокси-класс, генерируемый таким образом, содержит довольно много кода. Но для нас представляет ценность то, что в нем содержатся методы для вызова интересующих нас web-методов.

Напишем небольшое Windows Forms приложение, вызывающее метод GetCustOrders нашего веб сервиса. В Visual Studio.NET создадим Windows приложение. Добавим в созданное приложение ссылку на web-сервис (меню Project – Add Web Reference…). В адресную строку открывшегося окна введем адрес нашего web-сервиса (http://localhost/WebServicesExample/nw.asmx):


После нажатия на кнопку Add Reference Visual Studio.NET добавит в проект ссылку на web-сервис и автоматически сгенерирует прокси-класс для вызова web-методов.

Тем, кто не пользуется Visual Studio.NET, создание прокси класса также не представляет особого труда. Для этого, как я уже говорил, используется утилита командной строки wsdl. Полное описание использования этой утилиты можно найти в MSDN, здесь же я только покажу вызов этой утилиты для генерации прокси класса для нашего веб сервиса.

Wsdl /l:cs http://localhost/WebServicesExample/nw.asmx

При этом будет создан файл nw.cs, содержащий небходимый нам прокси класс.

Продолжим создание Windows клиента для форума. Разместим на форме поле ввода для ввода кода клиента, DataGrid для отображения полученных данных и, естесственно, кнопку «Заказы». Для того, чтобы в DataGridе отобразились интересующие нас данные, в обработчик OnClick кнопки необходимо вставить всего 2 строки:

Private void btnOrders_Click(object sender, System.EventArgs e) { localhost.nw orders = new localhost.nw(); dgMain.DataSource = orders.GetCustOrders(txtClient.Text); }

Запустите созданное приложение, введите ALFKI в поле ввода и нажмите кнопку «Заказы». В DataGridе отобразится полученный в результате вызова DataSet с интересующими нас данными:


Как видите создание и использование web-сервисов в.NET не такая уж и сложная задача.

Теперь рассмотрим строение web-сервиса, что называется, шаг за шагом.

В первой (и единственной, если вы пишете с использованием технологии codebehind) строке asmx файла, как и в случае с aspx-файлом, расположена директива ASP.NET, указывающая на тип данного файла, язык, на котором написан код, и имя класса для файла. Например строка для написанного нами web-сервиса следующая:

<%@ WebService Language="c#" Class="WebServicesExample.nw" %>

где директива WebService указывает на то, что данный файл является web-сервисом, а атрибуты Language=”c#” и Class=”WebServicesExample.nw” указывают на то, что класс web-сервиса написан на C# и полное имя класса – WebServicesExample.nw.

Web-сервис может состоять из множества классов. Однако только один класс в web-сервисе может иметь методы, помеченные атрибутом WebMethod (которые можно вызывать через SOAP-запросы).

Атрибут WebMethod имеет шесть свойств, влияющих на работу web-метода. Рассмотрим их:

Description

Данное свойство служит для общего описания web-метода. Вы можете присвоить данному свойству любую текстовую строку. Значение свойства Description выводится на странице описания web-сервиса. Возвращаясь к рассмотренному ранее примеру опишем web-метод getAuthors следующим образом:

Public DataSet GetCustOrders(string CustomerID)

Откомпилируем наш проект и взглянем теперь на страницу описания web-сервиса:


Как видите, теперь под методом GetCustOrders выведено его описание.

EnableSession

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

Если при объявлении web-сервиса вы породили его от класса System.Web.Services.WebService, то вы автоматически получаете доступ к открытым свойствам Application, Context, Session, Server и User, имеющим такой же смысл, как и аналогичные свойства ASP.NET веб форм. Если же вы создавали класс web-сервиса как-то иначе – ничего страшного. Вы все равно можете получить доступ к вышеперечисленным свойствам с помощью соответствующих свойств статического HttpContext.Current.

Рассмотрим работу с объектами Application и Session на примере. Напишем небольшой web-сервис с двумя web-методами – setSessionVar (принимает 2 строковых параметра – имя переменной сессии и ее значение, и устанавливает переменную сессии) и getSessionVar (принимает строковый параметр – имя сессии, и возвращает значение переменной сессии):

Public void setSessionVar(string name, string val) { Session = val; } public string getSessionVar(string name) { return (string) Session; }

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

Чтобы.NET приложение могло работать с сессией с помощью web-сервиса, необходимо добавить в код, вызывающий методы web-сервиса, работу с cookie. И это не так уж сложно, как кажется на первый взгляд:).

Создадим Windows приложение, добавим в него Web Reference на созданный ранее web-сервис и добавим интерфейс для установки переменных сессии с помощью метода setSessionVar и получения значения переменной сессии с помощью getSessionVar. Объявим также в класс приватную переменную cookie типа CookieContainer (класс CookieContainer описан в модуле System.Net). В конструкторе класса проиницализируем эту переменную. Теперь для того, чтобы вызовы методов web-сервиса были в одной сессии, необходимо просто перед вызовом web-метода присвоить значение cookie свойству CookieContainer класса web-сервиса.

Полностью код вызова веб методов с использованием cookie представлен ниже (прокси-класс, сгенерированный для web-сервиса, имеет название localhost1.testService1):

Private CookieContainer cookie; public Form1() { InitializeComponent(); cookie = new CookieContainer(); } private void btnSetValue_Click(object sender, System.EventArgs e) { localhost.session session = new localhost.session(); session.CookieContainer = cookie; session.setSessionVar(txtSessionName.Text, txtSessionValue.Text); } private void btnGetValue_Click(object sender, System.EventArgs e) { localhost.session session = new localhost.session(); session.CookieContainer = cookie; txtSessionValue.Text = session.getSessionVar(txtSessionName.Text); }

MessageName

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

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

Допустим кроме веб метода GetCustOrders с одним параметром (код клиента) у нас объявлен еще один метод GetCustOrders, принимающий кроме кода клиента также вилку дат и возвращающий DataSet с информацией о заказах, дата которых находится между указанными датами

Public DataSet GetCustOrders(string CustomerID) { ... } public DataSet GetCustOrders(string CustomerID, DateTime startDate, DateTime endDate) { ... }

Теперь, хотя оба web-метода и имеют одинаковое имя, все равно есть возможность использовать страницу web-сервиса. При этом в прокси классе оба метода естесственно будут определены с именем GetCustOrders.

TransactionOption

Web-сервисы ограниченно поддерживают транзакции. С помощью свойства TransactionOption можно управлять тем, как ваш метод использует транзакции. Это свойство может принимать следующие значения:

Слово «ограниченно» означает, что веб сервис может порождать транзакцию, но при этом не может быть участником другой транзакции. Если вызывается веб метод с TransactionOption установленным в Required или RequiresNew, а в нем вызывается другой веб метод с такими же установками, каждый из этих методов инициирует свою транзакцию.

По умолчанию свойство TransactionOption установлено в Required.

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

CacheDuration

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

Ниже представлен пример обхъявления, кеширующий возвращаемое методом GetCustOrders значение на 10 минут.

Public DataSet GetCustOrders(string CustomerID)

BufferResponse

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

Для отключения буферизации результата используйте следующее объявление web-метода:

Public DataSet GetCustOrders(string CustomerID)

Параметры атрибута WebService

Web-сервис также имеет три свойства, влияющие на его работу. Два из них, Description и Name, работают точно так же, как и подобные им свойства Description и MessageName web-метода. Третье свойство, Namespace, позволяет управлять пространством имен в SOAP-сообщении. Рассмотрим применение всех трех свойств на примере web-сервиса wsauthors.

Изменим объявление web-сервиса на следующее:

Public class nw: System.Web.Services.WebService

после чего откомпилируем web-сервис и посмотрим на страницу описания:


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

И напоследок рассмотрим вопрос типов данных, которые может принимать в качестве параметров и возвращать веб метод.

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

Рассмотрим веб метод GetCustomer, возвращающий структуру Customer, содержащую информацию о клиенте. Для начала определим класс Customer

Public class Customer { private string id; private string companyName; private string address; public Customer() { } public Customer (string id, string companyName, string address) { this.id = id; this.companyName = companyName; this.address = address; } public string ID { get { return id; } set { id = value; } } public string CompanyName { get { return companyName; } set { companyName = value; } } public string Address { get { return address; } set { address = value; } } }

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

Теперь напишем веб метод, возвращающий переменную данного типа.

Public Customer GetCustomer(string CustomerID) { SqlConnection myConn = new SqlConnection("server=localhost;database=Northwind;uid=sa;pwd=Manowar"); SqlCommand myCmd = new SqlCommand("select CustomerID, CompanyName, Address from Customers " + "where CustomerID = "" + CustomerID + """, myConn); myConn.Open(); SqlDataReader reader = myCmd.ExecuteReader(); Customer customer; if(reader.Read()) customer = new Customer(reader.GetString(0), reader.GetString(1), reader.GetString(2)); else customer = new Customer(); reader.Close(); myConn.Close(); return customer; }

В результате вызова этого веб метода для многострадального клиента ALFKI будет возвращен следующий XML.

ALFKI Alfreds Futterkiste

Obere Str. 57

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

Изменим немного описание структуры Customer для иллюстрации сказанного. Теперь поле CustomerID, будет возвращаться как атрибут ID, а поле CompanyName поменяет свое название на Company.

Public class Customer { ... public string ID ... public string CompanyName ... }

Теперь в результате выполнения предыдущего web-метода через веб интерфейс будет получен следующий XML:

Alfreds Futterkiste

Obere Str. 57

Заключение

Веб сервисы представляют собой новый вид веб приложений для создания уровня бизнес логики и связи разнородных приложений с помощью использования общих стандартов – HTTP, XML и SOAP. Практически не существует ограничений на области применения веб сервисов: вы можете создавать веб сервисы для взаимодействия между различными приложениями или для предоставления данных вашим клиентам. Возможности использования веб сервисов теоретически ограничены только вашим воображением.

Текст примеров данной статьи можно выкачать

Запустите 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 и открыла его для редактирования. Первоначальное содержимое этого файла приведено в коде ниже:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAspNet45.Default" %>

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

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAspNet45.Default" %>

Привет!

Это новая веб-форма!

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

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

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

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

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

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

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

http://localhost:40035/Default.aspx

Запустив приложение, вы увидите похожий, но не идентичный 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# и откроет его для редактирования. Приведите содержимое этого файла в соответствие с кодом:

Namespace TestAspNet45 { public class GuestResponse { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public bool? WillAttend { get; set; } } }

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

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

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

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

Using System.Collections.Generic; namespace TestAspNet45 { public class ResponseRepository { private static ResponseRepository repository = new ResponseRepository(); private List responses = new List(); public static ResponseRepository GetRepository() { return repository; } public IEnumerable GetAllResponses() { return responses; } public void AddResponse(GuestResponse response) { responses.Add(response); } } }

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

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

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAspNet45.Default" %>

Новый год у Татьяны!

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

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

#rsvpform label { width: 120px; display: inline-block; } #rsvpform input { margin: 2px; margin-left: 4px; width: 150px; } #rsvpform select { margin: 2px 0; width: 154px; } button { margin-top: 15px; padding: 5px; }

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

... ...

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

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

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

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAspNet45.Default" %> ...

Это называется страничной директивой (или директивой 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, чтобы открыть его в редакторе; отобразится код, приведенный ниже:

Using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace TestAspNet45 { public partial class Default: System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } } }

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

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

Using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.ModelBinding; namespace TestAspNet45 { public partial class Default: System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { GuestResponse rsvp = new GuestResponse(); if (TryUpdateModel(rsvp, new FormValueProvider(ModelBindingExecutionContext))) { ResponseRepository.GetRepository().AddResponse(rsvp); if (rsvp.WillAttend.HasValue && rsvp.WillAttend.Value) { Response.Redirect("seeyouthere.html"); } else { Response.Redirect("sorryyoucantcome.html"); } } } } } }

Здесь за счет проверки свойства 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-файла. Приведите содержимое нового файла в соответствие с примером ниже:

Увидимся на вечеринке!

Увидимся на вечеринке! ;)

Приходите в 9 вечера. Маски являются обязательными!

Повторите описанный процесс для создания файла 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-формы. В примере ниже показано, как скорректировать проблему:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAspNet45.Default" %>

Новый год у Татьяны!

Мы устроим классную вечеринку и вы приглашены!

runat="server" />
runat="server" />
runat="server" />

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

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

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

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

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Summary.aspx.cs" Inherits="TestAspNet45.Summary" %> <%@ Import Namespace="TestAspNet45" %>

Приглашения

<% var yesData = ResponseRepository.GetRepository().GetAllResponses() .Where(r => r.WillAttend.Value); foreach (var rsvp in yesData) { string htmlString = String.Format("", rsvp.Name, rsvp.Email, rsvp.Phone); Response.Write(htmlString); } %>
Имя Email Телефон
{0}{1}{2}

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

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

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

<%@ Import Namespace="TestAspNet45" %>

Фрагмент кода с открывающим дескриптором <%@ представляет собой директиву. Директивы позволяют выполнять действие, оказывающее влияние на веб-форму целиком. В данном случае была создана директива Import, которая помещает в область видимости пространство имен из проекта, что дает возможность ссылаться на классы, указывая только их имена.

Почему мы заботимся о пространствах имен? Поскольку второй фрагмент кода в примере выше является блоком кода C#, который будет выполнен при запросе страницы, ссылка на классы без снабжения их пространствами имен упрощает код. Открывающий дескриптор для блока кода выглядит просто как <% и не включает каких-либо дополнительных символов. (Закрывающий дескриптор для всех разновидностей фрагментов кода - всегда %>.)

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

string htmlString = String.Format("{0}{1}{2}", rsvp.Name, rsvp.Email, rsvp.Phone);

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

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

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

Table, td, th { border: thin solid black; border-collapse: collapse; padding: 5px; background-color: lemonchiffon; text-align: left; margin: 10px 0; }

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

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

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

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

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

Using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; namespace TestAspNet45 { public partial class Summary: System.Web.UI.Page { protected string GetNoShowHtml() { StringBuilder html = new StringBuilder(); var noData = ResponseRepository.GetRepository() .GetAllResponses().Where(r => !r.WillAttend.Value); foreach (var rsvp in noData) { html.Append(String.Format("{0}{1}{2}", rsvp.Name, rsvp.Email, rsvp.Phone)); } return html.ToString(); } } }

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Summary.aspx.cs" Inherits="TestAspNet45.Summary" %> <%@ Import Namespace="TestAspNet45" %>

Приглашения

Люди которые были приглашены:

Люди которые не придут:

<%= GetNoShowHtml()%>
Имя Email Телефон

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

Выполнение проверки достоверности

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

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

Using System.ComponentModel.DataAnnotations; namespace TestAspNet45 { public class GuestResponse { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public bool? WillAttend { get; set; } } }

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

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

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAspNet45.Default" %>

Новый год у Татьяны!

Мы устроим классную вечеринку и вы приглашены!

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

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

... #validationSummary { color: red; }

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

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

... ...

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

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

Using System.ComponentModel.DataAnnotations; namespace TestAspNet45 { public class GuestResponse { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public bool? WillAttend { get; set; } } }

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

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