ASP.NET MVC Урок 1-F / ASP.NET MVC Урок 9
.pdf$63 1(7 09& ǻȘȖȒ &RQILJXUDWLRQ Ȑ ȏȈȋȘțȏȒȈ ȜȈȑȓȖȊ
tutorial
ASP*, .NET*
Цель урока. Научиться использовать файл конфигурации Web.config. Application section, создание своих ConfigSection и IConfig. Научиться загружать файлы, использование fileuploader для загрузки файла, последующая обработка файла.
В этом уроке мы рассмотрим работу с конфигурационным файлом Web.config. Это xmlфайл и в нем хранятся настройки программы.
Рассмотрим подробнее, из чего состоит этот файл:
configSection. Это секция отвечает за то, какие классы будут обрабатывать далее объявленные секции. Состоит из атрибута name — это тег, далее объявленной секции, и type – к какому классу относится.
connectionStrings. Это секция отвечает за работу с указанием строк инициализаций соединений с базами данных.
appSettings. Секция параметров типа key/value.
system.web, system.webServer. Секции параметров для работы вебприложения.
runtime. Секция по настройке в режиме выполнения. Определение зависимостей между dll. Остальные секции. Другие секции с параметрами, объявленными в configSection.
IConfig (и реализация).
Аналогично Repository, конфигуратор будем создавать как сервис. Создаем IConfig и Config
реализацию в папке Global (/Global/Config/IConfig.cs):
SXEOLF LQWHUIDFH ,&RQILJ
^
VWULQJ/DQJ ^JHW`
`
И
SXEOLF FODVV &RQILJ ,&RQILJ
^
SXEOLF VWULQJ/DQJ
^
JHW
^
UHWXUQ UX
`
`
`
Добавляем строку в RegisterServices (/App_Start/NinjectWebCommon.cs):
NHUQHO %LQG ,&RQILJ! 7R &RQILJ! ,Q6LQJOHWRQ6FRSH
И выводим в BaseController:
>,QMHFW@
SXEOLF,&RQILJ &RQILJ ^JHW VHW`
Теперь сделаем в инициализации контроллера переопеределение CultureInfo в потоке
(/Controllers/BaseController.cs):
SURWHFWHG RYHUULGH YRLG ,QLWLDOL]H6\VWHP :HE 5RXWLQJ 5HTXHVW&RQWH[W UHTXHVW&RQWH[W
^
WU\
^
YDUFXOWXUH,QIR QHZ&XOWXUH,QIR &RQILJ /DQJ
7KUHDG &XUUHQW7KUHDG &XUUHQW&XOWXUH FXOWXUH,QIR
7KUHDG &XUUHQW7KUHDG &XUUHQW8,&XOWXUH FXOWXUH,QIR
`
FDWFK([FHSWLRQ H[
^
ORJJHU (UURU&XOWXUH QRW IRXQGH[
`
EDVH,QLWLDOL]H UHTXHVW&RQWH[W
`
И добавим вывод даты в Index.cshtml (/Areas/Default/Views/Home/Index.cshtml):
#'DWH7LPH 1RZ 7R6WULQJ '
Получаем вывод:
И понастоящему свяжем это с Web.Config. Добавим в Web.config в appSettings строку:
DGG NH\ &XOWXUH YDOXH UX!
В Config.cs (/Global/Config/Config.cs):
SXEOLF VWULQJ/DQJ
^
JHW
^
UHWXUQ&RQILJXUDWLRQ0DQDJHU$SS6HWWLQJV>&XOWXUH@DV VWULQJ
`
`
Запускаем – результат тот же, теперь изменим значение в Web.config на fr:
DGG NH\ &XOWXUH YDOXH IU!
Получаем дату:
PDUGL PDUV
Отлично! Можете попробовать еще с несколькими языками. Список сокращений находится тут http://msdn.microsoft.com/enus/goglobal/bb896001.aspx
Создание своих типов ConfigSection
В этой части мы рассмотрим создание своих собственных ConfigSection. В этой главе мы реализуем загрузку файлов и создание превью. Нам понадобятся следующие данные: вопервых, зависимость mimetype от расширения, и иконка файлов (для скачивания, например):
расширение
mimetype
большая иконка маленькая иконка
и вовторых, данные для создания превью:
наименование превью (например, UserAvatarSize)
ширина высота
Оба типа делаются одинаково, так что я распишу только создание одного из них. Пусть это будет IconSize, для создания превью. Первое, что надо сделать — это создать класс, наследуемый
ConfigurationElement (/Global/Config/IconSize.cs):
SXEOLF FODVV ,FRQ6L]H &RQILJXUDWLRQ(OHPHQW
^
>&RQILJXUDWLRQ3URSHUW\QDPH,V5HTXLUHG WUXH,V.H\ WUXH@
SXEOLF VWULQJ1DPH
^
JHW
^
UHWXUQ WKLV>QDPH@DV VWULQJ
`
`
>&RQILJXUDWLRQ3URSHUW\ZLGWK,V5HTXLUHG IDOVH'HIDXOW9DOXH @
SXEOLF LQW:LGWK
^
JHW
^
UHWXUQ LQW WKLV>ZLGWK@
`
`
>&RQILJXUDWLRQ3URSHUW\KHLJKW,V5HTXLUHG IDOVH'HIDXOW9DOXH @
SXEOLF LQW+HLJKW
^
JHW
^
UHWXUQ LQW WKLV>KHLJKW@
`
`
`
Рассмотрим подробнее:
ConfigurationProperty состоит из имени, это имя атрибута в строке
IsRequired – обязательный этот параметр или нет IsKey – является ли ключом (как первичный ключ в БД)
DefaultValue – значение по умолчанию
Следующий шаг – это создание класса коллекции (так как у нас будет множество элементов) и
секции (/Global/Config/IconSize.cs):
SXEOLF FODVV ,FRQ6L]HV&RQILJ6HFWLRQ &RQILJXUDWLRQ6HFWLRQ
^
>&RQILJXUDWLRQ3URSHUW\LFRQ6L]HV@
SXEOLF,FRQ6L]HV&ROOHFWLRQ ,FRQ6L]HV
^
JHW
^
UHWXUQ WKLV>LFRQ6L]HV@DV,FRQ6L]HV&ROOHFWLRQ
`
`
`
SXEOLF FODVV ,FRQ6L]HV&ROOHFWLRQ &RQILJXUDWLRQ(OHPHQW&ROOHFWLRQ
^
SURWHFWHG RYHUULGH&RQILJXUDWLRQ(OHPHQW&UHDWH1HZ(OHPHQW
^
UHWXUQ QHZ,FRQ6L]H
`
SURWHFWHG RYHUULGH REMHFW *HW(OHPHQW.H\&RQILJXUDWLRQ(OHPHQW HOHPHQW
^
UHWXUQ,FRQ6L]H HOHPHQW 1DPH
`
`
В Web.config добавляем:
LFRQ&RQILJ!
LFRQ6L]HV!
DGG QDPH $YDWDU 6L]H ZLGWK KHLJKW !
«
LFRQ6L]HV!LFRQ&RQILJ!
Теперь необходимо объявить класс разбора этой секции в configSection:
VHFWLRQ QDPH LFRQ&RQILJ W\SH /HVVRQ3URMHFW *OREDO &RQILJ ,FRQ6L]HV&RQILJ6HFWLRQ /HVVRQ
3URMHFW!
Обратите внимание, что в описание type необходимо указать имя dll (/HVVRQ3URMHFW), в которой он содержится. Это важно, но будет рассмотрено в unitтестах.
MailSettings
Создадим одиночный конфиг для настроек по работе с smtpпочтой. Нам понадобятся:
SmtpServer. Имя сервера.
SmtpPort. Порт, обычно 25й.
SmtpUserName. Логин.
SmtpPassword. Пароль.
SmtpReply. Обратный адрес в строке Replyto.
SmtpUser. Имя пользователя в строке From. EnableSsl. Да/нет, использовать ли работу по Ssl.
Файл (/Global/Config/MailSetting.cs):
SXEOLF FODVV 0DLO6HWWLQJ &RQILJXUDWLRQ6HFWLRQ
^
>&RQILJXUDWLRQ3URSHUW\6PWS6HUYHU,V5HTXLUHG WUXH@
SXEOLF VWULQJ6PWS6HUYHU
^
JHW
^
UHWXUQ WKLV>6PWS6HUYHU@DV VWULQJ
`
VHW
^
WKLV>6PWS6HUYHU@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\6PWS3RUW,V5HTXLUHG IDOVH'HIDXOW9DOXH @
SXEOLF LQW6PWS3RUW
^
JHW
^
UHWXUQ LQW WKLV>6PWS3RUW@
`
VHW
^
WKLV>6PWS3RUW@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\6PWS8VHU1DPH,V5HTXLUHG WUXH@
SXEOLF VWULQJ6PWS8VHU1DPH
^
JHW
^
UHWXUQ WKLV>6PWS8VHU1DPH@DV VWULQJ
`
VHW
^
WKLV>6PWS8VHU1DPH@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\6PWS3DVVZRUG,V5HTXLUHG WUXH@
SXEOLF VWULQJ6PWS3DVVZRUG
^
JHW
^
UHWXUQ WKLV>6PWS3DVVZRUG@DV VWULQJ
`
VHW
^
WKLV>6PWS3DVVZRUG@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\6PWS5HSO\,V5HTXLUHG WUXH@
SXEOLF VWULQJ6PWS5HSO\
^
JHW
^
UHWXUQ WKLV>6PWS5HSO\@DV VWULQJ
`
VHW
^
WKLV>6PWS5HSO\@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\6PWS8VHU,V5HTXLUHG WUXH@
SXEOLF VWULQJ6PWS8VHU
^
JHW
^
UHWXUQ WKLV>6PWS8VHU@DV VWULQJ
`
VHW
^
WKLV>6PWS8VHU@ YDOXH
`
`
>&RQILJXUDWLRQ3URSHUW\(QDEOH6VO,V5HTXLUHG IDOVH'HIDXOW9DOXH IDOVH@
SXEOLF ERRO(QDEOH6VO
^
JHW
^
UHWXUQ ERRO WKLV>(QDEOH6VO@
`
VHW
^
WKLV>(QDEOH6VO@ YDOXH
`
`
`
Добавим в Web.config:
VHFWLRQ QDPH PDLO&RQILJ W\SH /HVVRQ3URMHFW *OREDO &RQILJ 0DLO6HWWLQJ /HVVRQ3URMHFW!
И
PDLO&RQILJ
6PWS6HUYHU VPWS JPDLO FRP
6PWS3RUW
6PWS8VHU1DPH O[QGUSHWURY
6PWS3DVVZRUG
6PWS5HSO\ O[QGUSHWURY#JPDLO FRP
6PWS8VHU WHVW
(QDEOH6VO WUXH!
Добавим все это теперь в IConfig.cs и Сonfig.cs (/Global/Config/IConfig.cs):
SXEOLF LQWHUIDFH ,&RQILJ
^
VWULQJ/DQJ ^JHW`
,4XHU\DEOH ,FRQ6L]H! ,FRQ6L]HV ^JHW`
,4XHU\DEOH 0LPH7\SH! 0LPH7\SHV ^JHW`
0DLO6HWWLQJ 0DLO6HWWLQJ ^JHW`
`
И
SXEOLF,4XHU\DEOH ,FRQ6L]H! ,FRQ6L]HV
^
JHW
^
,FRQ6L]HV&RQILJ6HFWLRQ FRQILJ,QIR ,FRQ6L]HV&RQILJ6HFWLRQ &RQILJXUDWLRQ0DQDJH U *HW6HFWLRQLFRQ&RQILJ
UHWXUQFRQILJ,QIR ,FRQ6L]HV 2I7\SH ,FRQ6L]H!$V4XHU\DEOH ,FRQ6L]H!
`
`
SXEOLF,4XHU\DEOH 0LPH7\SH! 0LPH7\SHV
^
JHW
^
0LPH7\SHV&RQILJ6HFWLRQ FRQILJ,QIR 0LPH7\SHV&RQILJ6HFWLRQ &RQILJXUDWLRQ0DQDJH U *HW6HFWLRQPLPH&RQILJ
UHWXUQFRQILJ,QIR 0LPH7\SHV 2I7\SH 0LPH7\SH!$V4XHU\DEOH 0LPH7\SH!
`
`
SXEOLF0DLO6HWWLQJ 0DLO6HWWLQJ
^
JHW
^
UHWXUQ0DLO6HWWLQJ &RQILJXUDWLRQ0DQDJHU *HW6HFWLRQPDLO&RQILJ
`
`
Мы еще добавим MailTemplates — шаблоны которые нам понадобятся для рассылки email при регистрации, или при напоминании пароля.
Простая загрузка файлов
Сейчас рассмотрим стандартный пример загрузки файла на сервер, и больше никогда не будем пользоваться таким способом. Класс SimpleFileView для взаимодействия
(/Models/Info/SimpleFileView.cs):
SXEOLF FODVV 6LPSOH)LOH9LHZ
^
SXEOLF+WWS3RVWHG)LOH%DVH 8SORDGHG)LOH ^JHW VHW`
`
Обратите внимание на наименование класса для приема файлов. Итак, создадим контроллер
SimpleFileController (/Areas/Default/Controllers/SimpleFileController.cs):
SXEOLF FODVV 6LPSOH)LOH&RQWUROOHU 'HIDXOW&RQWUROOHU
^
>+WWS*HW@
SXEOLF $FWLRQ5HVXOW,QGH[
^
UHWXUQ9LHZQHZ6LPSOH)LOH9LHZ
`
>+WWS3RVW@
SXEOLF $FWLRQ5HVXOW,QGH[6LPSOH)LOH9LHZ VLPSOH)LOH9LHZ
^
UHWXUQ9LHZ VLPSOH)LOH9LHZ
`
`
И добавим View:
#PRGHO /HVVRQ3URMHFW 0RGHOV ,QIR 6LPSOH)LOH9LHZ
#^
9LHZ%DJ 7LWOH ,QGH[
/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO
`
K!,QGH[K!
#XVLQJ +WPO %HJLQ)RUP ,QGH[ 6LPSOH)LOH )RUP0HWKRG 3RVW QHZ ^HQFW\SH PXOWLSDUW IRUP GDW D #FODVV IRUP KRUL]RQWDO `
^
ILHOGVHW!
GLY FODVV FRQWURO JURXS!
ODEHO FODVV FRQWURO ODEHO IRU (PDLO!
Ɂɚɝɪɭɡɢɬɟ ɮɚɣɥODEHO!
GLY FODVV FRQWUROV!
#+WPO 7H[W%R[ 8SORDGHG)LOH 0RGHO 8SORDGHG)LOH QHZ ^ W\SH ILOH #FODVV LQSXW [ODUJH `
#+WPO 9DOLGDWLRQ0HVVDJH 8SORDGHG)LOH
GLY!
GLY!
GLY FODVV IRUP DFWLRQV!
EXWWRQ W\SH VXEPLW FODVV EWQ EWQ SULPDU\!
8SORDGEXWWRQ!
GLY!