Asp семейство application contents


Содержание

ASP Application Object

A group of ASP files that work together to perform some purpose is called an application. The Application object in ASP is used to tie these files together.

Application Object

An application on the Web may be a group of ASP files. The ASP files work together to perform some purpose. The Application object in ASP is used to tie these files together.

The Application object is used to store and access variables from any page, just like the Session object. The difference is that ALL users share one Application object, while with Sessions there is one Session object for EACH user.

The Application object should hold information that will be used by many pages in the application (like database connection information). This means that you can access the information from any page. It also means that you can change the information in one place and the changes will automatically be reflected on all pages.

Store and Retrieve Application Variables

Application variables can be accessed and changed by any page in the application.

You can create Application variables in «Global.asa» like this:

In the example above we have created two Application variables: «vartime» and «users».

You can access the value of an Application variable like this:

Loop Through the Contents Collection

The Contents collection contains all application variables. You can loop through the Contents collection, to see what’s stored in it:

If you do not know the number of items in the Contents collection, you can use the Count property:

Loop Through the StaticObjects Collection

You can loop through the StaticObjects collection, to see the values of all objects stored in the Application object:

Lock and Unlock

You can lock an application with the «Lock» method. When an application is locked, the users cannot change the Application variables (other than the one currently accessing it). You can unlock an application with the «Unlock» method. This method removes the lock from the Application variable:

Ektron CMS400.NET Version 7.6 delivers all of the flexibility and features you need to deploy the Web site you want, quickly and efficiently.

6 ways to take your site to the next level with Ektron:

Create site stickiness through social networking. Keep it personal, relevant and interactive and they’ll come back for more.
Keep it open. Your site needs to be ready and able to connect to outside services. Ektron’s open API gives you maximum flexibility.
Streamline content and document management. Users need to quickly and intuitively find and add information.
Empower your content authors. Reduce IT bottlenecks by allowing business users to create and edit Web content and forms.
Climb to the top of search rankings. SEO tools, URL aliasing and eCommerce for your digital marketing strategy
Add powerful Web 2.0 tools like blogs, wikis, forums, geo-mapping, rating systems and RSS feeds easily.
See why there are 20,000+ Ektron integrations worldwide.
Request an INSTANT DEMO or download a FREE TRIAL today.
WEB HOSTING
Dynamic button image generation
$15 Domain Name
Registration
Save $20 / year!
Buy UK Domain Names
Register Domain Names
Cheap Domain Names
Cheap Web Hosting
Best Web Hosting
PHP MySQL Hosting
Top 10 Web Hosting
UK Reseller Hosting
Web Hosting
FREE Web Hosting
WEB BUILDING
Website Templates
Flash Templates
Website Builder
Internet Business Opportunity
Custom Programming
FREE Trial or Demo
Web Content Manager
Forms,Web Alerts,RSS
Download XML editor
FREE Flash Website
FREE Web Templates
EDUCATION
US Web Design Schools
HTML Certification
JavaScript Certification
XML Certification
PHP Certification
ASP Certification

W3Schools is for training only. We do not warrant the correctness of its content. The risk from using it lies entirely with the user.
While using this site, you agree to have read and accepted our terms of use and privacy policy.
Copyright 1999-2009 by Refsnes Data. All Rights Reserved.

Одностраничные приложения: создание современных адаптивных веб-приложений с помощью ASP.NET

Продукты и технологии:

Single-Page Applications (SPA), ASP.NET Web API, Knockout.js, Ember.js, AJAX и HTML5

В статье рассматриваются:

  • создание уровня сервисов и веб-клиента AJAX для приложения-примера;
  • шаблоны MVC и MVVM;
  • связывание с данными;
  • создание веб-клиента с применением Knockout.js;
  • создание веб-клиента с применением Ember.js.

Одностраничные приложения (Single-Page Applications, SPA) — это веб-приложения, которые загружают одну HTML-страницу и динамически обновляют ее при взаимодействии с пользователем.

SPA используют AJAX и HTML5 для создания гибких и адаптивных веб-приложений без постоянных перезагрузок страницы. Однако это означает, что большая часть работы возлагается на клиентскую сторону, а именно на JavaScript-код. Разработчику для традиционной ASP.NET может быть трудно совершить такой кульбит. К счастью, существует множество JavaScript-инфраструктур с открытым исходным кодом, которые облегчают создание SPA.

В этой статье я пошагово пройду процесс создания простого SPA-приложения. Попутно вы ознакомитесь с некоторыми фундаментальными концепциями создания SPA, в том числе с шаблонами Model-View-Controller (MVC) и Model-View-ViewModel (MVVM), связыванием с данными и маршрутизацией (routing).

О приложении-примере

Я создал приложение-пример для операций с простой базой данных по фильмам (рис. 1). В крайнем слева столбце страницы отображается список жанров. Выбор жанра приводит к появлению списка соответствующих фильмов. Кнопка Edit рядом с записью позволяет изменять эту запись. После редактирования можно щелкнуть кнопку Save для передачи обновления на сервер или кнопку Cancel для отмены изменений.

Рис. 1. SPA-приложение для базы данных по фильмам

Я создал две версии этого приложения: одна из них использует библиотеку Knockout.js, а другая — библиотеку Ember.js. Эти две библиотеки основаны на разных подходах, поэтому будет весьма поучительно сравнить их. В обоих случаях клиентское приложение не требовало более 150 строк JavaScript-кода. На серверной стороне я задействовал ASP.NET Web API, чтобы обслуживать JSON для клиента. Исходный код обеих версий вы найдете на github.com/MikeWasson/MoviesSPA.

(Примечание Я создавал приложение, используя RC-версию Visual Studio 2013. В RTM-версии некоторые вещи могли измениться, но они не должны повлиять на код.)

Обзор

В традиционном веб-приложении при каждом вызове сервера тот осуществляет рендеринг новой HTML-страницы. Это вызывает обновление страницы в браузере. Если вы когда-нибудь писали приложение Web Forms или PHP, этот жизненный цикл страниц должен быть знаком вам.

В SPA после загрузки первой страницы все взаимодействие с сервером происходит через AJAX-вызовы. Эти AJAX-вызовы возвращают данные (не разметку) — обычно в формате JSON. Приложение использует JSON-данные для динамического обновления страницы без ее перезагрузки. Рис. 2 иллюстрирует разницу между этими двумя подходами.

Рис. 2. Сравнение традиционного жизненного цикла страницы с жизненным циклом в SPA

HOME or Top of Page Printer Friendly
Traditional Page Lifecycle Традиционный жизненный цикл страницы
Client Клиент
Page Reload Перезагрузка страницы
Server Сервер
Initial Request Начальный запрос
HTML HTML
Form POST Передача формы командой POST
SPA Lifecycle Жизненный цикл в SPA
AJAX AJAX
JSON JSON

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

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

