Введение в ASP.NET MVC 5
Особенности ASP.NET MVC. Что нового в MVC 5
Платформа ASP.NET MVC представляет собой фреймворк для создания сайтов и веб-приложений с помощью реализации паттерна MVC.
Концепция паттерна (шаблона) MVC (model — view — controller) предполагает разделение приложения на три компонента:
Контроллер (controller) представляет класс, обеспечивающий связь между пользователем и системой, представлением и хранилищем данных. Он получает вводимые пользователем данные и обрабатывает их. И в зависимости от результатов обработки отправляет пользователю определенный вывод, например, в виде представления.
Представление (view) — это собственно визуальная часть или пользовательский интерфейс приложения. Как правило, html-страница, которую пользователь видит, зайдя на сайт.
Модель (model) представляет класс, описывающий логику используемых данных.
Общую схему взаимодействия этих компонентов можно представить следующим образом:
В этой схеме модель является независимым компонентом — любые изменения контроллера или представления не затрагивают модель. Контроллер и представление являются относительно независимыми компонентами, и нередко их можно изменять независимо друг от друга.
Благодаря этому реализуется концепция разделение ответственности , в связи с чем легче построить работу над отдельными компонентами. Кроме того, вследствие этого приложение обладает лучшей тестируемостью. И если нам, допустим, важна визуальная часть или фронтэнд, то мы можем тестировать представление независимо от контроллера. Либо мы можем сосредоточиться на бэкэнде и тестировать контроллер.
Конкретные реализации и определения данного паттерна могут отличаться, но в силу своей гибкости и простоты он стал очень популярным в последнее время, особенно в сфере веб-разработки.
Свою реализацию паттерна представляет платформа ASP.NET MVC. 2013 год ознаменовался выходом новой версии ASP.NET MVC — MVC 5, а также релизом Visual Studio 2013, которая предоставляет инструментарий для работы с MVC5.
Хотя во многих аспектах MVC 5 не слишком сильно будет отличаться от MVC 4, многое из одной версии вполне применимо к другой, но в то же время есть и существенные отличия:
В MVC 5 изменилась концепция аутентификации и авторизации. Вместо SimpleMembershipProvider была внедрена система ASP.NET Identity, которая использует компоненты OWIN и Katana.
Для создания адаптивного и расширяемого интерфейса в MVC 5 используется css-фреймворк Bootstrap
Добавлены фильтры аутентификации, а также появилась функциональность переопределения фильтров
В MVC 5 также добавлены атрибуты маршрутизации
Это наиболее важные нововведения в MVC 5. Кроме того, есть еще ряд менее значимых, например, использование по умолчанию Entity Framework 6, некоторые изменения при создании проекта (концепция One ASP.NET), дополнительные компоненты и т.д.
В любом случае все полученные при работе с MVC 4 навыки можно успешно применять при использовании MVC 5, учитывая, конечно, нововведения.
Asp важные изменения в asp
Этот текст предназначен для тех, кто никогда не имел дела с ASP и вообще смутно себе представляет возможности программирования на стороне сервера. Я ставил себе задачу создать у читателя общее представление о предмете. Отдельные неточности при этом менее важны — пожалуйста, громко не ругайтесь.
Общие сведения
ASP (Active Server Pages) – это мощная технология от Microsoft, позволяющая легко разрабатывать приложения для WWW. ASP работает на платформе Windows NT и IIS (Internet Information Server), начиная с версии 3, хотя вроде есть реализации на других платформах. ASP – это не язык программирования, это внутренняя технология, позволяющая подключать программы к Web-страницам. Основа успеха ASP – простой скриптовый язык (Visual Basic Script или Java Script) и возможность использования внешних COM-компонент.
Как это все происходит?
Вы пишете программу и складываете в файл на сервере. Браузер клиента запрашивает файл. Файл сначала интерпретируется сервером, на выходе производится HTML-код. Этот HTML посылается клиенту. Файлы с программами имеют расширение .asp. Файлы asp – это обычные текстовые файлы, содержащие исходные тексты программ. Файлы делаются с помощью любого текстового редактора. Каталог, в котором размещены файлы asp должен иметь права на выполнение, так как сервер исполняет эти файлы, когда браузер их запрашивает. Собственно программы пишутся на любом скриптовом языке, который установлен в системе. По умолчанию поддерживаются VBScript и JavaScript. Можно доустановить другие (например, Perl). Если ничего специально не указывать используется VBScript. В дальнейшем будем ссылаться только на него. Программные фрагменты заключаются в скобки . Можно ставить открывающую скобку в начале файла, закрывающую – в конце, все что между ними – программа на Visual Basic’е.
Какие средства есть для программирования?
Web – нормальная среда программирования, если правильно понять, что есть что. В VBScript есть все нормальные конструкции структурного программирования (if, while, case, etc). Есть переменные (описывать не обязательно, тип явно не задается). Поддерживаются объекты. Работа с ними обычная – Object.Property, Object.Method. Есть ряд встроенных объектов (Request, Response, Session, Server, Connection, Recordset). Можно доустанавливать другие компоненты (скачивать, покупать, программировать), например для работы с электронной почтой.
Вывод
Понятия «экран», куда можно выводить данные нет. Все, что надо показать пользователю, выбрасывается в выходной поток на языке HTML. Браузер пользователя интерпретирует этот HTML. Для упрощения вывода существует объект Response . Вывод осуществляется с помощью метода Write .
Так производится запись во внутренний буфер объекта Response. Когда скрипт заканчивает работу, весь буфер выдается клиенту. Надо заметить, что клиент получает «чистый» HTML, таким образом программы на ASP не зависят от клиентского ПО, что очень важно. Если внутри выводимой строки нужно использовать кавычку, кавычка удваивается. Другие методы и свойства Response позволяют управлять выводом. Так Response.Buffer регулирует, получает ли клиент данные по мере из записи в Response, или все сразу по завершении исполнения страницы. Метод Response.Redirect перенаправляет браузер на другую страницу. Чтобы им пользоваться, нельзя до него на странице использовать Response.Write.
Программа на ASP не может явно спросить пользователя о чем-то. Она получает данные из других страниц, либо через URL. Передаваемые параметры помещаются во входной поток и доступны через объект Request . Чтобы передать переменную var в программу test.asp , надо написать:
Чтобы из программы получить значение этой переменной, надо написать:
Несколько переменных разделяется знаком &:
Кроме того, чтобы задавать параметры в URL, можно воспользоваться формами HTML. В вызывающей странице пишем так:
Так это выглядит:
При этом пользователь увидит форму из одного поля ввода (var1), в нем будет значение по умолчанию «default». Второе поле (var2) будет невидимо и будет передавать всегда фиксированное значение «var2value». Кнопка «Submit Form» завершает заполнение формы и передает все переменные на test.asp (action). Если method=»get», переменные передаются через URL (test.asp?var1=default&var2=var2value). Если method=»post», передаются вместе с запросом так, что внешне передача переменных не заметна. В вызываемой программе безразлично, какой метод изпользовался (почти). Если у вас нет специальных аргументов за метод GET, используйте метод POST.
Формы
Формы HTML используются для организации диалога с пользователем. Поддерживаются стандартные элементы управления. Все многообразие задается немногими тэгами:
- INPUT (с параметром TYPE=)
- SELECT
- TEXTAREA
Описание – в документации по HTML.
Взаимосвязь между отдельными страницами
Обычно сервер WWW не хранит состояние приложения, т.е. все запросы взаимонезависимы, и нет стандартного способа понять, что несколько запросов пришли от одного и того же пользователя. Но это очень нужно для разработки полноценных приложений и является одной из главных проблем разработки Web-приложений.
Один из методов решения этой проблемы — cookies . Пользователю при первом обращении выдается специальный идентификатор, после этого браузер пользователя предъявляет этот идентификатор при каждом обращении, и сервер может распознать, что это тот же самый пользователь. Пользователь может отключить cookies, в этом случае этот метод не работает.
ASP, используя cookies, предоставляет программисту более простое средство — объект Session (сессия). Сессия стартует, когда новый пользователь обращается к любому asp-файлу приложения. Сессия заканчивается при отсутствии активности пользователя в течение 20 минут, либо по явной команде. Специальный объект Session хранит состояние сессии. Туда можно записывать переменные, которые доступны из любой страницы в этой сессии. Записать данные в этот объект можно просто:
Считать потом еще проще:
Сессия, таким образом, – это еще один метод передачи данных между страницами. Одна страница пишет данные в сессию, другая – берет потом оттуда.
Наряду с объектом Session существует объект Application . Если сессия создается для каждого нового пользователя, до Application существует в единственном экземпляре, и может использоваться всеми страницами приложения.
Управление приложением
Программисту предоставляется возможность реагировать на 4 события: старт/стоп приложения и старт/стоп каждой сессии. Для реализации этих событий предназначен файл global.asa , который должен располагаться в корневом каталоге приложения. Вот его примерный скелет:
Нужно «просто» вписать Ваш код на соответствующее место. Нужно заметить, что отлаживать код для global.asa довольно непросто, так как он выполняется при очень специфических обстоятельствах (к примеру при старте или остановке сервера).
Использование внешних компонент
Если на сервере установлены дополнительные компоненты, их можно использовать из ASP. Стандартные объекты (например из библиотек ADO (Connection и Recordset) и Scripting (Dictionary, FileSystemObject)) доступны всегда. Установка новой компоненты обычно состоит в копировании dll-файла в каталог на сервере и ее регистрации с помощью программы regsvr32.exe. [В COM+ используется своя процедура инсталляции объектов, это однако не влияет на использования объектов.]
Создать экземпляр объекта можно так:
Class.Object указываются в документации на компоненту. В переменной var запоминается ссылка на созданный экземпляр объекта. Когда объект не нужен, ссылку нужно обнулить с помощью команды:
Пожалуйста всегда обнуляйте все ссылки на объекты, когда они больше не нужны. Теоретически это должно происходить автоматически при завершении процедуры/страницы, однако в стандартной сборке мусора есть определенные «проблемы».
В остальном использование компоненты зависит от самой этой компоненты.
Работа с базами данных
Из ASP можно легко и просто работать с любыми базами данных. Это делается через две промежуточные технологии: ODBC и ADO.
ODBC позволяет организовать доступ к любым базам данных через унифицированный интерфейс с помощью языка SQL. Специфика конкретных СУБД учитывается при помощи специальных драйверов БД. Такие драйверы существуют для всевозможных СУБД (в частности SQL Server, Oracle, Access, FoxPro). Поддержка ODBC обеспечивается на уровне операционной системы Windows (NT). Настройка – через Control Panel/ODBC. Базовым понятием является источник данных или data source. Источник данных – это совокупность сведений о базе данных, включая ее драйвер, имя компьютера и файла, параметры. Чтобы пользоваться базой надо создать источник данных для нее. Важно, чтобы источник данных был «системным», в отличии от «пользовательского». После этого надо лишь знать имя источника данных. [В настоящее время ODBC отступает перед натиском технологии OLE DB. На практике это однако практически ничего не изменяет. Вместо имени источника данных нужно использовать Connection String, в которой указывается имя ODBC-драйвера и все его параметры.]
ADO – это совокупность объектов, доступных из ASP, позволяющих обращаться к источнику данных ODBC [или OLE DB]. Фактически нужны лишь 2 объекта – Connection , представляющий соединение с базой данных и Recordset , представляющий набор записей, полученный от источника. Сначала необходимо открыть соединение, потом к нему привязать Recordset, потом, пользуясь методами Recordset’а, обрабатывать данные. Вот пример:
Если команда SQL не возвращает данных, recordset не нужен, надо пользоваться методом Conn. Execute (SQL_COMMAND).
Если Вы хотите вызывать хранимые процедуры сервера БД с параметрами, нужно воспользоваться объектом Command , который в свою очеред содержит объекты Parameter .
Методики программирования, советы
Описание переменных
VBScript — очень нетребовательный к программисту язык. Так он не требует описывать переменные и не содержит явных типов данных. Все переменные принадлежат одному типу Variant . Из-за отсутствия описаний могут произойти очень трудно обнаруживаемые ошибки. Одна опечатка может стоить полдня поисков.
Однако, есть возможность явно потребовать описания переменных. Для этого первой строкой в ASP-файле нужно написать Option Explicit . После этого обращение к переменной, которая не была объявлена с помощью Dim , вызывает ошибку с указанием номера строки.
Кстати, где расположены описания Dim в процедуре — совершенно не важно. Они могут стоять как до использования переменной, так и после, и даже в цикле. Видимо они отрабатываются препроцессором. Явно задать тип переменной с помощью Dim Var as Typ , как в Visual Basic, все равно нельзя.
Чередование ASP/HTML
Если нужно выдать большой кусок HTML, можно не пользоваться Response.Write. Если в asp-файле встречается кусок текста вне скобок , он трактуется просто как HTML, который надо вывести. Пример:
Обработка ошибок
Для отслеживания ошибок используется специальный объект Err . Он устанавливается в ненулевое значение, если предыдущая команда породила ошибку. Ее можно проверять с помощью If, и таким образом реагировать на ошибки. Чтобы из-за ошибки не прерывалось выполнение программы, в начале нужно включить команду
Включение других файлов
Можно выносить повторяющийся код в отдельный файл, и подключать к разным другим по мере необходимости с помощью команды include . Это очень удобно, если вы хотите вынести повторяющийся код в отдельный файл и использовать снова и снова в разных страницах:
Важно: все includes в тексте отрабатываются до исполнения файла. Т.е. даже если include стоит внутри if, то сначала будут включены все includes во всех ветках, и только потом, во время исполнения, будет принятно решение, какую ветку выполнять. Т.е. следующий код не дает условного включения файлов:
Обработка форм
Если надо что-то спросить у пользователя и на основании этого что-то сделать, в простейшем случае создается два файла: один с формой, второй – с ее обработчиком. Обработчик выполняет все действия. Пример:
Рекурсивная обработка форм
Удобный метод состоит в том, чтобы сбор данных и обработку осуществлял один и тот же файл. Для этого пишется asp, в котором есть разные разделы. Специальная переменная отвечает за выбор раздела при запуске. Пример:
Переменные HTTP
Запрос от браузера, кроме запрашиваемой страницы несет еще некоторые данные. Эти данные, например, IP-адрес клиента, доступны через специальные переменные объекта Request. IP-адрес – Request(«REMOTE_ADDR»). Другие — см.документацию (ASPSamp\Samples\srvvar.asp).
Переадресация
Очень легко написать на ASP скрипт, который будет производить некоторые расчеты, и в зависимости от результатов переадресовывать браузер на разные URL (например, подставлять нужный баннер). Делается это так:
Только надо следить, чтобы до выполнения команды redirect ничего не было записано в Response (даже коментарии HTML).
Электронная почта
Одна из часто встречающихся задач – отправить электронную почту с Web-страницы. На первый взгляд, можно просто написать
Asp важные изменения в asp
Обновлен: Ноябрь 2007
На платформе .NET Framework поддерживается установка нескольких версий среды CLR на один компьютер. По умолчанию при установке платформы .NET Framework на компьютер с уже установленной средой выполнения все приложения ASP.NET автоматически обновляются для использования этой версии платформы .NET Framework. Несмотря на то, что более поздние версии платформы .NET Framework разработаны как обратно совместимые, существует возможность настроить приложение ASP.NET для использования более ранней версии среды выполнения.
В этом разделе рассматриваются следующие темы:
Традиционно в ходе обновления приложения или компонента старая версия удаляется и заменяется на новую. Если новая версия несовместима с предыдущей, это приводит к сбою в работе других приложений, использующих данный компонент или приложение. .NET Framework поддерживает параллельное выполнение, что позволяет устанавливать на один компьютер одновременно несколько версий сборки или приложения. Поскольку версии могут устанавливаться одновременно, управляемые приложения могут выбирать версию для использования, не влияя на работу приложений, использующих другие версии.
В ASP.NET под параллельным выполнением подразумевается, что приложения установлены на одном компьютере, но используют разные версии платформы .NET Framework. В перечисленных ниже разделах рассматриваются поддержка параллельного выполнения в ASP.NET и способы настройки приложений ASP.NET для параллельного выполнения.
На платформе .NET Framework поддерживается установка нескольких версий среды CLR на один компьютер. По умолчанию при установке .NET Framework на компьютер с уже установленной средой выполнения все приложения ASP.NET автоматически обновляются для использования этой версии .NET Framework. Единственное исключение — приложения, привязанные к несовместимой или к более поздней версии среды выполнения. (Совместимость обычно определяется номером версии платформы .NET Framework. Среды выполнения с разными основными номерами версий обычно несовместимы, если же отличаются дополнительные номера версий и номера построений, то такие среды выполнения совместимы. Несмотря на то, что более поздние версии .NET Framework разработаны как обратно совместимые, существует возможность настроить приложение ASP.NET для использования более ранней версии среды выполнения.
Карты сценариев в приложениях ASP.NET
Когда на одном компьютере установлено несколько версий .NET Framework, каждая установка имеет свою собственную версию расширения ISAPI ASP.NET (Aspnet_isapi.dll). Расширение ISAPI ASP.NET определяет, какую версию .NET Framework будет использовать приложение. Можно настроить приложение ASP.NET для использования любого расширения ISAPI ASP.NET. Чтобы указать, какое расширение ISAPI ASP.NET следует использовать приложению ASP.NET, в службах IIS для приложения регистрируется карта сценариев (иногда называемая картой приложения).
Карта сценариев сопоставляет расширение файла (например ASPX) и команду HTTP (например GET или POST) с соответствующим расширением ISAPI. Например, когда служба IIS получает запрос на ASPX-файл, карта сценариев приложения дает IIS команду направить этот ASPX-файл подходящей версии расширения ISAPI ASP.NET. Карта сценариев для каждого приложения ASP.NET обычно задается в консоли управления служб IIS и может применяться непосредственно к приложению или наследоваться от родительского приложения. По умолчанию при установке .NET Framework карты сценариев всех приложений компьютера автоматически обновляются, чтобы использовать новое расширение ISAPI ASP.NET, за исключением случаев, когда приложение использует более позднюю или несовместимую версию.
Чтобы упростить настройку карты сценариев для приложения ASP.NET, каждая установка .NET Framework имеет свою собственную версию инструмента регистрации IIS для ASP.NET (Aspnet_regiis.exe). По умолчанию этот инструмент устанавливается в следующую папку:
%корневая_папка_системы% \Microsoft.NET\Framework\ Номер_версии
Администраторы могут использовать этот инструмент, чтобы сопоставить приложение ASP.NET со связанной с данным инструментом версией ISAPI ASP.NET.
Примечание. | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Примечание. | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Примечание. | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Примечание. | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Внимание! | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
URL | Результат |
/ | Выводит список товаров из всех категорий для первой страницы. |
/Page2 | Выводит список товаров из всех категорий для указанной страницы (в данном случае страницы 2). |
/Soccer | Показывает первую страницу товаров из определенной категории (в данном случае категории Soccer ). |
/Soccer/Page2 | Показывает указанную страницу (в данном случае 2) товаров из указанной категории (в данном случае Soccer ). |
/Anything/Else | Вызывает метод действия Else контроллера Anything . |
Система маршрутизации ASP.NET используется MVC для обработки входящих запросов от пользователей, но она также запрашивает исходящие URL, которые соответствуют нашей схеме URL, и которые мы можем встроить в веб-страницы. Таким образом гарантируется то, что все URL в приложении последовательны.
Мы покажем, как создавать модульные тесты для конфигурации маршрутизации в главе 13.
Метод Url.Action является наиболее удобным способом генерации исходящих ссылок. В предыдущей главе мы использовали этот вспомогательный метод в представлении List.cshtml , чтобы отображать ссылки на страницы. Теперь, когда мы добавили поддержку фильтрации по категориям, мы должны вернуться к нему и передать эту информацию, как показано в листинге 8-4.
Листинг 8-4: Добавляем информацию о категории к ссылкам на страницы
До этого изменения ссылки на страницы выглядели так:
Если пользователь перейдет по такой ссылке, фильтр по категории будет потерян, и он попадет на страницу, содержащую товары из всех категорий. Добавляя текущую категорию, которую мы получаем из модели представления, мы генерируем такие URL:
Когда пользователь переходит по такой ссылке, текущая категория будут передана в метод действия List , и фильтрация будет сохранена. После внесения этих изменений, вы можете перейти по таким ссылкам, как /Chess или /Soccer , и увидите, что ссылка внизу страницы включает в себя правильную категорию.
Создаем меню навигации по категориям
Мы должны предоставить пользователям возможность выбора категории. Это означает, что мы должны создать список доступных категорий, в котором будет выделяться выбранная категория, если такая имеется. В процессе работы над приложением мы будем использовать этот список в разных контроллерах, поэтому он должен быть реализован отдельно и предоставлять возможность многократного использования.
В ASP.NET MVC Framework есть концепция дочерних действий, которые идеально подходят для создания таких элементов, как элемент управления навигацией многократного использования. Дочернее действие полагается на вспомогательный метод HTML под названием RenderAction , который позволяет включить вывод из произвольного метода действия в текущее представление. В этом случае мы можем создать новый контроллер (назовем его NavController ) с методом действия (в данном случае Menu ), который визуализирует меню навигации и внедряет вывод из данного метода в макет.
Такой подход дает нам реальный контроллер, который может содержать любую необходимую нам логику приложения, и который может быть протестирован, как и любой другой контроллер. Это действительно хороший способ создания небольших сегментов приложения, при котором сохраняется общий подход MVC Framework.
Создаем контроллер навигации
Щелкните правой кнопкой мыши папку Controllers в проекте SportsStore.WebUI и выберите пункт Add Controller из контекстного меню. Назовите новый контроллер NavController , выберите опцию Empty MVC controller из меню Template и нажмите кнопку Add to create the class .
Удалите метод Index , который Visual Studio создает по умолчанию, и добавьте метод действия Menu , показанный в листинге 8-5.
Листинг 8-5: Метод действия Menu
Этот метод возвращает статическую строку сообщения, но, пока мы интегрируем дочернее действие в приложение, этого для нас достаточно. Мы хотим, чтобы список категории появлялся на всех страницах, так что мы собирается визуализировать дочернее действие в макете, а не в определенном представлении. Отредактируйте файл Views/Shared/_Layout.cshtml так, чтобы он вызывал вспомогательный метод RenderAction , как показано в листинге 8-6.
Листинг 8-6: Добавляем вызов к RenderAction в макет Razor
Мы удалили замещающий текст, который добавили в главе 7, и заменили его на вызов метода RenderAction . Параметрами этого метода являются метод действия, который мы хотим вызвать ( Menu ), и контроллер, который мы хотим использовать ( Nav ).
Метод RenderAction записывает свое содержание непосредственно в поток ответа, как и метод RenderPartial , о котором мы упоминали в главе 5. Это означает, что метод возвращает void , и поэтому его нельзя использовать с регулярным тегом Razor @ . Вместо этого мы должны заключить вызов метода в блок кода Razor (и не забудьте поставить точку с запятой в конце оператора). Если вам не нравится синтаксис блока кода, можно использовать метод Action в качестве альтернативы.
Если вы запустите приложение, то увидите, что вывод метода действия Menu включен в каждую страницу, как показано на рисунке 8-2.
Рисунок 8-2: Отображение результата метода действия Menu
Создаем списки категорий
Теперь мы можем вернуться к контроллеру и создать реальный набор категорий. Мы не хотим генерировать категории URL в контроллере. Для этого мы собираемся использовать вспомогательный метод в представлении. В методе действия Menu нужно только создать список категорий, что мы сделали в листинге 8-7.
Листинг 8-7: Реализация метода Menu
Сначала мы добавляем конструктор, который принимает реализацию IProductRepository как аргумент — после создания экземпляра контроллера ее предоставит Ninject, используя привязки, которые мы создали в предыдущей главе.
Далее мы изменяем метод действия Menu , который теперь использует запрос LINQ, чтобы получить список категорий из хранилища и передать их в представление. Обратите внимание, что, так как в этом контроллере мы работаем с частичным представлением, здесь мы вызываем метод PartialView , и что результатом является объект PartialViewResult .
Модульный тест: создание списка категорий
Протестировать нашу способность создавать список категорий относительно просто. Наша цель — создать список, который отсортирован в алфавитном порядке и не содержит дубликатов. Самый простой способ это сделать — предоставить неотсортированные тестовые данные с дублирующими категориями, передать их в NavController и задать утверждение, что данные будут правильно обработаны. Вот модульный тест, который мы использовали:
Мы создали имитированную реализацию хранилища, которая содержит повторяющиеся и неотсортированные категории. Наше утверждение заключается в том, что все повторяющиеся строки будут удалены и данные будут отсортированы в алфавитном порядке.
Создаем частичное представление
Так как список категорий является всего лишь частью страницы, имеет смысл создать частичное представление для метода действия Menu . Кликните правой кнопкой мыши метод Menu в классе NavController и выберите Add View из контекстного меню.
Оставьте представлению имя Menu , отметьте флажком опцию Сreate a strongly typed view , и введите IEnumerable как тип класса модели, как показано на рисунке 8-3.
Рисунок 8-3 : Создаем частичное представление Menu
Отметьте флажком опцию Create as a partial view и нажмите кнопку Add , чтобы создать представление. Измените содержание представления так, чтобы оно соответствовало листингу 8-8.
Листинг 8-8: Частичное представление Menu
Мы добавили ссылку под названием Home, которая будет отображаться в верхней части списка категорий и приведет пользователя на первую страницу со списком всех товаров, без фильтра по категории. Мы сделали это с помощью вспомогательного метода ActionLink , который генерирует якорный HTML-элемент с помощью информации о маршрутизации, которую мы настроили ранее.
Затем мы перечислили имена категорий и создали ссылки на каждую из них с помощью метода RouteLink . Он похож на ActionLink , но позволяет нам поставлять набор пар имя/значение, которые учитываются при генерации URL на основе конфигурации маршрутизации. Не беспокойтесь, если вы еще ничего не знаете о маршрутизации – мы подробно объясним все в главе 13.
Генерируемые ссылки будет выглядеть не очень симпатично с настройками по умолчанию, поэтому мы определили код CSS, который улучшит их внешний вид. Добавьте стили, показанные в листинге 8-9, в конец файла Content/Site.css в проекте SportsStore.WebUI .
Листинг 8-9: CSS для ссылок на категории
Если вы запустите приложение, то увидите ссылки на категории, как показано на рисунке 8-4. Если вы кликните по категории, список элементов обновится и будет отображать только элементы из выбранной категории.
Рисунок 8-4: Ссылки на категории
Подсветка текущей категории
Сейчас мы не подсказываем пользователям, какую категорию они просматривают. Хотя пользователь может понять это по элементам в списке, мы все же предпочитаем обеспечить надежный визуальный индикатор. Для этого мы могли бы создать модель представления, которая содержит список категорий и выбранную категорию; в самом деле, именно это мы бы обычно и сделали. Но для разнообразия мы будем использовать ViewBag , о которой говорилось в главе 2. Этот объект позволяет передавать данные из контроллера в представление, не используя модель представления. Листинг 8-10 показывает изменения в методе действия Menu контроллера Nav .
Листинг 8-10: Использование ViewBag
Мы добавили в метод действия Menu параметр под названием category . Значение этого параметра будет предоставлено автоматически конфигурацией маршрутизации. В теле метода мы динамически создали свойство SelectedCategory в объекте ViewBag и приравняли его значение к значению параметра category . Как мы уже объясняли в главе 2, ViewBag является динамическим объектом, и мы создаем новые свойства, просто устанавливая для них значения.
Модульный тест: Указание выбранной категории
Чтобы проверить, что метод действия Menu правильно добавляет информацию о выбранной категории, проверим в модульном тесте значение свойства ViewBag , которое доступно через класс ViewResult . Вот этот тест:
Обратите внимание, что мы не должны приводить значение свойства из ViewBag . Это одно из преимуществ использования объекта ViewBag перед ViewData .
Теперь, когда мы предоставляем информацию о выбранной категории, можно обновить представление и добавить класс CSS к якорному HTML-элементу, который представляет выбранную категорию. Листинг 8-11 показывает изменения в частичном представлении Menu.cshtml .
Листинг 8-11: Подсветка выбранной категории
Мы воспользовались перегруженной версией метода RouteLink , что позволяет нам предоставить объект, свойства которого будут добавлены в якорный HTML-элемент как атрибуты. В этом случае ссылке, которая представляет выбранную категорию, присваивается CSS-класс selected .
Обратите внимание, что мы использовали @class в анонимном объекте, который мы передали как новый параметр в вспомогательный метод RouteLink . Это не тег Razor. Мы используем стандартную функцию языка C#, чтобы избежать конфликта между ключевым словом HTML class (используется для присвоения стиля CSS к элементу) и того же слова C# (используется для обозначения класса .NET). Символ @ позволяет нам использовать зарезервированные ключевые слова C#, не запутывая компилятор. Если мы просто вызовем параметр class (без @ ), компилятор будет считать, что мы определяем новый тип C#. Когда мы будем использовать символ @ , компилятор поймет, что мы хотим создать параметр в анонимном типе под названием class , и мы получим нужный нам результат.
При запуске приложения будет виден эффект подсветки категории, которую вы также можете видеть на рисунке 8-5.
Рисунок 8-5: Подсветка выбранной категории
Корректируем количество страниц
Нам нужно исправить ссылки на страницы, чтобы они работали правильно, когда выбрана категория. На данный момент количество ссылок на страницы определяется общим количеством товаров в хранилище, а не количеством товаров в выбранной категории. Это означает, что клиент может кликнуть по ссылке на страницу 2 в категории Chess и попадет на пустую страницу, потому что для ее заполнения недостаточно товаров. Вы можете увидеть, как это выглядит, на рисунке 8-6.
Рисунок 8-6: Отображение неправильных ссылок на страницы, когда выбрана категория
Мы можем исправить это, обновив метод действия List в ProductController так, чтобы к информации о нумерации страниц были добавлены сведения о категории. Необходимые изменения показаны в листинге 8-12.
Листинг 8-12: Объединяем данные о нумерации страниц и категории
Если категория выбрана, мы возвращаем количество товаров в этой категории, если нет, мы возвращаем общее количество товаров.
Модульный тест: подсчет товаров по категориям
Тест, с помощью которого мы проверим текущий подсчет товаров в различных категориях, очень простой: мы создадим имитированное хранилище, которое содержит известное количество данных в различных категориях, а затем вызовем метод действия List , запрашивая каждую категорию по очереди. Вот модульный тест:
Обратите внимание, что мы также вызываем метод List , не указывая категорию, чтобы убедиться, мы получаем правильный подсчет всех товаров.
Теперь, когда мы просматриваем какую-либо категорию, ссылки в нижней части страницы отражают правильное количество товаров в ней, как показано на рисунке 8-7.
Рисунок 8-7: Отображается правильное количество страниц в категории
Ведущий переход от классического ASP к ASP.NET, любой совет?
Итак, я только начал работать в новой компании, на которой 99% кода написано в классическом ASP (большинство из них плохо написано), и часть причин, по которым они меня наняли, состояла в том, что я работал с ASP и ASP.NET в прошлое. Опыт ASP.NET был VB.NET, но я работал с С# в колледже, но я предпочитаю его только потому, что в прошлом я много работал с PHP, и когда я не фокусируюсь, я просто начинаю набирать синтаксис Си и было много случаев здесь, в ASP, где я заканчиваю строки в полуколонке только по привычке и должен вернуться и удалить ее.
Но я отвлекаюсь, в основном у меня просто нет знаний, необходимых для принятия наилучших решений по поводу вещей, которые сделали заметки о некоторых ключевых процессах, о которых я бы хотел посоветовать:
- Контроль версий — правда, я сказал, что никогда не использовал его. Сам по себе я просто никогда не имел, что кричит момент, чтобы заставить меня использовать его, и магазины, в которых я работал, всегда просто бросали осторожность в ветер. Хотелось бы знать, что вы все думаете, что я должен использовать на стороне сервера и
- Локальная среда для защиты от вирусов. Возможно, что-то я просто быстро сделаю Google, но я хочу настроить локальную среду для разработчиков, чтобы я мог протестировать материал, не имея FTP сначала где-нибудь.
- Нажатие изменений Live. Я никогда не понимал шаг между проверкой чего-то в контроле версий и наблюдением за ним вживую, есть ли какая-то автоматическая система, которая может пойти «эй, я вижу, дайте мне посмотреть, что отличается от этой и живой версии и нажать на затронутые файлы» — возможно, просто отсутствие понимания vc все вместе: (
- IDE — Загрузка VS2010 Beta 10 сейчас, надеясь, что она стабильная
- MVC.NET — Легко подбирать? Я всегда ненавидел целую концепцию веб-форм, казалось, что она не в конечном итоге соответствует интернету, который развивает остальная часть мира.
- Anything Else. Как я уже сказал, я относительно новичок в этом стеке, поэтому мне бы хотелось, чтобы любой совет, который я могу получить на раннем этапе, чтобы избежать любого «дерьма», мне жаль, что я не знал, что 3 месяца назад «моменты
РЕДАКТИРОВАТЬ: Принимать советы и делать это сообщество wiki
Ого. здесь много вопросов:
Контроль версий. Посмотрите на Subversion и Git. Они представляют два вида контроля версий, вам может понравиться один другой, чем другой. Git является бесплатным для проектов с открытым исходным кодом.
Local Dev Environment. Я бы рекомендовал использовать встроенный веб-сервер в Visual Studio. Вы можете щелкнуть правой кнопкой мыши страницу в своем браузере решений и сказать «просмотр в браузере». Затем он просто скомпилирует его прямо там и откроет экземпляр локального веб-сервера.
Нажатие изменений Live. Я не собираюсь давать советы здесь. Кто-то умнее меня, безусловно, сделает это.
IDE. Да, просто придерживайтесь текущей версии Visual Studio. Если у вас нет активных (для оплаты) проектов, я думаю, что VS2010 — хорошая идея, потому что он поддерживает новейшие предстоящие функции asp.net, и к тому моменту, когда вы их узнаете, это, вероятно, будет выпущено публике в любом случае.
Anything Else. Стоит (с точки зрения работы) знать WebForms. Но я настоятельно рекомендую изучить ASp.Net MVC (если не по какой-либо другой причине, «это более интересно» ).
После прочтения ответа Марка Редмана это вызвало что-то для меня. Я бы рекомендовал (как он), что вы исследуете какой-то ORM. Я использую SubSonic и действительно люблю его. Там есть много вариантов.
Это мои 2 цента.
Контроль версий:
Определенно взгляните на SubVersion, бесплатно, мы используем платный сервисный сайт под названием Assembla (www.assembla.com), но вы можете установить сервер в своей сети. Самый популярный клиент называется TortoiseSVN (http://tortoisesvn.tigris.org/), он также бесплатный. Вы также можете взглянуть на VisualSVN (http://www.visualsvn.com/), которые интегрированы в VS IDE, их сайт также имеет удобную установку SVN-сервера.
Локальная среда разработки
Локальный IIS или встроенный VS-сервер VS в VS оба хороши, это действительно так, я думаю. Открытие веб-сайта (основанного на файловой системе), а не основанного на IIS, кажется, работает для нас хорошо.
Нажатие изменений Live
ASP очень развит по страницам и не требует компиляции, копирования файлов на тестовый или производственный сайт довольно просто. В зависимости от того, как вы компилируете/публикуете свой сайт asp.net, вам необходимо подумать о том, как вы компилируете библиотечный код и публикуете веб-приложение/веб-сайт.
Я бы рекомендовал начать с использования SVN для фиксации изменений и для обновления тестовых/производственных сайтов.
IDE:
Я бы рекомендовал обновить последнюю версию версии VS2010 и использовать ее.
Что-нибудь еще:
Рассмотрим развертывание, замените ли вы все перед тем, как начать жить?
Рассмотрите возможность использования существующей структуры, использования ORM или инфраструктуры Business Objects, возможно, даже с использованием Code-Generation. Посмотрите на CodeSmith, у него есть различные связанные с ним ORM/Business Object Framework. (они будут использовать различные технологии и технологии в инфраструктуре .net, которые вам нужно будет изучить)
Посмотрите на основную структуру сайта:
Рассмотрим asp.net WebForms (приложения) или MVC (веб-сайты) [да, это очень простой анализ различий]
Членство в сайте и разрешения: посмотрите на MembershipProvider, RoleProvider и создайте свои собственные.
Файловая система: рассмотрите, как и где вы будете загружать файлы.
Разделите пользовательский интерфейс на повторно используемые UserControls.
Asp важные изменения в asp
Новые возможности ASP.NET 2.0, сервер разработки (ASP.NET Development Server), мастер-страницы, адаптеры
В этом разделе представлены новые возможности, которые появились в ASP . NET 2.0:
- в ASP . NET 2.0 представлены более гибкие возможности по созданию Web -сайтов. В предыдущих версиях Web -приложения нужно было создавать в виде каталогов на локальном или удаленном сервере Internet Information Server . При этом разработчику фактически было необходимо представить административные права на Web -сервер (что на многих предприятиях могло стать проблемой). В ASP . NET 2.0 в добавление к традиционным методам приложения можно создавать и другими способами, например, просто в каталоге на локальном компьютере. Для отладки приложений Internet Information Server теперь не нужен: в среду разработки встроен свой собственный специальный Web -сервер (он называется ASP . NET Development Server );
- в ASP . NET 2.0 необязательно использовать файлы проектов и решений. Основной единицей для работы с приложением является каталог, в котором находятся файлы данного приложения. Однако полного отказа от файлов проектов и решений также нет: вы вполне можете использовать традиционный подход. Например, файлы проектов можно использовать для хранения информации о настройках интегрированной среды разработки. Возможность работы без файлов проектов и решений упрощает внесение изменений в Web -сайты и работу с Visual Source Safe .
- в предыдущих версиях ASP . NET весь код проекта компилировался в одну сборку . NET . Поэтому недописанные синтаксически неверные страницы оставлять было нельзя. В ASP . NET 2.0 компилируется только код, относящийся к вызываемой вами Web -странице. Это упрощает, например, работу над большим Web -сайтом одновременно несколькими разработчиками. Кроме того. при компиляции Web -сайта выводятся ошибки и предупреждения не только о проблемах с программным кодом, но и о проблемах с кодом HTML и в тексте файла Web . config .
- в предыдущих версиях разработка производилась на Web -сервере, поэтому исходный программный код неизбежно попадал на Web -сервер (обычно, конечно, на сервер, специально предназначенный для разработки). В ASP . NET 2.0 можно вообще избежать попадания исходного кода на какой-то Web -сайт. Для этого достаточно создать Web -сайт локально, затем полностью его откопилировать при помощи команды Build Web Site , а затем уже развертывать приложение ASP . NET на Web -сервере. В этом случае на Web -сервер попадет только откомпилированный программный код.
- одна из самых важных новых возможностей ASP . NET 2.0, которой очень не хватало в предыдущих версиях — мастер-страницы ( master pages ). Мастер-страницы — это аналоги шаблонов в Macromedia DreamViewer . При помощи мастер-страниц можно определить единообразное оформление и общие элементы для других страниц HTML . При внесении изменений в мастер-страницы изменяются те страницы, которые были созданы на их основе. При работе с Web -сайтами, для которых предусмотрено большое количество статических страниц, без мастер-страниц обычно не обойтись;
- весь генерируемый код HTML по умолчанию соответствует стандарту XHTML 1.1;
- по другому реализована работа со страницами кода ( code — behind pages ). В предыдущих версиях ASP . NET в коде описывался весь класс Page для соответствующей страницы. При этом значительная часть кода могла не использоваться разработчиками. В ASP . NET 2.0 в страницу кода помещается только действительно используемый код, такой, как код обработчиков событий. При этом при необходимости можно работать и с любыми другими объектами, связанными со страницами. За счет этого упрощается поиск нужной информации на странице кода и снижается количество ошибок (например, за счет того, что большое количество автогенерируемого кода, который разработчик может случайно изменить, уже не отображается на странице).
- в ASP . NET 2.0 появился новый класс элементов управления: адаптеры. При помощи адаптеров вы можете определить отображение ваших Web -сайтов в зависимости от того, из какого Web -броузера или мобильного устройства к нему производится обращение. Такой подход позволяет быстро создавать Web -сайты, которые будут правильно отображаться в самых разных броузерах и мобильных устройствах.
- появилось большое количество новых элементов управления для сопряжения Web -сайтов с базами данных:
- DataSource — этот элемент управления предназначен для хранения информации о подключении к источнику данных;
- GridView — этот элемент управления расширяет функциональность элемента управления DataGrid из предыдущих версий (элемент DataGrid также можно использовать). Он позволяет стандартными способами решать задачи, для которых раньше приходилось создавать свой собственный программный код (например, по изменению данных на источнике, по сортировке, по разбиению на страницы и т.п.);
- DetailsView — специальный элемент управления, который предназначен для отображения одной записи в один момент времени;
- FormView — элемент управления, очень похожий по функциональности на DetailView , однако предоставляющий больше свободы с точки зрения размещения полей на странице. Он используется для создания форм для работы с записями в базе данных;
- для централизованного управления подключениями к источникам данных информацию о подключениях можно помещать в файл Web . config . Предусмотрена также возможность шифровать в нем информацию о подключениях.
- для взаимодействия с бизнес-логикой приложения предусмотрен новый объект ObjectDataSource . Он может использоваться для вызова методов программных объектов, например, для внесения изменений на источник данных в соответствии с логикой приложения.
Переходим от VBScript к ASP и ASP.NET. Безопасность и синтаксис
Архив номеров / 2006 / Выпуск №1 (38) / Переходим от VBScript к ASP и ASP.NET. Безопасность и синтаксис
|