ASP.NET MVC Урок 1-F / ASP.NET MVC Урок 8
.pdf$63 1(7 09& ǻȘȖȒ 9LHZ 5D]RU șȚȘȈȕȐȞȈ ȖȠȐȉȒȐ
tutorial
ASP*, .NET*
Цель урока. Научиться делать вывод данных в html, использование Razor. Helperы. PageableData. Динамические формы. RedirectToLogin, RedirectToNotFoundPage. Страница ошибки. RssActionResult.
Основа
Итак, рассмотрим как устроена часть View.
В контроллере все actionметоды возвращают тип ActionResult. И для вывода результата мы используем:
UHWXUQ 9LHZ PRGHO'DWD
Основными параметрами View может быть:
Имя, обычно оно совпадает с именем actionметода. В случае если надо вызвать иной по имени View, то используется конструкция UHWXUQ 9LHZ ³9LHZ1DPH´ PRGHO'DWD
Данные для отображения во View. Необязательный параметр. При передаче во View этот объект данных будет обозначаться Model. Для связывания типа данных во View указывается ожидаемый тип данных:
#PRGHO /HVVRQ3URMHFW0RGHO 8VHU
Layout. Необязательный параметр. При указании этого параметра по данной строке найдется страницаконтейнер и вызовется. Viewчасть будет обработана методом
RenderBody()
Выбор, какой же View использовать происходит следующим образом:
Ищется в папке /Areas/[Area]/Views/[ControllerName]/
Ищется в папке /Areas/[Area]/Views/Shared/
Ищется в папке /Views/[ControllerName]/ Ищется в папке /Views/Shared/
приступим к изучению.
Razor
При создании View есть выбор между двумя движками: ASPX и Razor. Первый мы не будем использовать в дальнейшем, поэтому поговорим о Razor.
ASPX был громозким движком с тегами ! для выполнения кода и !для вывода данных.
Razor использует конструкцию #0RGHO 1DPH. Т.е. всё, что начинается с #переводит в режим или исполнения кода, или вывода данных #IRUHDFK ^«`, или #LI ^ « ` HOVH ^ « `:
#LI 0RGHO$Q\
^
S!ɋɩɢɫɨɤS!
`
#IRUHDFK YDU UROH LQ 0RGHO
^
GLY FODVV LWHP!
VSDQ FODVV LG!
#UROH ,'
VSDQ!
VSDQ FODVV QDPH!
#UROH 1DPH
VSDQ!
VSDQ FODVV &RGH!
#UROH &RGH
VSDQ!
GLY!
`
Внутри { } находятся теги – это маркер того, что это шаблон. Для простого выполнения кода внутри шаблона используем структуру @{ code }, для корректного вывода данных внутри атрибутов или текстом конструкция — @(string result):
#^
LQW L
`
#IRUHDFK YDU UROH LQ 0RGHO
^
GLY FODVV LWHP # L " RGG !
VSDQ FODVV LG!
#UROH ,'
VSDQ!
VSDQ FODVV QDPH!
#UROH 1DPH
VSDQ!
VSDQ FODVV &RGH!
#UROH &RGH
VSDQ!
GLY!
L
`
Чтобы вывести не теговый текст, нужно использовать псевдотеги WH[W! WH[W!:
#IRUHDFK YDU UROH LQ 0RGHO
^
#UROH 1DPHWH[W!WH[W!
`
Для вывода htmlтекста – или должна возвращаться MvcHtmlString, или использовать конструкцию Html.Raw(htmlstringvalue), иначе текст будет выведен с экранированием тегов.
PageableData
Рассмотрим постраничный вывод таблицы из БД. Проанализируем:
1.Контроллер должен получить в параметрах значение страницы, которую мы будем выводить
2.По умолчанию это будет первая страница
3.При выводе, мы должны знать:
1.Список элементов БД, которые выводим
2.Количество страниц
3.Текущую страницу
Создадим Genericкласс PageableData (/Models/Info/PageableData.cs):
SXEOLF FODVV 3DJHDEOH'DWD 7!ZKHUH 7 FODVV
^
SURWHFWHG VWDWLF LQW,WHP3HU3DJH'HIDXOW
SXEOLF,(QXPHUDEOH 7! /LVW ^JHW VHW`
SXEOLF LQW3DJH1R ^JHW VHW`
SXEOLF LQW&RXQW3DJH ^JHW VHW`
SXEOLF LQW,WHP3HU3DJH ^JHW VHW`
SXEOLF 3DJHDEOH'DWD,4XHU\DEOH 7! TXHU\DEOH6HWLQWSDJHLQWLWHP3HU3DJH
^
LILWHP3HU3DJH
^
LWHP3HU3DJH ,WHP3HU3DJH'HIDXOW
`
,WHP3HU3DJH LWHP3HU3DJH
3DJH1R SDJH
YDUFRXQW TXHU\DEOH6HW &RXQW
&RXQW3DJH LQW GHFLPDO5HPDLQGHU FRXQW LWHP3HU3DJH " FRXQW LWHP3HU3DJH F RXQW LWHP3HU3DJH
/LVW TXHU\DEOH6HW 6NLS 3DJH1R LWHP3HU3DJH 7DNH LWHP3HU3DJH
`
`
По умолчанию количество выводимых значений на странице – 20, но мы можем изменить этот параметр в конструкторе. Передаем IQueryable и вычисляем колво страниц CountPage. Используя PageNo, выбираем страницу:
/LVW TXHU\DEOH6HW 6NLS 3DJH1R LWHP3HU3DJH 7DNH LWHP3HU3DJH
В контроллере используем:
SXEOLF FODVV 8VHU&RQWUROOHU 'HIDXOW&RQWUROOHU
^
SXEOLF $FWLRQ5HVXOW,QGH[ LQWSDJH
^
YDUGDWD QHZ3DJHDEOH'DWD 8VHU! 5HSRVLWRU\ 8VHUV SDJH
UHWXUQ9LHZ GDWD
`
«
Во View используем данный класс:
#PRGHO /HVVRQ3URMHFW 0RGHOV ,QIR 3DJHDEOH'DWD/HVVRQ3URMHFW 0RGHO 8VHU!
#^
9LHZ%DJ 7LWOH 8VHUV
/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO
`
K!8VHUVK!
S!
#IRUHDFK YDU XVHU LQ 0RGHO /LVW
^
GLY FODVV LWHP!
VSDQ FODVV LG!
#XVHU ,'
VSDQ!
VSDQ FODVV HPDLO!
#XVHU (PDLO
VSDQ!
VSDQ FODVV DFWLYDWH'DWH!
#XVHU$GGHG'DWH
VSDQ!
GLY!
`
S!
Запускаем, проверяем (http://localhost/User)
Для продолжения, сгенерируем больше данных (просто ctrlc, ctrlv в таблице в Server Explorer)
Перейдем к созданию Helper’а пагинатора, который даст нам возможность пролистывать этот список.
Helper (PagerHelper)
Так как мы используем bootstrap, то и на базе него будем делать пагинатор. В коде он выглядит так:
GLY FODVV SDJLQDWLRQ!
XO!
OL!D KUHI !3UHYD!OL!
OL!D KUHI !D!OL!
OL!D KUHI !D!OL!
OL!D KUHI !D!OL!
OL!D KUHI !D!OL!
OL!D KUHI !D!OL!
OL!D KUHI !1H[WD!OL!
XO!
GLY!
Нас интересует только внутренняя часть XO! XO!.
Helper создается как Extension для класса System.Web.Mvc.HtmlHelper. План таков:
Вывести Prev (сделать активным если надо)
Вывести ссылки на первые три страницы 1, 2, 3
Вывести троеточие, если необходимо
Вывести активной ссылку текущей страницы
Вывести троеточие, если необходимо
Вывести последние три страницы
Вывести Next (сделать активной если надо) Заключить всё в ul и вывести как MvcHtmlString
Код будет выглядеть так:
SXEOLF VWDWLF0YF+WPO6WULQJ3DJH/LQNV WKLV+WPO+HOSHU KWPOLQWFXUUHQW3DJHLQWWRWDO3DJHV )XQ FLQW VWULQJ! SDJH8UO
^
6WULQJ%XLOGHU EXLOGHU QHZ6WULQJ%XLOGHU
3UHY
YDUSUHY%XLOGHU QHZ7DJ%XLOGHUD
SUHY%XLOGHU ,QQHU+WPO ©
LIFXUUHQW3DJH
^
SUHY%XLOGHU 0HUJH$WWULEXWHKUHI
EXLOGHU$SSHQG/LQHOL FODVV ? DFWLYH? !SUHY%XLOGHU 7R6WULQJOL!
`
HOVH
^
SUHY%XLOGHU 0HUJH$WWULEXWHKUHISDJH8UO ,QYRNH FXUUHQW3DJH
EXLOGHU$SSHQG/LQHOL!SUHY%XLOGHU 7R6WULQJOL!
`
ɉɨ ɩɨɪɹɞɤɭ
IRU LQWL L WRWDO3DJHV L
^
ɍɫɥɨɜɢɟ ɱɬɨ ɜɵɜɨɞɢɦ ɬɨɥɶɤɨ ɧɟɨɛɯɨɞɢɦɵɟ ɧɨɦɟɪɚ
LIL __L ! WRWDO3DJHV __L ! FXUUHQW3DJH L FXU UHQW3DJH
^
YDUVXE%XLOGHU QHZ7DJ%XLOGHUD
VXE%XLOGHU ,QQHU+WPO L 7R6WULQJ &XOWXUH,QIR ,QYDULDQW&XOWXUH
LIL FXUUHQW3DJH
^
VXE%XLOGHU 0HUJH$WWULEXWHKUHI
EXLOGHU$SSHQG/LQHOL FODVV ? DFWLYH? !VXE%XLOGHU 7R6WULQJO L!
`
HOVH
^
VXE%XLOGHU 0HUJH$WWULEXWHKUHISDJH8UO ,QYRNH L
EXLOGHU$SSHQG/LQHOL!VXE%XLOGHU 7R6WULQJOL!
`
`
HOVH LIL FXUUHQW3DJH !
^
Ɍɪɨɟɬɨɱɢɟ ɩɟɪɜɨɟ
EXLOGHU$SSHQG/LQHOL FODVV ? GLVDEOHG? ! D KUHI ? ? ! D! OL!
`
HOVH LIL WRWDO3DJHV FXUUHQW3DJH WRWDO3DJHV
^
Ɍɪɨɟɬɨɱɢɟ ɜɬɨɪɨɟ
EXLOGHU$SSHQG/LQHOL FODVV ? GLVDEOHG? ! D KUHI ? ? ! D! OL!
`
`
1H[W
YDUQH[W%XLOGHU QHZ7DJ%XLOGHUD
QH[W%XLOGHU ,QQHU+WPO ª
LIFXUUHQW3DJH WRWDO3DJHV
^
QH[W%XLOGHU 0HUJH$WWULEXWHKUHI
EXLOGHU$SSHQG/LQHOL FODVV ? DFWLYH? !QH[W%XLOGHU 7R6WULQJOL!
`
HOVH
^
QH[W%XLOGHU 0HUJH$WWULEXWHKUHISDJH8UO ,QYRNH FXUUHQW3DJH
EXLOGHU$SSHQG/LQHOL!QH[W%XLOGHU 7R6WULQJOL!
`
UHWXUQ QHZ0YF+WPO6WULQJXO!EXLOGHU 7R6WULQJXO!
`
Добавим namespace LessonProject.Helper в объявления во View. Это можно сделать двумя
способами:
В самом View
#XVLQJ /HVVRQ3URMHFW +HOSHU
В Web.config (рекомендуется)
FRQILJ6HFWLRQV!
«
VHFWLRQ*URXS QDPH V\VWHP ZHE ZHE3DJHV UD]RU W\SH 6\VWHP :HE :HE3DJHV 5D]RU &RQILJXUDWLR Q 5D]RU:HE6HFWLRQ*URXS 6\VWHP :HE :HE3DJHV 5D]RU 9HUVLRQ &XOWXUH QHXWUDO 3XEOLF
.H\7RNHQ %)$' (!
VHFWLRQ QDPH KRVW W\SH 6\VWHP :HE :HE3DJHV 5D]RU &RQILJXUDWLRQ +RVW6HFWLRQ 6\VWH P :HE :HE3DJHV 5D]RU 9HUVLRQ &XOWXUH QHXWUDO 3XEOLF.H\7RNHQ %)$' ( UH TXLUH3HUPLVVLRQ IDOVH!
VHFWLRQ QDPH SDJHV W\SH 6\VWHP :HE :HE3DJHV 5D]RU &RQILJXUDWLRQ 5D]RU3DJHV6HFWLR Q 6\VWHP :HE :HE3DJHV 5D]RU 9HUVLRQ &XOWXUH QHXWUDO 3XEOLF.H\7RNHQ %)$' ( UHTXLUH3HUPLVVLRQ IDOVH!
VHFWLRQ*URXS!
FRQILJ6HFWLRQV!
V\VWHP ZHE ZHE3DJHV UD]RU!
SDJHV SDJH%DVH7\SH 6\VWHP :HE 0YF :HE9LHZ3DJH!
QDPHVSDFHV!
DGG QDPHVSDFH /HVVRQ3URMHFW +HOSHU!
QDPHVSDFHV!
SDJHV!V\VWHP ZHE ZHE3DJHV UD]RU!
Добавляем пагинатор во View:
GLY FODVV SDJLQDWLRQ!
#+WPO 3DJH/LQNV 0RGHO 3DJH1R 0RGHO &RXQW3DJH [ ! 8UO$FWLRQ ,QGH[ QHZ ^SDJH [`
GLY!
Обратите внимание на конструкцию
[ ! 8UO$FWLRQ ,QGH[ QHZ ^SDJH [`
Это делегат, который возвращает ссылку на страницу. А Url.Action() – формирует ссылку на страницу /User/Index с параметром page = x.
Вот что получилось (уменьшил количество вывода на странице до 5, чтобы образовалось больше страниц):
SearchEngine
Следующим шагом к просмотру данных будет создание поиска. Поиск будет простой, по совпадению подстроки в одном из полей данных. Входной параметр – searchString.
SXEOLF $FWLRQ5HVXOW,QGH[ LQWSDJH VWULQJVHDUFK6WULQJ QXOO
^
LI VWULQJ,V1XOO2U:KLWH6SDFH VHDUFK6WULQJ
^
ɬɭɬ ɉɨɢɫɤ
UHWXUQ9LHZ GDWD
`
HOVH
^
YDUGDWD QHZ3DJHDEOH'DWD 8VHU! 5HSRVLWRU\ 8VHUV SDJH
UHWXUQ9LHZ GDWD
`
`
Создадим класс 6HDUFK(QJLQH, который принимает значения,4XHU\DEOH 8VHU!, и строку поиска,
а возвращает данные по поиску (/Global/SearchEngine.cs):
Первым делом, создадим классы по очистке строки запроса, никаких тегов и убираем разделители типа [,], {,}, (,):
VXPPDU\!
7KH UHJH[ VWULS KWPO
VXPPDU\!
SULYDWH VWDWLF UHDGRQO\5HJH[ 5HJH[6WULS+WPO QHZ5HJH[>A!@ !5HJH[2SWLRQV &RPSLOH
G
SULYDWH VWDWLF VWULQJ 6WULS+WPO VWULQJKWPO
^
UHWXUQ VWULQJ,V1XOO2U:KLWH6SDFH KWPO "VWULQJ(PSW\
5HJH[6WULS+WPO 5HSODFH KWPOVWULQJ(PSW\ 7ULP
`
SULYDWH VWDWLF VWULQJ &OHDQ&RQWHQW VWULQJFRQWHQWERROUHPRYH+WPO
^
LIUHPRYH+WPO
^
FRQWHQW 6WULS+WPO FRQWHQW
`
FRQWHQW
FRQWHQW 5HSODFH?? VWULQJ(PSW\
5HSODFH _ VWULQJ(PSW\
5HSODFH VWULQJ(PSW\
5HSODFH VWULQJ(PSW\
5HSODFH> VWULQJ(PSW\
5HSODFH@ VWULQJ(PSW\
5HSODFH VWULQJ(PSW\
5HSODFH" VWULQJ(PSW\
5HSODFH` VWULQJ(PSW\
5HSODFH^ VWULQJ(PSW\
5HSODFHA VWULQJ(PSW\
5HSODFH VWULQJ(PSW\
YDUZRUGV FRQWHQW 6SOLWQHZ>@ ^ ?Q ?U` 6WULQJ6SOLW2SWLRQV 5HPRYH(PSW\(Q WULHV
YDUVE QHZ6WULQJ%XLOGHU
IRUHDFK YDUZRUGLQ
ZRUGV 6HOHFW W ! W 7R/RZHU,QYDULDQW 7ULP :KHUH ZRUG ! ZRUG /HQJWK !
^
VE$SSHQG)RUPDW^ `ZRUG
`
UHWXUQVE 7R6WULQJ
`
Создаем поиск:
SXEOLF VWDWLF,(QXPHUDEOH 8VHU!6HDUFK VWULQJVHDUFK6WULQJ ,4XHU\DEOH 8VHU! VRXUFH
^
YDUWHUP &OHDQ&RQWHQW VHDUFK6WULQJ 7R/RZHU,QYDULDQW 7ULPIDOVH
YDUWHUPV WHUP 6SOLWQHZ>@ ^ ` 6WULQJ6SOLW2SWLRQV 5HPRYH(PSW\(QWULHV
YDUUHJH[ VWULQJ)RUPDW &XOWXUH,QIR ,QYDULDQW&XOWXUH^ ` VWULQJ -RLQ _ WHU