Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ASP.NET MVC Урок 1-F / ASP.NET MVC Урок 8

.pdf
Скачиваний:
42
Добавлен:
09.03.2016
Размер:
573.27 Кб
Скачать

PV

IRUHDFK YDUHQWU\LQVRXUFH

^

YDUUDQN

LI VWULQJ,V1XOO2U:KLWH6SDFH HQWU\ (PDLO

^

UDQN 5HJH[ 0DWFKHV HQWU\ (PDLO 7R/RZHU,QYDULDQW UHJH[ &RXQW

`

LIUDQN !

^

\LHOG UHWXUQHQWU\

`

`

`

В первой строке очищаем строку запроса. Создаем regex для поиска. В данном случае, мы ищем только в поле Email у пользователей.

Как это работает:

При вводе слова в поиске, например, «cher [2]», вначале убираем разделители, получаем

«cher 2».

Создаем regex = (cher|2).

Просматриваем весь список, переданный через,4XHU\DEOH 8VHU!

Если есть совпадение, то выносим его в IEnumerable — yield return entry

Изменяем Action (/Areas/Default/Controller/UserController.cs):

SXEOLF$FWLRQ5HVXOW ,QGH[ LQW SDJH VWULQJ VHDUFK6WULQJ QXOO

^

9LHZ%DJ 6HDUFK VHDUFK6WULQJ

LI VWULQJ ,V1XOO2U:KLWH6SDFH VHDUFK6WULQJ

^

YDU OLVW 6HDUFK(QJLQH 6HDUFK VHDUFK6WULQJ 5HSRVLWRU\ 8VHUV$V4XHU\DEOH

YDU GDWD QHZ 3DJHDEOH'DWD8VHU! OLVW SDJH

UHWXUQ 9LHZ GDWD

`

HOVH

^

YDU GDWD QHZ 3DJHDEOH'DWD8VHU! 5HSRVLWRU\ 8VHUV SDJH

UHWXUQ 9LHZ GDWD

`

`

Добавляем форму поиска во View:

#^

9LHZ%DJ 7LWOH 8VHUV

/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO

YDU VHDUFK6WULQJ VWULQJ 9LHZ%DJ 6HDUFK

`

K!8VHUVK!

#XVLQJ +WPO %HJLQ)RUP ,QGH[ 8VHU )RUP0HWKRG 3RVW QHZ ^ #FODVV IRUP VHDUFK `

^

#+WPO 7H[W%R[ VHDUFK6WULQJ VHDUFK6WULQJ "" QHZ ^ #FODVV LQSXW PHGLXP VHDUFK TXHU\ `

EXWWRQ W\SH VXEPLW FODVV EWQ!ɉɨɢɫɤEXWWRQ!

`

Обратите внимание на 9LHZ%DJ, это dynamic контейнер, им можно пользоваться для передачи второстепенных данных.

Добавим в пагинатор строку поиска:

#+WPO 3DJH/LQNV 0RGHO 3DJH1R 0RGHO &RXQW3DJH [ ! 8UO$FWLRQ ,QGH[ QHZ ^SDJH [ VHDUFK6WULQJ`

Extension

Расширения для строк или целых чисел очень удобно использовать в проекте. Мы сделаем несколько реализаций, но вынесем это в отдельный проект. Добавим проект LessonProject.Tools class WebExtensions:

SXEOLF VWDWLF FODVV :HE([WHQVLRQV

^

`

Пропишем в reference LessonProject.

Многострочные данные хранятся с разделителем \r\n, и при выводе в тексте эти разделители не учитываются. Необходимо создать функцию NlToBr(). Создаем:

SXEOLF VWDWLF0YF+WPO6WULQJ1O7R%U WKLV VWULQJVRXUFH

^

LI VWULQJ,V1XOO2U:KLWH6SDFH VRXUFH

^

UHWXUQ QHZ0YF+WPO6WULQJVWULQJ(PSW\

`

UHWXUQ QHZ0YF+WPO6WULQJ VRXUFH 5HSODFH (QYLURQPHQW 1HZ/LQHEU !

`

Добавляем объявление в Web.config:

DGG QDPHVSDFH /HVVRQ3URMHFW 7RROV!

Можно использовать:

#0RGHO 'HVFULSWLRQ 1O7R%U

Так же создадим расширение Teaser, которое урезает строку до максимального допустимого количества символов, и ставит «…» после, если строка оказалась длиннее.

SXEOLF VWDWLF VWULQJ 7HDVHU WKLV VWULQJFRQWHQWLQWOHQJWKVWULQJPRUH

^

LI VWULQJ,V1XOO2U:KLWH6SDFH FRQWHQW

^

UHWXUQ VWULQJ(PSW\

`

LIFRQWHQW /HQJWK OHQJWK

^

UHWXUQFRQWHQW

`

UHWXUQFRQWHQW 6XEVWULQJ OHQJWK PRUH

`

Использовать можно:

#0RGHO 'HVFULSWLRQ 7HDVHU ³!!!´

Следующее расширение относится к целым числам и подставляет одно из слов в определении для 1, 2 или 5. Например, 1 год, 2 года, 5 лет:

SXEOLF VWDWLF VWULQJ &RXQW:RUG WKLV LQWFRXQWVWULQJILUVWVWULQJVHFRQGVWULQJILYH

^

LIFRXQW LQWFRXQW

^

UHWXUQILUVW

`

LIFRXQW ! FRXQW LQWFRXQW

^

UHWXUQVHFRQG

`

UHWXUQILYH

`

Использовать можно так:

#\HDU #\HDU &RXQW:RUG ³ɝɨɞ´ ³ɝɨɞɚ´ ³ɥɟɬ´

Динамические формы

Я уже писал статью на эту тему. Но то был asp.net mvc первый, а сейчас можно сделать все намного проще.

Значит, проблема заключается в следующем. Мы на post­action в контроллере принимаем объект, у которого, заранее не известно количество полей. Например, это будет следующая структура:

SXEOLF FODVV 2ZQHUVKLS

^

SXEOLF VWULQJ1DPH ^JHW VHW`

SXEOLF LQW3ULFH ^JHW VHW`

`

SXEOLF FODVV &XVWRPHU

^

SXEOLF LQW,' ^JHW VHW`

SXEOLF VWULQJ1DPH ^JHW VHW`

SXEOLF'LFWLRQDU\VWULQJ2ZQHUVKLS! 2ZQHUVKLSV ^JHW VHW`

`

Можно использовать и List вместо Dictionary, но, в будущем, будут проблемы с валидацией для определенного элемента.

Создадим контроллер:

SXEOLF FODVV &XVWRPHU&RQWUROOHU 'HIDXOW&RQWUROOHU

^

>+WWS*HW@

SXEOLF $FWLRQ5HVXOW(GLW LQWLG

^

UHWXUQ9LHZQHZ&XVWRPHU

^

2ZQHUVKLSV QHZ'LFWLRQDU\VWULQJ2ZQHUVKLS!

`

`

>+WWS3RVW@

SXEOLF $FWLRQ5HVXOW(GLW&XVWRPHU FXVWRPHU

^

LI0RGHO6WDWH ,V9DOLG

^

`

UHWXUQ9LHZ FXVWRPHU

`

`

В БД мы не будем ничего записывать, поэтому здесь просто заглушка. Добавляем View:

#PRGHO /HVVRQ3URMHFW 0RGHOV ,QIR &XVWRPHU

#^

9LHZ%DJ 7LWOH (GLW

/D\RXW a$UHDV 'HIDXOW 9LHZV 6KDUHG B/D\RXW FVKWPO

`

#VHFWLRQ VFULSWV ^

#6FULSWV 5HQGHU 6FULSWV GHIDXOW FXVWRPHU HGLW MV

`

K!(GLWK!

#XVLQJ +WPO %HJLQ)RUP (GLW &XVWRPHU )RUP0HWKRG 3RVW QHZ ^ #FODVV IRUP KRUL]RQWDO `

^

ILHOGVHW!

#+WPO +LGGHQ ,' 0RGHO ,'

GLY FODVV FRQWURO JURXS!

ODEHO FODVV FRQWURO ODEHO IRU (PDLO!

1DPHODEHO!

GLY FODVV FRQWUROV!

#+WPO 7H[W%R[ 1DPH 0RGHO 1DPH QHZ ^ #FODVV LQSXW [ODUJH `

#+WPO 9DOLGDWLRQ0HVVDJH 1DPH

GLY!

GLY!

GLY LG 2ZQHUVKLS/LVW:UDSSHU!

GLY FODVV EWQ LG $GG2ZQHUVKLS!ȾɨɛɚɜɢɬɶGLY!

#IRUHDFK YDU NH\9DOXH3DLU LQ 0RGHO 2ZQHUVKLSV

^

#+WPO 3DUWLDO 2ZQHUVKLS,WHP NH\9DOXH3DLU

`

GLY!

GLY FODVV IRUP DFWLRQV!

EXWWRQ W\SH VXEPLW FODVV EWQ EWQ SULPDU\!

ɈɤEXWWRQ!

GLY!

ILHOGVHW!

`

.H\9DOXH3DLUпереносим в 3DUWLDO9LHZ(/Areas/Default/Views/Customer/OwnershipItem.cshtml):

#PRGHO .H\9DOXH3DLUVWULQJ /HVVRQ3URMHFW 0RGHOV ,QIR 2ZQHUVKLS!

GLY FODVV 2ZQHUVKLS:UDSSHU!

GLY FODVV EWQ UHPRYH OLQH!ɍɞɚɥɢɬɶGLY!

GLY FODVV FRQWURO JURXS!

ODEHO FODVV FRQWURO ODEHO!

ɂɦɹ

ODEHO!

GLY FODVV FRQWUROV!

#+WPO 7H[W%R[ 2ZQHUVKLSV> 0RGHO .H\ @ 1DPH 0RGHO 9DOXH 1DPH QHZ ^ #FODVV

LQSXW [ODUJH `

#+WPO 9DOLGDWLRQ0HVVDJH 2ZQHUVKLSV> 0RGHO .H\ @ 1DPH

GLY!

GLY!

GLY FODVV FRQWURO JURXS!

ODEHO FODVV FRQWURO ODEHO!

ɐɟɧɚ

ODEHO!

GLY FODVV FRQWUROV!

#+WPO 7H[W%R[ 2ZQHUVKLSV> 0RGHO .H\ @ 3ULFH 0RGHO 9DOXH 3ULFH QHZ ^ #FODVV

LQSXW [ODUJH `

#+WPO 9DOLGDWLRQ0HVVDJH 2ZQHUVKLSV> 0RGHO .H\ @ 3ULFH

GLY!

GLY!GLY!

Js­обработчик состоит из обработки кнопок добавления и удаления (/Scripts/default/customer­ edit.js):

IXQFWLRQ &XVWRPHU(GLW^

BWKLV WKLV

WKLVDMD[$GG2ZQHUVKLS &XVWRPHU$GG2ZQHUVKLS

WKLVLQLW IXQFWLRQ^

$GG2ZQHUVKLSFOLFNIXQFWLRQ^

DMD[ ^

W\SH*(7

XUO BWKLV DMD[$GG2ZQHUVKLS

VXFFHVVIXQFWLRQGDWD ^

2ZQHUVKLS/LVW:UDSSHUDSSHQG GDWD

`

`

`

GRFXPHQWRQFOLFN UHPRYH OLQH IXQFWLRQ^

WKLVFORVHVW2ZQHUVKLS:UDSSHUUHPRYH

`

`

`

YDUFXVWRPHU(GLW QXOO

UHDG\IXQFWLRQ^

FXVWRPHU(GLW QHZ&XVWRPHU(GLW

FXVWRPHU(GLW LQLW

`

При нажатии на кнопку «добавить», мы получаем по ajax­запросу часть уже сформированный и добавим к списку. При удалении по клику, просто удалим ряд значений, найдя ближайший OwnershipWrapper. Обратите внимание на создание глобального обработчика для remove­line. Это необходимо для того, чтобы динамически созданные кнопки тоже обрабатывали этот клик. Добавим обработчик в CustomerController, используя уже созданный нами View OwnershipItem.cshtml:

SXEOLF $FWLRQ5HVXOW$GG2ZQHUVKLS

^

UHWXUQ9LHZ2ZQHUVKLS,WHP QHZ.H\9DOXH3DLUVWULQJ2ZQHUVKLS!

*XLG 1HZ*XLG 7R6WULQJ1

QHZ2ZQHUVKLS

`

Правила перенаправления

Есть две ситуации, которые похожи, но по­разному обрабатываются. Речь идет о перенаправлении страницы на страницу входа и об ошибке 404 (страница не найдена).

Итак, когда мы пытаемся получить по прямой ссылке доступ к админке, но в данный момент мы не залогинены, или залогинены, но не имеем прав на это, нас переправит на страницу,

указанную в Web.config в секции authentication:

DXWKHQWLFDWLRQ PRGH )RUPV!

IRUPV ORJLQ8UO a /RJLQ WLPHRXW !

DXWKHQWLFDWLRQ!

Если мы пытаемся открыть несуществующую страницу, т.е. по данным роутинга не найден контроллер и action­метод, то нас перенаправляют на страницу, которая указывается в секции customErrors в Web.config:

FXVWRP(UURUV PRGH 2Q UHGLUHFW0RGH 5HVSRQVH5HGLUHFW GHIDXOW5HGLUHFW a (UURU!

HUURU VWDWXV&RGH UHGLUHFW a (UURU!

HUURU VWDWXV&RGH UHGLUHFW a 1RW)RXQG3DJH!

FXVWRP(UURUV!

То же происходит и при обработке ошибки. На боевом сервере не очень хорошо выдавать «желтый экран смерти», где указана причина возникновения ошибки.

Но иногда, перенаправление на страницу 404 или на страницу входа, мы должны сделать самостоятельно.

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

Или второй, и более частый случай, когда по битой ссылке не находится ресурс, в данном случае, надо переправить на NotFoundPage.

Добавим свойства в BaseController (/Controllers/BaseController.cs):

SURWHFWHG VWDWLF VWULQJ(UURU3DJH a (UURU

SURWHFWHG VWDWLF VWULQJ1RW)RXQG3DJH a 1RW)RXQG3DJH

SURWHFWHG VWDWLF VWULQJ/RJLQ3DJH a /RJLQ

SXEOLF5HGLUHFW5HVXOW 5HGLUHFW7R1RW)RXQG3DJH

^

JHW

^

UHWXUQ5HGLUHFW 1RW)RXQG3DJH

`

`

SXEOLF5HGLUHFW5HVXOW 5HGLUHFW7R/RJLQ3DJH

^

JHW

^

UHWXUQ5HGLUHFW /RJLQ3DJH

`

`

SURWHFWHG RYHUULGH YRLG 2Q([FHSWLRQ([FHSWLRQ&RQWH[W ILOWHU&RQWH[W

^

EDVH2Q([FHSWLRQ ILOWHU&RQWH[W

Соседние файлы в папке ASP.NET MVC Урок 1-F