Аватар для Jocker
1 / 1 / 3
Регистрация: 22.01.2015
Сообщений: 199

Обнуляется глобальная переменная

12.11.2019, 10:11. Показов 1591. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. У меня обнуляется глобальная переменная, хотя и не должна. Идея в том, что каждой галлерее соответсвует своя папка в каталоге и при переименовании галлереи, должна переименовываться и папка. В первом методе я записываю старый путь папки, а во втором хочу её переименовать.
Проблема в том, что в первом методе переменная правильно инициализируется (проверял дебагом), но на входе во второй имеет значение null.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public async Task<IActionResult> EditGal (int? id)
        {
            if (id!= null)
            {
                Gallery gallery = await db.Galleries.FirstOrDefaultAsync(x=>x.ID == id);
                oldGallery = "~/wwwroot/images/"+gallery.Name;
                return View(gallery);
            }
 
            return NotFound();
        }
 
        [HttpPost]
        public async Task<IActionResult> EditGal (Gallery gallery)
        {
            string path = @"wwwroot/images/";
            if (Directory.Exists(path + gallery.Name))
                Directory.Move(oldGallery, path+gallery.Name);
 
            db.Galleries.Update(gallery);
            await db.SaveChangesAsync();
            return RedirectToAction("gallery");
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2019, 10:11
Ответы с готовыми решениями:

Обнуляется переменная
using System; namespace ConsoleApp6 { class Program

Обнуляется переменная
Добрый день. Сразу предупреждаю, мягко говоря, код не очень красивый. Проблема такая, есть 2 класса. Первый: using System; using...

Глобальная переменная
Ку всем как сделать запись в глобальную переменную. Код: namespace ConsoleApplication5 { class Program { ...

9
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
12.11.2019, 10:24
Судя по [HttpPost] это у вас web-приложение, где на каждый запрос создается новый экземпляр контроллера / контекста / etc => следовательно ваше значение oldGallery осталось в предыдущем экземпляре контроллера
1
HF
 Аватар для HF
1317 / 897 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
12.11.2019, 10:35
Цитата Сообщение от Jocker Посмотреть сообщение
В первом методе я записываю старый путь папки, а во втором хочу её переименовать.
Это веб-приложение, у него есть жизненный цикл. Не надо пытаться что-то сохранить в каком-то из запросов.
Вы должны прокидывать все нужные параметры. Это значит что при POST запросе, вы должны ещё и передать id старой галереи. И нет смысла генерировать полный путь и сохранять его в переменной. Во-первых, это вы снова делаете/можете сделать. Во-вторых, раз это каталог галереи, то заведите метод/сервис, который будет по ID возвращать путь.
1
 Аватар для Jocker
1 / 1 / 3
Регистрация: 22.01.2015
Сообщений: 199
12.11.2019, 11:10  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Во-вторых, раз это каталог галереи, то заведите метод/сервис, который будет по ID возвращать путь.
На ум пришло только 2 способа:
1) завести статический класс, в который передавать имя старой галереи и в другом методе считывать. (как по мне самый костыльный и неправильный)
2) в модель добавить поле, в котором будет старое имя. А после переименования галереи, переименовать папку, имеющую старое имя галереи.

Как вы считаете, второй вариант приемлемый? Может у Вас другое видение решения этого вопроса)
0
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
12.11.2019, 11:18
Jocker, а зачем вам именовать папку как галлерею? Почему бы не задавать название как идентификатор?
Тогда и переименновывать не нужно.

А если обязательное условие название галлереи в названии папки, то передавайте старые и обновленные данные.
Но если вы передаете модель с идентификатором - вытащите из бд не обновленные данные - и будет вам oldGalleryName
1
 Аватар для Jocker
1 / 1 / 3
Регистрация: 22.01.2015
Сообщений: 199
12.11.2019, 11:35  [ТС]
Цитата Сообщение от bodynar Посмотреть сообщение
а зачем вам именовать папку как галлерею?
Все изображения, которые добавляются на сайт, загружаются в определённую директорию. Что бы не было и все картинки не были сброшены в одну яму - я решил для каждой галереи сделать папку и рассортировать картинки по папкам (галереям). Если передавать иденификатор, как название, то при большом количестве галерей (сайт дизайнерский и предполагает большое количество галерей), вручную будет трудно найти папку с файлом.

В первом методе у меня заходит необновлённая модель, а втором [HttpPost] - уже обновлённая.
0
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
12.11.2019, 12:04
Цитата Сообщение от Jocker Посмотреть сообщение
В первом методе у меня заходит необновлённая модель, а втором [HttpPost] - уже обновлённая.
В POST-методе у вас принимается модель Gallery с обновленными свойствами, но идентификатор же не обновлен, верно?
Можно сделать по такому принципу:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
[HttpPost]
        public async Task<IActionResult> EditGal (Gallery gallery)
        {
            string oldGalleryName = await db.Galleries.FirstOrDefaultAsync(x=>x.ID == id).Name;
            string path = @"wwwroot/images/";
            if (Directory.Exists(path + gallery.Name))
                Directory.Move(oldGalleryName, path+gallery.Name);
 
            db.Galleries.Update(gallery);
            await db.SaveChangesAsync();
            return RedirectToAction("gallery");
        }

Цитата Сообщение от Jocker Посмотреть сообщение
если передавать иденификатор, как название, то при большом количестве галерей (сайт дизайнерский и предполагает большое количество галерей), вручную будет трудно найти папку с файлом.
А оперирование файлами на сервере вручную необходимо?
1
 Аватар для Jocker
1 / 1 / 3
Регистрация: 22.01.2015
Сообщений: 199
12.11.2019, 12:13  [ТС]
Цитата Сообщение от bodynar Посмотреть сообщение
В POST-методе у вас принимается модель Gallery с обновленными свойствами, но идентификатор же не обновлен, верно?
Да, у меня была идея сделать так, как Вы говорите. Ваш код не работает( компилятор выдаёт ошибку и не видит свойства Name. Похожим образом я делал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public async Task<IActionResult> EditGal (Gallery gallery)
        {
            var old = await db.Galleries.FirstOrDefaultAsync(x => x.ID == gallery.ID);            
                
            string path = @"wwwroot/images/";
            if (Directory.Exists(Path.Combine(path + old.Name)))
                Directory.Move(path+old.Name, path+gallery.Name);
            old = null;
 
            db.Galleries.Update(gallery);
            await db.SaveChangesAsync();
            return RedirectToAction("gallery");
        }
Но выдало исключение (на скрине)
Миниатюры
Обнуляется глобальная переменная  
0
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
12.11.2019, 12:54
Jocker, На какой именно строчке выпадает исключение?
И корректно ли получается сущность из db.Galleries.FirstOrDefaultAsync?
1
 Аватар для Jocker
1 / 1 / 3
Регистрация: 22.01.2015
Сообщений: 199
12.11.2019, 18:11  [ТС]
Цитата Сообщение от bodynar Посмотреть сообщение
Jocker, На какой именно строчке выпадает исключение?
И корректно ли получается сущность из db.Galleries.FirstOrDefaultAsync?
Разобрался с ошибкой. Видимо программе не понравились 2 запроса к базе в одном методе. И выдало ошибку, что пока сущность отслеживается, выполнить других действий нельзя.
Исправил довольно просто, "закрыл" первое соединение чтения и открыл второе для Update.
C#
1
 db.Entry(entity: old).State = EntityState.Detached;
Весь метод (немного другой, этот чуть сложнее, но сделан по аналогии):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public async Task<IActionResult> EditImg(Image image)
        {
            // Changing path and file location
            var old = await db.Images.FirstOrDefaultAsync(x => x.ID == image.ID);
 
            if (old.GalleryName!=image.GalleryName)
            {
                image.Path = old.Path.Replace(old.Path.Split('/')[2], image.GalleryName);
                System.IO.File.Move("wwwroot" + old.Path, "wwwroot" + image.Path);              
            }
            db.Entry(entity: old).State = EntityState.Detached;
 
            // Updating database
            db.Images.Update(image);
            await db.SaveChangesAsync();
            return RedirectToAction("image");
        }
Добавлено через 8 минут
Если описать мои методы создания, редактирования и удаления более детально, то:
1) при создании галереи, создаётся папка в директории "wwwroot/images" с названием галереи.
2) при переименовании галереи, переименовывается папка, менятеся свойство Path и GalleryName у картинки (пришла идея привязать свойство не к имени, а к идентификатору галереи)
3) при удалении галереи - удаляется директория, связанная с ней.

У картинки аналогично.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2019, 18:11
Помогаю со студенческими работами здесь

Глобальная переменная
как переменную сделать глобальное(т.е. можно было использовать на другой форме)

глобальная переменная
мне необходимо одна глобальная переменная, при нажатия определенный кнопки объявилась глобальная переменная, что делать? заранее спасибо...

Глобальная переменная в С++ и ее аналог в С#
В с++ как мы объявляем глобальную переменную, выносим ее вне любой функции и она видна во всем коде программы, в шарпе если выносим за...

Глобальная переменная string
Как сделать переменную string, которая бы работала во всех формах? Допустим я на родительской форме создаю string text...

глобальная переменная в консоле
namespace md5easyTest { class Program { public int i = 1; public static int iAll = 12660805; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru