Вежбе – Oсми и девети час – Креирање CRUD за производе, рад са фајловима, асихроне методе, Identity и ауторизација
Наставак унапређивања и додавања нових функционалности интернет продавници.
Задатак 1: Додати могућност слања поруџбине
Задатак 2: Додати могућности за брисање, додавање и мењање производа (CRUD – create read update delete)
- Креирати страницу
Views/Admin/SpisakProizvoda.cshtml. Обратити пажњу на акцијеОбришииИзмени. На основу имплементације може се приметити да јеИзменилинк, док јеОбриширешено преко форме. Разлог за ову разлику је у следећем:Изменинас упућује на следећу страницу где се измене уносе. Корисник не уноси никакве податке кликом на дугмеИзмени(тј. не дешава се никаква post акција).Обришимења стање апликације. Односно, корисник уноси податак о производу (то је заправо поље hidden) и примењује једну акцију. Заправо, имамо post операцију и не може се задати преко линка.
- Подаци које чува
TempDataсу доступни све док се не прочитају. То значи да ће бити приказани приликом приказа стране први пут након брисања, али ће нестати ако се страна освежи. Више о овоме, као и примере и начин коришћења погледати у званичној документацији.- У овом примеру није могуће користити ViewBag. У овом примеру, приликом брисања врши се редирекција на страну
SpisakProizvoda.cshtmlи то се третира као нови HttpRequest и ViewBag подаци не могу да се преносе међу различитим захтевима (тј. трају само у оквиру једног захтева). - Са друге стране, подаци који се односе на једну сесију трају током трајања те сесије. То значи да ако би ове поруку желели да сачувамо и прикажемо коришћењем сесија, онда би та порука траја много дуже него што је потребно (и морала би ручно да се брише из сесије).
TempDataподаци нестају оног тренутка када се прикажу.
- У овом примеру није могуће користити ViewBag. У овом примеру, приликом брисања врши се редирекција на страну
- У овом примеру желимо да учитавамо слике, па је у оквиру форме потребно навести
multipart/form-data. - Савет је да сви методи у контролерима буду асихрони, а поготову они који чувају или читају податке из базе. Мали подсетник за асихроне методе:
- Кључне речи await и async омогућавају да се лако пишу функције које су асихроне (а компајлер у позадини одрађује све што треба). Са async се наглашава да је функција асихрона (и да у себи има кључну реч await).
- Кључна реч await се наводи испред позива методе којој треба време да се изврши.
- Добар чланак о асинхроним функцијама.
- У методи
Izmeniкоришћен је атрибутBind. Препорука је да се овај атрибут користи као један од нивоа заштите против over-post. - Важна напомена: да би корисник могао да приступи неком фолдеру, онда је пожељно поставити га у
wwwrootфолдер или експлицитно променити конфигурацију и навести где корисник још има права приступа. - Овом приликом дата је могућност учитавања слика. Имплементирано решење је прилагођено оперативном систему Windows, али за друге системе би било потребно позвати друге функције (и користити друге библиотеке).
- Коришћен је
IWebHostEnvironmentкоји омогућава приступ подразумеваној путањи (wwwroot фолдер). - Више о учитавању и чувању фајлова у документацији.
- Постоји пуно дискусија на тему где је боље чувати документа – у бази или у бази чувати само путању. Постоји неколико фактора који утичу на коначну одлуку, али се блага предност даје чувању путања (на интернету се може наћи пуно дискусија на ову тему и предности или мане једног или другог приступа).
- Додати
imgуProizvodIspis.cshtml. Иначе, овај приступ није најбоље решење јер се директно шаље путања до фајла. Боље би било користитиIFileProvider. Погледати званичну документацију и примере како би било исправно, рецимо нешто овако:services.AddSingleton<IFileProvider>( new PhysicalFileProvider(Path.Combine (Directory.GetCurrentDirectory(), "wwwroot/ProizvodiSlike")));