В чистом SPA все UI-взаимодействие происходит на клиентской стороне через JavaScript и CSS. После начальной загрузки страницы сервер действует исключительно как уровень сервисов. Клиенту нужно просто знать, какие HTTP-запросы он должен посылать. Ему не важно, как сервер реализует свою часть.

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

Создание проекта в Visual Studio

В Visual Studio 2013 есть один тип проекта ASP.NET Web Application. Мастер этого проекта позволяет выбрать ASP.NET-компоненты, которые будут включены в проект. Я начал с шаблона Empty, а затем добавил в проект ASP.NET Web API, установив флажок Web API в разделе Add folders and core references for, как показано на рис. 3.

Рис. 3. Создание нового ASP.NET-проекта в Visual Studio 2013

В новом проекте есть все библиотеки, необходимые для Web API, а также кое-какой конфигурационный код Web API. Я не вводил никаких зависимостей от Web Forms или ASP.NET MVC.

Обратите внимание на рис. 3, что Visual Studio 2013 включает шаблон Single Page Application. Этот шаблон устанавливает скелет SPA-приложения, основанный на Knockout.js. Он поддерживает вход с применением базы данных с информацией о членстве в группах или с помощью внешнего провайдера аутентификации. Я не стал использовать этот шаблон в своем приложении, потому что хотел показать более простой пример с нуля. Шаблон SPA — отличный ресурс, особенно если вам нужно добавить аутентификацию в приложение.

Создание уровня сервисов

Я использовал ASP.NET Web API, чтобы создать простой REST API для приложения. Не буду здесь вдаваться в детали Web API — подробности вы можете прочитать по ссылке asp.net/web-api.


Сначала я создал класс Movie, представляющий фильм. Этот класс делает две вещи:

  • сообщает Entity Framework (EF), как создавать таблицы базы данных для хранения информации о фильмах;
  • сообщает Web API, как форматировать полезные данные JSON.

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

Затем я воспользовался технологией scaffolding в Visual Studio для создания контроллера Web API, который задействует EF в качестве уровня данных. Чтобы применить эту технологию, щелкните правой кнопкой мыши папку Controllers в Solution Explorer и выберите Add | New Scaffolded Item. В мастере Add Scaffold укажите Web API 2 Controller with actions, using Entity Framework, как показано на рис. 4.

Рис. 4. Добавление контроллера Web API

На рис. 5 приведен мастер Add Controller. Я присвоил контроллеру имя MoviesController. Имя имеет значение, так как URI для REST API основываются на имени контроллера. Я также установил флажок Use async controller actions, чтобы задействовать преимущества новой функциональности async в EF 6. Я выбрал класс Movie в качестве модели и указал New data context, чтобы создать новый контекст данных EF.

Рис. 5. Мастер Add Controller

Мастер добавляет два файла:

  • MoviesController.cs — определяет контроллер Web API, который реализует REST API для приложения;
  • MovieSPAContext.cs — это в основном склеивающий слой EF, который предоставляет методы для запроса нижележащей базы данных.

В табл. 1 показан REST API по умолчанию, создаваемый технологией scaffolding.

Табл. 1. REST API по умолчанию, созданный технологией scaffolding из Web API

HTTP-команда URI Описание
GET /api/movies Получить список всех фильмов
GET /api/movies/ Получить фильм с идентификатором, равным
PUT /api/movies/ Обновить фильм с идентификатором, равным
POST /api/movies Добавить новый фильм в базу данных
DELETE /api/movies/ Удалить фильм из базы данных

Значения в фигурных скобках являются заменителями для подстановки. Например, чтобы получить фильм с идентификатором, равным 5, URI должен выглядеть так: /api/movies/5.

Я расширил этот API, добавив метод, который находит все фильмы указанного жанра:

Клиент указывает жанр в строке запроса URI. Например, чтобы получить все фильмы жанра Drama, клиент посылает GET-запрос на /api/movies?genre=drama. Web API автоматически связывает параметр запроса с параметром genre в методе GetMoviesByGenre.

Создание веб-клиента

До сих пор я просто создавал REST API. Если вы отправите GET-запрос на /api/movies?genre=drama, исходный HTTP-ответ будет выглядеть так:

Теперь мне нужно написать клиентское приложение, которое делает с этим что-то осмысленное. Базовый рабочий процесс такой:

  • UI инициирует AJAX-запрос;
  • обновляем HTML для отображения полезных данных ответа;
  • обрабатываем AJAX-ошибки.

Вы могли закодировать все это вручную. Например, вот некоторый jQuery-код, который создает список названий фильмов:

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

Решение заключается в том, чтобы использовать JavaScript-инфраструктуру. К счастью, их выбор довольно велик, и эти инфраструктуры имеют открытый исходный код. К некоторым из более популярных инфраструктур относятся Backbone, Angular, Ember, Knockout, Dojo и JavaScriptMVC. Большинство использует вариации шаблонов MVC или MVVM, поэтому будет полезно вкратце рассмотреть эти шаблоны.

Шаблоны MVC и MVVM

Корни шаблона MVC уходят в 80-е годы прошлого века и связаны с ранними графическими UI. Цель MVC — разбиение кода на три уровня со своими обязанностями (рис. 6). Вот что они делают:

  • модель представляет данные и бизнес-логику предметной области;
  • представление отображает модель;
  • контроллер принимает пользовательский ввод и обновляет модель.

Рис. 6. Шаблон MVC

View View
Controller Controller
Model Model
User Input Пользовательский ввод
Updates Обновления
Modifies Модифицирует

Более современная вариация MVC — шаблон MVVM (рис. 7). В шаблоне MVVM:

  • модель по-прежнему представляет данные предметной области;
  • модель представления — это абстрактное отражение представления;
  • представление отображает модель представления и посылает пользовательский ввод модели представления.

Рис. 7. Шаблон MVVM

View Model View Model

В JavaScript-инфраструктуре MVVM представлением является разметка, а моделью представления — код.

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

Создание веб-клиента с применением Knockout.js

Для первой версии своего приложения я использовал библиотеку Knockout.js. Knockout следует шаблону MVVM, соединяя представление и модель представления через связывание с данными.

Чтобы создать привязки данных, вы добавляете к HTML-элементам специальный атрибут data-binding. Например, следующая разметка связывает элемент span со свойством genre в модели представления. Всякий раз, когда изменяется значение genre, Knockout автоматически обновляет HTML:

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

Удобно, что связывание с данными осуществляется декларативно. Вам не требуется подключать модель представления к элементам HTML-страницы. Просто добавьте атрибут data-binding, и Knockout сделает остальное.

Я начал с создания HTML-страницы с базовой разметкой без связывания с данными, как показано на рис. 8.

Рис. 8. Начальная HTML-разметка

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

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

Наблюдаемые объекты (observables) занимают центральное место в системе связывания с данными в Knockout. Наблюдаемым является объект, который хранит какое-то значение и может уведомлять подписчиков об изменении этого значения. Следующий код преобразует JSON-представление фильма в эквивалентный объект с наблюдаемыми полями:

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

Рис. 9. Модель представления

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


Функция getByGenre выдает AJAX-запрос серверу на получение списка фильмов, а затем заполняет результатами массив self.movies.

При использовании REST API одна из самых хитрых частей — обработка асинхронной природы HTTP. jQuery-функция ajax возвращает объект, реализующий Promises API. Вы можете задействовать метод then объекта Promise, чтобы установить обратный вызов, инициируемый, когда AJAX-вызов завершается успешно, и еще один обратный вызов, запускаемый при неудачном AJAX-вызове:

Привязки данных

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

Атрибут data-bind содержит одно или более объявлений привязок, где каждая привязка имеет форму «привязка: выражение». В этом примере привязка foreach сообщает Knockout перебирать в цикле содержимое массива genres в модели представления. Для каждого элемента в массиве Knockout создает новый элемент
. Привязка text в присваивает text в span значение элемента массива, каковой в данном случае является названием жанра.

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

Это связывает событие щелчка с функцией getByGenre в модели представления. Здесь нужно было использовать $parent, так как эта привязка осуществляется в контексте foreach. По умолчанию привязки в foreach ссылаются на текущий элемент в цикле.

Чтобы отобразить список фильмов, я добавил привязки в таблицу, как показано на рис. 10.

Рис. 10. Добавление привязок в таблицу для отображения списка фильмов

На рис. 10 привязка foreach перебирает в цикле массив объектов movie. Внутри foreach привязки text ссылаются на свойства текущего объекта.

Привязка visible в элементе

контролирует, визуализируется ли таблица. Таблица будет скрыта, если массив movies пуст.

Наконец, вот привязки для сообщения об ошибке и сообщения «No records found» (заметьте, что вы можете помещать в привязку сложные выражения):

Редактирование записей

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

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

Чтобы отслеживать режим просмотра/редактирования, я добавил булев флаг в объект movie как наблюдаемое свойство:

Мне нужно было, чтобы таблица фильмов отображала текст, когда свойство editing равно false, но переключалась на элементы управления вводом, когда оно — true. Для этого я использовал Knockout-привязки if и ifnot, как показано на рис. 11. Синтаксис « » позволяет включать привязки if и ifnot без их размещения внутри элемента HTML-контейнера.

Рис. 11. Поддержка редактирования записей о фильмах

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

Я связал обработчики щелчка кнопок с функциями save, cancel и edit в модели представления.

Функция edit проста. Достаточно установить флаг editing в true:

Функции save и cancel немного посложнее. Для поддержки отмены мне нужен был какой-то способ кеширования исходного значения при редактировании. К счастью, Knockout упрощает расширение поведения наблюдаемых объектов. В коде на рис. 12 добавляется функция store в класс observable. Вызов функции store из observable придает этому классу две новые функции: revert и commit.

Рис. 12. Расширение ko.observable функциями revert и commit

Теперь я могу вызвать функцию store, чтобы добавить эту функциональность в модель:

Рис. 13 демонстрирует функции save и cancel в модели представления.

Рис. 13. Добавление функций save и cancel

Создание веб-клиента с применением Ember

Для сравнения я написал другую версию своего приложения, используя библиотеку Ember.js.

Ember-приложение начинает с таблицы маршрутизации (routing table), которая определяет навигацию пользователя в рамках приложения:

Первая строка кода создает Ember-приложение. Вызов Router.map создает три маршрута. Каждый маршрут соответствует URI или шаблону URI:

Для каждого маршрута вы создаете HTML-шаблон, используя библиотеку шаблонов Handlebars.

В Ember имеется шаблон верхнего уровня для всего приложения. Этот шаблон подвергается рендерингу для каждого маршрута. На рис. 14 показан шаблон application для моего приложения. Как видите, этот шаблон в основном является HTML-кодом, размещаемым в теге script с type=»text/x-handlebars». Шаблон содержит специальную разметку Handlebars в двойных фигурных скобках: << >>. Эта разметка служит той же цели, что и атрибут data-bind в Knockout. Например, <<#linkTo>> создает ссылку на маршрут.

Рис. 14. Шаблон Handlebars уровня приложения

Теперь допустим, что пользователь переходит к /#/about. Это активирует маршрут about. Ember сначала осуществляет рендеринг шаблона application верхнего уровня, затем шаблона about в <> шаблона application. Вот шаблон about:

На рис. 15 показано, как выполняется рендеринг шаблона about в шаблоне application.

Рис. 15. Рендеринг шаблона about

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

Контроллеры и модели в Ember

В Ember каждый маршрут имеет модель и контроллер. Модель содержит данные предметной области. Контроллер действует как прокси для модели и хранит все данные состояния приложения для представления. (Это не совпадает с классическим определением MVC. В некоторых отношениях контроллер больше похож на модель представления.)

Вот как я определил модель movie:

Контроллер наследует от Ember.ObjectController (рис. 16).

Рис. 16. Контроллер Movie наследует от Ember.ObjectController

Здесь происходит кое-что интересное. Во-первых, я не указывал модель в классе контроллера. По умолчанию маршрут автоматически устанавливает модель в контроллере. Во-вторых, функции save и cancel используют средства транзакций, встроенные в класс DS.Model. Для отмены изменений просто вызовите функцию rollback модели.

Ember использует массу соглашений по именованию для подключения различных компонентов. Маршрут genres взаимодействует с GenresController, который выполняет рендеринг шаблона genres. По сути, Ember будет автоматически создавать объект GenresController, если вы его не определили. Однако вы можете переопределять все, что предлагается по умолчанию.

В своем приложении я сконфигурировал маршрут genres/movies на использование другого контроллера, реализовав точку подключения (hook) renderTemplate. Тем самым несколько маршрутов может использовать один и тот же контроллер (рис. 17).

Рис. 17. Несколько маршрутов могут иметь общий контроллер

Одна из приятных особенностей Ember в том, что многое можно делать с помощью минимума кода. Мое приложение-пример состоит примерно из 110 строк кода на JavaScript. Эта версия короче, чем версия на основе Knockout, и вдобавок я безо всяких усилий получил поддержку истории браузера. С другой стороны, Ember также является весьма «своенравной» инфраструктурой. Если вы не пишете код в стиле Ember, то скорее всего попадете в неприятности. Так что при выборе инфраструктуры следует принимать во внимание набор функциональности, стиль кодирования и то, насколько общая архитектура инфраструктуры подходит под ваши требования.

Где узнать больше

В этой статье я показал, как JavaScript-инфраструктуры упрощают создание SPA. Попутно я рассказал о некоторых общих средствах этих библиотек, в том числе о связывании с данными, маршрутизации и шаблонах MVC и MVVM. Узнать больше о создании SPA с помощью ASP.NET можно по ссылке asp.net/single-page-application.


Майк Уоссон (Mike Wasson) — программист и технический писатель в Microsoft. Многие годы занимался документированием мультимедийной части Win32 API. В настоящее время пишет о ASP.NET с основным акцентом на Web API. С ним можно связаться по адресу mwasson@microsoft.com.

Выражаю благодарность за рецензирование статьи эксперту Microsoft Хиньяну Чу (Xinyang Qiu).

Asp семейство application contents

Вы можете использовать данный метод для того, чтобы сделать доступной информацию между всеми пользователями данного приложения. Основанное на ASP приложение определено как все .asp-файлы в виртуальной директории и всех ее поддиректориях. Из-за того, что объект Application может быть доступен («зашарен») более чем одному пользователю, то в нем предусотренно два метода — Lock и Unlock (заблокировать и разблокировать) для того, чтобы быть уверенным, что сразу несколько пользователей не смогут попытаться изменять свойства одновременно.

Синтаксис:

Application . метод

Коллекции:

Методы:

События:

Скрипты, которым могут предшествовать события должны быть описаны в файле global.asa. Для получения более полной информации по этому файлу смотрите описание Global.asa

Замечания:

Вы можете хранить свои значения в коллекциях данного объекта: Application.Contents и Application.staticObjects. Информация, сохраненная в коллекции Application доступны через приложение. Следующий скрипт демонстрирует запись двух типов переменных.

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

Вы можете также связать компонент с переменной. Если вы связываете сомпонент к переменной с помощью объекта Server.CreateObject, то переменная будет членом коллекции Application.Contents. Если переменная связана с тэгом , то переменная будет членом коллекции Application StaticObjects.

Если вы связываете конкретный компонент с переменной в коллекцией Application Contents Collection и используете Visual Basic Scripting Edition как основной язык написания скриптов, вы должны использовать ключевое слово Set. Это иллюстрированно следующим примером.

Вы можете также определить методы и свойства компонента MyComponent следующим скриптом

или путем создания локальной копии объекта и использования его следующим образом:

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

Вы не можете хранить встроенные объекты в объекте Application. Для примера, каждый из следующих строк будет вызывать ошибку:

Если вы храните массив в объекте Application то вы не должны пытаться обращаться к элементам, хранящимся в массиве напрямую. К примеру, следующий скрипт не работает

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

NumVisits для хранения числа посещений, когда страница была получена клиентом. Метод Lock вызывается тогда, когда есть возможность того, что к переменной NumVisits может возникнуть паралелльное обращение. Вызывая метод Unlock вы разрешаете обращаться к данной переменной (объекту Application) другим пользователям.

Коллекция Application. Contents

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

Синтакс:

Application.Contents( ключ )

Параметры:

ключ
Указанное имя элемента для его получения.

Замечание:

Коллекция Application.Contents содержит те элементы которые были определены на уровне приложения без использования тэга . Это касается обеих объектов — созданных с использованием Server.CreateObject и с использованием скалярных переменных установленных через определение Application. В следующем скрипте, к примеру, оба и MyVar и MyObj будут членами коллекции Application.Contents.

Коллекция Application.Contents поддерживает циклы типа For. Each и For. Next.
Следующие два примера иллюстрируют каждый из вышеуказанных методов циклов использования Application.Contents.

Коллекция Application. StaticObjects

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

Синтакс:

Application.StaticObject( ключ )

Параметры:

ключ
Указанное имя элемент для обращения к нему.

Замечание:

Вы можете использовать управление циклом чтобы перебирать ключи в коллекции StaticObjects. Это продемонстрированно следующим примером:

Метод Application. Lock

Метод Lock блокирует для других клиентов переменные, хранимые в объекте Application от изменеия. Потому, как только один клиент может в данный момент времени получить доступ к переменным объекта. Если вы не вызываете метод Unlock после обработики переменных, то сервер сам разблокирует данный объект, когда истечет время (timeout) работы скрипта .asp.

Синтакс:

Application.Lock

Пример:

бШ посетитель данной страницы.

В предыдущем примере метод Lock предохраняет переменную NumVisits объекта Application от доступа к нему одновременно нескольких клиентов. Если бы приложение не было бы заблокированно, то два клиента попробывали-бы одновременно увеличить значение переменной NumVisits.

Метод Application. Unlock

Метод Unlock разблокирует заблокированные ранее переменные c помощью метода Lock.

Синтакс:

Application.Unlock

Пример:


Вы посетитель данной страницы.

В предыдущем примере метод Unlock разблокирует переменную NumVisits объекта Application, заблокированную ранее объектом Lock от доступа к нему одновременно нескольких клиентов.

Событие Application_OnEnd

Данное событие активизируется, когда приложение закрывается, а точнее после события Session_OnEnd. Только встроеные объекты Application и Server доступны.

Синтакс:

Параметры

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Замечания

Вы не можете вызывать метод MapPath (объект Server) в подпрограмме Application_OnEnd.

Событие Application_OnStart

Данное событие активизируется, когда активируется новая сессия, такая, как, к примеру, Session_OnStart. Только встроенные объекты Application и Server доступны. Обращение к объектам Session, Request или Response в подпрограмме Application_OnStart вызовет ошибку.

Синтакс:

Параметры

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Applying ASP.NET authentication accross all contents including classic ASP

In this post we will be talking about how to apply authentication accross all contents including classic ASP pages using ASP.NET authentication modules.

Before moving forward with this post lets discuss why am I writing a blog on such old technology and at what all scenarios is this applicable. So long story short, as you guys must have already understood this kind of feature will be handy when you are migrating some old/legacy application to some new technology such as cloud, or may be in containers. Recently while working for a client we had a requirement to migrate old on prem application to cloud. Basically we had to containerize the application using Docker and then run it in Service frabric cluster and apply authentication as we remediate the application. Now that we know the requirement lets proceed to see how easily we can achieve the above.

So basically we will leverage the power of IIS integrated pipeline to achieve the above requirement. Lets discuss a bit about IIS integrated pipeline and what are the features that comes out of the box with integrated pipeline.

IIS 6.0 and previous versions allowed the development of .NET application components via the ASP.NET platform. ASP.NET integrated with IIS via an ISAPI extension, and exposed its own application and request processing model. This effectively exposed two separate server pipelines, one for native ISAPI filters and extension components, and another for managed application components. ASP.NET components would execute entirely inside the ASP.NET ISAPI extension bubble and only for requests mapped to ASP.NET in the IIS script map configuration.

IIS 7.0 and above integrates the ASP.NET runtime with the core web server, providing a unified request processing pipeline that is exposed to both native and managed components known as modules. The many benefits of integration include:

  • Allowing services prov >native and managed modules to apply to all requests, regardless of handler. For example, managed Forms Authentication can be used for all content, including ASP pages, CGIs, and static files.
  • Empowering ASP.NET components to prov >Learn more about building IIS 7.0 and above modules in Developing IIS 7.0 and Above Modules and Handlers with the .NET Framework.

Since we are trying to run >“ASP.NET” and “ASP”

If you are plannning to do that inside windows containers, since we dont have UI over there, we will require either powershell or cmd to enable these features.

Powershell script for the above operation is as follows:

Enabling Forms Authentication for the Entire Application

In order to take advantage of ASP.NET integration, our application must be configured to run in Integrated mode. The ASP.NET integration mode is configurable per application pool, enabling ASP.NET applications in different modes to be hosted side by side on the same server. The default application pool in which our application lives already uses Integrated mode by default, so we do not need to do anything here.

But unfortunately only uing integrated mode will not serve the purpose. Why? The answer lies in the default settings for all ASP.NET modules shipped with IIS 7.0 and above.

Taking Advantage of the Integrated Pipeline

The default configuration for all managed modules shipped with IIS 7.0 and above, including the Forms Authentication and URL Authorization modules, uses a precondition so that these modules only apply to content that an (ASP.NET) handler manages. This is done for backwards compatibility reasons.

By removing the precondition, we make the desired managed module execute for all requests to the application, regardless of content. This is necessary in order to protect our static files, and any other application content with Forms-based authentication.

Lets see how we can achieve this using IIS manager:

1st of all we have to ensure the app pool for pur website is set to integrated mode like this:

Now that we have created our website with app pool .NET 4.5 integrated (for our requirement), we will have to go to modules and change few default settings there.

Folder Structure in Asp.Net MVC Project (Application)

Model — view — controller (MVC) is a software architectural pattern which comes with Model, Controller and View Folder in it. Each folder has different meaning in it. Here we will learn complete folder structure of asp.net mvc project or applicaiton in detailed manner

Model Folder

The model folder represents the data your application will work with. These classes are mostly use for accessing database for performing various DML Operations.

Controller Folder

The Controller folder contains all Controllers in it and if you closely observe names of controllers you will find that every controller ends suffix with “Controller” name in it. It’s name convention for controllers which we need to follow in asp.net mvc.

e.g. If we have Controller with name MobileController and Model with same name Mobile then there will be Type clash (in case if we use same «Mobile» as controller name) for that reason we need to write Controller in suffix.

View Folder

The View folder contains all application Views in it. If we look into this folder it contains Folder with name of Controller and inside that it will have views related to that controller in it. If we just expand View folder we will see that it has a subfolder inside it with name Shared it will have all view which are shared among controller init.

This kind of convention will help us to reduce time of development and help for maintenance. If you check following image you will understand model, view and controller folders clearly.

Scripts Folder

Scripts folder will contains all JavaScript files in it. It also has some jQuery validation files in it check following image for scripts folder structure

App_Data Folder

The use for App_Data is to store database related file. Usually SQL Server Express .mdf files and our App_data folder will be like as shown following

Content Folder

The content folder will contain all styles sheets and images inside it. Our content folder will be like as shown following image

If we follow all these folder structures while creating application it’s easy for us to maintain project easily while it’s growing.

Caching Application Data by Using Multiple Cache Objects in an ASP.NET Application


Introduction

ASP.NET lets you use multiple cache instances in an ASP.NET Web site application—that is, you can instantiate different cache classes and store data in the different instances. You can use different cache instances to cache the same data, or you can use different cache instances to cache different data. For example, for one cache instance, you might let the cache use as much memory as possible, but for the other implementation, you might specify a maximum amount of memory that the cache can use. Using multiple cache objects lets you separate different kinds of data into different caches and enables you to use different caching strategies for different kinds of data.

This walkthrough shows you how to use different instances of the memory cache object in the same ASP.NET application in order to cache the contents of different text files. You will use the built-in in-memory cache object to cache the contents of one text file. For this cache, you will allow the cache to expire every 10 seconds or when the file is changed.

For the second cache instance, you will use a custom cache > A cache region is a partition in memory that is reserved for storing one or more cache objects. A cache region helps organize cache objects in memory.

Note : Although the built-in memory cache object does not support regions, the regions partition concept is used with the built-in memory cache class in this blog for demonstration only.

Tasks illustrated in this walkthrough include the following:

· Creating an ASP.NET Web site.

· Adding a reference to the .NET Framework.

· Adding a cache class that caches the contents of a text file by using the built-in memory cache object.

· Adding a cache implementation that caches the contents of a text file by using a custom cache object.

· Adding data to each cache.

Prerequisites

In order to complete this walkthrough, you will need:

· Microsoft Visual Studio 2010.

· Two text files, each containing a small amount of text. You will display the contents of the text files in a Web page.

Creating an ASP.NET Web Site

You will start by creating an ASP.NET Web site.

To create an ASP.NET Web site

1. Start Visual Studio 2010 or Visual Web Developer Express 2010.

2. In the File menu, click New Web Site . (If you do not see this option, click New , and then click Web Site .)

The New Web Site dialog box is displayed.

3. Under Installed Templates , click Visual Basic or C# and then select ASP.NET Web Site .

4. In the Web Location box, select File System and enter the name of the folder where you want to keep the pages of the Web site. For example, enter the folder name C:\Websites\MultipleCaching and then click OK .

Visual Studio creates the folder and opens the Web site in Source view. Notice that the root Web site contains several files and folders including the Account folder, a Web.config file, the About.aspx and Default.aspx pages, and the Site.master master page.

The next step is to add the text files you want to use to the current Web site project.

To add the text file to the project

1. In Solution Explorer , right-click the name of the project and then click Add Existing Item .

2. In the Add Existing Item dialog box, select the text file that you want to use for this walkthrough, and then click Add to add one text file.

3. Repeat the steps to add the second text file

Adding a Reference to the Caching Assemblies

To use the caching classes that are defined in the System.Runtime.Caching namespace in an ASP.NET application, you must add a reference to the namespace.

To add a reference the Website

4. In Solution Explorer , right-click the name of the Web site and then click Add Reference .

5. Select the .NET tab, select System.Runtime.Caching, and then click OK .

Adding Controls to the ASP.NET Page

To illustrate how to use caching, you will add two Button controls and a Label control to the page. You will create an event handler for each button’s Click event. Later you will add code to the event handlers that reads the cached data and displays it in the Label control.

To add controls to the page

6. From the Standard tab of the Toolbox , drag two Button controls to the Default.aspx page.

7. In the Properties window, set the Text property of one of the Button controls to Get from Built-In Cache . Accept the default ID property.

8. Set the Text property of the other Button control to Get from Custom Cache . Accept the default ID property.

9. From the Standard tab of the Toolbox , drag a Label control to the page. Accept the default ID property.

Initializing the Built-in Cache and Caching Data

Next, you will add code to create an instance of the built-in cache object. The built-in cache object caches data in memory.

The code will perform the following tasks:

· Specify that the cache uses a System.Runtime.Caching.HostFileChangeMonitor object to monitor changes in one of the text files that you are using in this walkthrough

· Read the text file and cache its contents as a cache entry.

· Display the contents of the cached text file.

To create an instance of the built-in memory cache object

10. Double-click the Get from Built-In Cache button to create an event handler in the Default.aspx.cs or Default.aspx.vb file.

11. At the top of the file (before the class declaration), add the following using (C#) or Imports (Visual Basic) statements.

12. In the event handler, add the following code to instantiate the cache.


Dim cache As ObjectCache = MemoryCache.Default

ObjectCache cache = MemoryCache.Default;

The System.Runtime.Caching.ObjectCache class provides an in-memory object cache.

Note The System.Runtime.Caching.ObjectCache class is a replacement for the System.Web.Caching.Cache class. In ASP.NET 4, caching is implemented by using the System.Runtime.Caching.ObjectCache class.

13. Add the following code to read the contents of a cache entry named filecontents .

Dim fileContents As String = TryCast(cache(«filecontents»), String)

string fileContents = cache[«filecontents»] as string;

14. Add code to perform the following tasks:

a. Check whether the cache entry named filecontents exists. If the specified cache entry does not exist, you must read the text file and add it as a cache entry to the cache.

b. Create a new System.Runtime.Caching.CacheItemPolicy object that specifies that the cache expires after 10 seconds.

c. Create a collection for the file paths you want to monitor and to add the path of the text file to the collection.

d. Add a new System.Runtime.Caching.HostFileChangeMonitor object to the collection of change monitors for the cache entry. The System.Runtime.Caching.HostFileChangeMonitor object monitors the text file’s path and notifies the cache if changes occur. In this example, the cache entry will automatically expire if the contents of the file changes.

e. Read the contents of the text file.

f. Insert the contents of the file into the cache object as a System.Runtime.Caching.CacheItem instance. You specify information about how the cache entry should be evicted by passing the System.Runtime.Caching.CacheItemPolicy object as a parameter Set method.

The following example shows code that accomplishes these tasks.

If fileContents Is Nothing Then

Dim policy As New CacheItemPolicy()

Dim filePaths As New List(Of String)()

Dim cachedFilePath As String = Server.MapPath(«

‘ Fetch the file contents.

fileContents = File.ReadAllText(cachedFilePath) & _

vbCrLf & » Using built-in cache » & _

cache.Set(«filecontents», fileContents, policy)

if (fileContents == null)

CacheItemPolicy policy = new CacheItemPolicy();

List filePaths = new List ();

string cachedFilePath = Server.MapPath(«

// Fetch the file contents.

» Using built-in cache » + «\n» + DateTime.Now.ToString();

cache.Set(«filecontents», fileContents, policy);

15. Add the following code to display the cached file content in a Label control .

Creating the Custom Cache Class

Next, you will create a custom cache class named CustomCache . In this example, the custom class will inherit from the build-in System.Runtime.Caching.MemoryCache >

Overloads of the set methods provide different ways to add a cache item to the cache. A cache item can be added by specifying the cache item, an expiration policy, a key/value pair named region in memory where the cache should be stored and so on.

To create the custom cache class

16. In Solution Explorer , right-click the name of the Web site and then click Add New Item .

The New Item dialog box is displayed.

17. Under Installed Templates , select Visual Basic or Visual C# and the select Class .

18. In the Name text box, enter the name CustomCache and then click Add .

19. In the dialog box that appears, click Yes to put the class in the App_Code folder

20. In the code editor, replace the existing contents of the class file with the following code:

Public Class CustomCache

Public Overrides Sub Set(ByVal item As CacheItem, _

ByVal policy As CacheItemPolicy)

Set(item.Key, item.Value, policy, item.RegionName)

Public Overrides Sub Set(ByVal key As String, _

ByVal value As Object, _

ByVal absoluteExpiration As DateTimeOffset, _

Optional ByVal regionName As String = Nothing)

Set(key, value, New CacheItemPolicy _

Public Overrides Sub Set(ByVal key As String, _


ByVal value As Object, _

ByVal policy As CacheItemPolicy, _

Optional ByVal regionName As String = Nothing)

MyBase.Set(CreateKeyWithRegion(key, regionName), _

Public Overrides Function GetCacheItem(ByVal key As String, _

Optional ByVal regionName As String = Nothing) As CacheItem

Dim temporary As CacheItem = _

Return New CacheItem(key, temporary.Value, regionName)

Public Overrides Function Get(ByVal key As String, _

Optional ByVal regionName As String = Nothing) As Object

Return MyBase.Get(CreateKeyWithRegion(key, regionName))

Public Overrides ReadOnly Property DefaultCacheCapabilities() _

Return (MyBase.DefaultCacheCapabilities Or _

Private Function CreateKeyWithRegion(ByVal key As String, _

ByVal region As String) As String

Return «region:» & (If(region Is Nothing, «null_region», _

region)) & «;key=» & key

public class CustomCache : MemoryCache

public CustomCache() : base(«defaultCustomCache»)

public override void Set(CacheItem item, CacheItemPolicy policy)

Set(item.Key, item.Value, policy, item.RegionName);

base.Set(CreateKeyWithRegion(key, regionName), value, policy);

CacheItem temporary = base.GetCacheItem(CreateKeyWithRegion(key, regionName));

return new CacheItem(key, temporary.Value, regionName);

return base.Get(CreateKeyWithRegion(key, regionName));

public override DefaultCacheCapabilities DefaultCacheCapabilities

return (base.DefaultCacheCapabilities | System.Runtime.Caching.DefaultCacheCapabilities.CacheRegions);

private string CreateKeyWithRegion(string key, string region)

return «region:» + (region == null ? «null_region» : region) + «;key=» + key;

21. Save the file.

Creating the Custom Cache and Caching the Entry

Next, you will instantiate the custom CustomCache class and create a custom memory cache object that adds the cache entry to a region. The code will perform the following tasks:

· Creates an instance of a custom cache class—that is, it instantiates the custom cache object.

· Specifies a named region (a region in the cache to which a cache entry can be added). The path of the text file will not be monitored for changes. This means that the cache entry will not expire when the file is changed because the file path is not monitored for changes.

· Reads the text file and caches its contents as a cache entry.

· Displays the contents of the cached text file.

To create an instance of the custom cache object and add a cache entry

22. Switch to or open the Default.aspx file.

23. Double-click the Get from Custom Cache button to create an event handler in the Default.aspx.cs or Default.aspx.vb file.

24. At the top of the file (before the class declaration), add the following Imports (Visual Basic) or using (C#) statements to add the namespace the custom class is in.

25. In the class declaration, add the following code to instantiate the custom cache. You must create and keep the reference of the custom cache to prevent it from going out of scope.

Private Static customCache As ObjectCache = _

Private ReadOnly Property RegionCache() As ObjectCache

private static ObjectCache customCache =

private ObjectCache RegionCache < get < return customCache; >>

26. In the event handler, add the following code to read the contents of a cache entry named CustomFilecontents from the RegionCache cache.

Dim CustomFileContents As String = _

TryCast(RegionCache.[Get](» CustomFileContents «, «Region_A»), String)

string CustomFileContents = RegionCache.Get(«CustomFileContents», «Region_A») as string;

27. Add code to perform the following tasks:

a. Check whether the cache entry named CustomeFilecontents exits. If the specified cache entry does not exist, you must read the text file and add it as a cache entry to the cache.


b. Read the text file

c. Insert the contents of the file into the custom cache object as a cache entry. You specify the named region where the cache entry should be added by passing the region name as parameter in the Set method. You also specify that the cache should not expire based on an absolute time by passing the System.Runtime.Caching.ObjectCache.InfiniteAbsoluteExpiration field as a parameter in the Set method. Instead, items will expire only when there is memory pressure.

The following example shows how to accomplish these tasks

Note The “ Using custom cache” string is added to the text of the text file to help you identify the cached data when you test the page later in this walkthrough.

If CustomFileContents Is Nothing Then

‘ Fetch the file contents.

Dim cachedFilePath As String = Server.MapPath(«

CustomFileContents = File.ReadAllText(cachedFilePath) _

& » Using custom cache » & + DateTime.Now.ToString()

‘ For this cache region, don’t bind a file-change monitor.

if (CustomFileContents == null)

//Fetch the file contents

List filePaths = new List ();

string cachedFilePath = Server.MapPath(«

» Using custom cache » + «\n» + DateTime.Now.ToString();

// For this cache region, don’t bind a file-change monitor

28. Add the following code to display the cached file content in a Label control.

Testing Caching in the ASP.NET Web Site

You can now test the application.

To test caching in the ASP.NET Web site

30. Press CTRL+F5 to run the application.

31. Click Get from Built-in Cache .

The cached content in the text file is displayed in the label. Notice the «Using built-in cache» statement and the time stamp at end of the file.

32. Click Get from Custom Cache .

The cached content in the text file is displayed in the label. Notice the «Using custom cache» statement at the end of the file.

33. Click Get from Built-in Cache again .

The timestamp is unchanged. This indicates the cached content is displayed.

34. Wait 10 seconds or more and then click Get from Built-in Cache again.

This time a new timestamp is displayed. This indicates that the policy lets the cache expire after 10 seconds and that new cached content is displayed.

35. Click Get from Custom Cache .

The cached content in the text file is displayed in the label. Notice the «Using custom cache» statement and the time stamp at the end of the file.

36. Click Get from Custom Cache again. The timestamp is unchanged. This indicates the cached content is displayed.

37. Wait 10 seconds or more and then click Get from Custom Cache again.

The timestamp is still unchanged. This indicates that the cache does not expire based on a policy. However, when the server starts run low on memory, the cache will automatically expire.

Одностраничные приложения

В этой и последующих статьях будет описано средство , которое является относительно новым дополнением платформы ASP.NET и позволяет быстро и легко создавать веб-службы, предоставляющие API-интерфейс для HTTP-клиентов.

Средство Web API основано на том же базисе, что и приложения ASP.NET MVC Framework, но не является частью инфраструктуры ASP.NET MVC Framework. Вместо этого в Microsoft взяли набор ключевых классов и связанных с ними характеристик из пространства имен System.Web.Mvc и продублировали его в пространстве имен System.Web.Http.

Идея в том, что Web API — это часть главной платформы ASP.NET и может использоваться в других типах веб-приложений либо в качестве автономного механизма веб-служб. Одним из главных применений средства Web API считается создание путем комбинирования Web API с возможностями ASP.NET MVC Framework. Далее будет показано, что собой представляют SPA-приложения и как они работают.

Упрощение создания веб-служб является неотъемлемой особенностью Web API. Оно представляет собой значительное улучшение по сравнению с другими технологиями построения веб-служб, которые компания Microsoft предлагала на протяжении последнего десятилетия. Мне нравится средство Web API, и вы должны использовать его в своих проектах, не в последнюю очередь потому, что оно отличается простотой и построено на базе того же самого проектного решения, что и ASP.NET MVC Framework.

Термин одностраничное приложение (SPA) применяется довольно широко. Наиболее согласованным является его определение как веб-приложения, начальное содержимое которого доставляется в виде комбинации HTML-разметки и кода JavaScript, а последующие операции выполняются с участием веб-службы REST, доставляющей данные в формате JSON в ответ на запросы Ajax.

Это отличается от того вида приложений, которые строились в примерах ранее, где результатами операций, выполняемых пользователем, были новые HTML-документы, генерируемые в ответ на синхронные HTTP-запросы. Такие приложения будут называться .

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

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

Пример одностраничного приложения

Для целей этих статей в Visual Studio создан новый проект MVC по имени WebServices с использованием шаблона Empty (Пустой). В разделе Add folders and core references for (Добавить папки и основные ссылки для) были отмечены флажки MVC и Web API, как показано на рисунке ниже:

Этот проект будет использоваться для создания обычного приложения ASP.NET MVC Framework, после чего с помощью Web API будет создана веб-служба. По готовности веб-службы приложение ASP.NET MVC Framework будет превращено в одностраничное приложение.

Создание модели

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

Планируется создать простую коллекцию объектов Reservation, хранящуюся в памяти, которая будет действовать в качестве хранилища данных. Нет необходимости заниматься установкой базы данных, однако нужна возможность выполнения операций CRUD над коллекцией объектов модели, что позволит продемонстрировать ряд важных аспектов Web API. В папку Models добавляется также файл класса по имени ReservationRepository.cs:

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

Класс хранилища имеет начальный список из трех объектов Reservation и определяет методы, которые позволяют просматривать, добавлять, удалять и обновлять коллекцию. Поскольку постоянство в хранилище отсутствует, любые изменения, вносимые в хранилище, теряются в результате останова и перезапуска приложения, но этот пример целиком сосредоточен на способе, которым содержимое может быть доставлено, а не на том, каким образом оно хранится на сервере. Для обеспечения определенной доли постоянства между запросами создается экземпляр класса ReservationRepository, который доступен через статическое свойство Current.


Установка пакетов NuGet

В этой и последующих статьях будут применяться три пакета NuGet: jQuery, Bootstrap и Knockout. Библиотеки jQuery и Bootstrap уже были описаны и использовались ранее. — это библиотека, которую в Microsoft приспособили для одностраничных приложений. Она была создана Стивом Сандерсоном. Несмотря на то что Стив работает в Microsoft, пакет Knockout доступен в виде открытого кода на веб-сайте библиотеки Knockout и получил широкое распространение. Позже будет показано, как функционирует Knockout, а пока нужно установить упомянутые выше пакеты.

Выберите пункт меню Tools Library Package Manager Package Manager Console (Сервис Диспетчер библиотечных пакетов Консоль диспетчера пакетов), чтобы открыть окно командной строки NuGet, и введите следующие команды:

Добавление контроллера

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

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

Добавление компоновки и представлений

Чтобы сгенерировать содержимое для приложения, создается папка Views/Shared, в которую добавляется файл представления по имени _Layout.cshtml с содержимым, показанным в примере ниже:

В этой базовой компоновке предусмотрены элементы
для файлов CSS библиотеки Bootstrap. В компоновке определены два раздела, Scripts и Body, которые будут использоваться для вставки содержимого внутрь компоновки. Следующий шаг заключается в создании представления верхнего уровня для приложения. Хотя далее будет создаваться обычное приложение ASP.NET MVC Framework, известно, что в конечном итоге должно быть построено одностраничное приложение.

Трансформацию делать будет проще, если создать единственное представление, которое содержит всю HTML-разметку, требуемую для приложения, даже при условии, что результат первоначально выглядит несколько странно. В папку Views/Home добавляется файл представления по имени Index.cshtml, содержимое которого приведено в примере ниже:

Модель представления для этого представления является перечислением объектов Reservation, и для обеспечения строительных блоков функциональности, которую будет видеть пользователь, создаются два частичных представления. Файл с первым частичным представлением называется Summary.cshtml. Этот файл создан в папке Views/Home:

Модель представления для частичного представления — то же самое перечисление объектов Reservation, и оно используется для генерации стилизованной таблицы с помощью Bootstrap в виде элемента

, который отображает значения свойств этих объектов. Вспомогательный метод Html.ActionLink() применяется для генерации ссылки, которая будет вызывать действие Remove контроллера Home; ссылка стилизована в виде кнопки с использованием Bootstrap.

Еще одно частичное представление называется Editor.cshtml и также находится в папке Views/Home. Содержимое этого файла приведено в примере ниже. Частичное представление содержит форму, которая применяется для создания новых заявок на бронирование. Отправка формы приводит к вызову действия Add контроллера Home.

Установка стартового URL и тестирование приложения

Последний подготовительный шаг связан с установкой местоположения, куда Visual Studio будет переходить при запуске приложения. Выберите пункт WebServices Properties (Свойства WebServices) в меню Project (Проект) среды Visual Studio, в открывшемся диалоговом окне перейдите на вкладку Web и отметьте переключатель Specific Page (Определенная страница) в категории Start Action (Начальное действие). Вводить какое-либо значение не нужно — достаточно только выбора переключателя.

Чтобы протестировать приложение в его классической форме ASP.NET MVC Framework, выберите пункт Start Debugging (Запустить отладку) в меню Debug среды Visual Studio. Вы увидите (немного странную) компоновку в стиле «все в одном», которая предоставляет пользователю список текущих заявок на бронирование вместе с возможностью их создания и удаления:

В следующей статье мы добавим средства Web API для нашего приложения.

Объектная модель ASP.NET

ASP.NET является объектно-ориентированной моделью разработки Web-приложений. Сами ASP.NET-страницы являются объектами классов. Можно создавать программный код с возможностью его повторного использования классами. Эти классы можно использовать для создания экземпляров объектов.

Объектная модель — это иерархия объектов, предоставляющих разработчикам определенные возможности. В ASP.NET используется новая структура Web-страниц, которая отличается от структуры ASP-страниц и обеспечивает поддержку объектной модели для сохранения содержимого ASP.NET-страницы. Добавлен новый класс элементов управления — серверные элементы управления. Можно добавлять собственные комментарии и связывать эти данные с серверными элементами управления. Для оформления Web-страниц имеются наборы директив, которые предназначены для установки параметров. Например, параметры TraceContext и isEnabled позволяют, соответственно, включить и отключить механизм отслеживания Web-запросов.

ASP.NET определяет шесть внутренних объектов структуры страниц:

Эти объекты встроены в модель ASP.NET-страниц и готовы к использованию.

В объекте application хранятся данные, которые будут доступны всем пользователям, одновременно работающим с Web-приложением.

Данные о сеансе работы каждого отдельного пользователя сохраняет объект session. Объект application используется для хранения глобальных переменных, которые содержат информацию, общедоступную для всех пользователей Web-приложения, например, приветственное сообщение или индекс посещения Web-страницы. Этот объект представляет собой коллекцию разнородных элементов. Пользователи совместно используют объекты Web-приложения, поэтому требуется гарантировать, что несколько пользователей не смогут одновременно изменять переменные, хранимые в объекте application. Для блокирования содержимого коллекции объектов от изменения применяется метод Lock, для разблокирования — метод Unlock. Так же существуют методы Contents.Remove и Contents.RemoveAll, которые удаляют один элемент из семейства Contents или все сразу соответственно.

С помощью объекта ObjectContext выполняется фиксация или откат транзакций, управляемых MTS. Транзакции могут быть инициированы со страницы ASP.NET. Методы SetComplete и SetAbort объекта ObjectContext используются, соответственно, для фиксации и отката транзакций.

Объект response можно использовать для передачи выходной информации клиенту. Методы объекта respons:

AddHeader — устанавливает заголовок HTML имя равным значению.

AppendToLog — добавляет строку в конец записи журнала веб-сервера, относящейся к этому запросу.

BinaryWrite — записывает предоставленную информацию в текущий вывод HTTP без преобразования наборов символов.

Clear — стирает любой буферизованный вывод HTTP.

End — останавливает обработку файла .asp и возвращает текущий результат.

Flush — немедленно передает буферизованный вывод.

Redirect — отправляет обозревателю сообщение о перенаправлении, вызывая попытку обозревателя подключиться к другому URL.

Write — записывает переменную в виде строки в текущий вывод HTTP.

Какая разница между Application.Contents и Application.StaticObjects в классическом ASP?

В объекте Application в Classic ASP есть две коллекции:

  • Application.StaticObjects , заполненные разделами в global.asa
  • Application.Contents , заполненный любым кодом, который решает что-то там хранить, включая разделы

Мой совет должен был просто игнорировать StaticObjects и работать с простым кодом.

Это две разные коллекции. Идея преимущества/недостатка неприменима.

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

Приложение StaticObjects Collection:

Коллекция StaticObjects содержит все объекты, созданные с тегами в пределах области приложения.

Asp семейство application contents

В объекте Application в Classic ASP есть две коллекции:

  • Application.StaticObjects , заполненные разделами в global.asa
  • Application.Contents , заполненный любым кодом, который решает что-то там хранить, включая разделы

Приложение StaticObjects Collection:

Коллекция StaticObjects содержит все объекты, созданные с тегами в пределах области приложения.

  • 28 мар 2020 2020-03-28 04:22:25
  • Dee

Я никогда не сталкивался с какой-либо необходимостью или преимуществом в использовании в Global.asa, а не просто с использованием Contents в событии OnStart .

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

Мой совет должен был просто игнорировать StaticObjects и работать с простым кодом.

Илон Маск рекомендует:  Справочник по инструкциям и функциям interbase sql
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL