Попытка вставить/отсортировать список на основе значения "Порядок"

0

Вопрос

Я создаю приложение для документации, в котором я разрешаю людям в моем бизнесе получать доступ к документации по определенному программному обеспечению. Благодаря этому у меня есть страница, на которой любой администратор может управлять категориями и пользователями. Для этого я хочу, чтобы администратор мог изменить порядок категории, в которой она должна отображаться в моем меню навигации. Теперь работает та часть, где он должен правильно упорядочивать категории на основе порядка внутри меню навигации. Но когда я пытаюсь отредактировать существующие категории и их номера заказов, заказы не обновляются соответствующим образом, см. Этот пример:

Это делается перед редактированием существующих категорий, эти категории недавно добавлены/сделаны New categories

Это после редактирования категорий, "Реагировать" должно быть порядком 2, где API будет порядком 0, а тест будет порядком 1 Edited categories

Как вы можете видеть, приказ больше не имеет смысла. Очевидно, что не должно быть разрешено более 1 любого заказа.

Теперь проблема, скорее всего, связана с этим кодом.

CategoryService.cs

public async Task<List<Category>> InsertCategory(Category category)
        {
            await GetCategories();
            for (int i = 0; i < Categories.Where(c => c.Order >= category.Order).Count(); i++)
            {
                Categories[i].Order++;

                if (Categories[i].Order == category.Order)
                {
                    Categories[i].Order--;
                    break;
                }
            }

            await categoryRepository.InsertAsync(Categories);
            EventHelper.NotifyCategoryListChanged(Categories, EventArgs.Empty);
            return Categories;
        }

Порядок кода выглядит следующим образом:

Каталог категорий.бритва

private async void SaveCategory(Category category)
    {
        if(!string.IsNullOrEmpty(category.Name))
        {
            await categoryService.SaveCategory(category);
            Snackbar.Add("Category " + category.Name + " added", Severity.Success);
            MudDialog.Close(DialogResult.Ok(category.Id));       
        }
        else
        {
            Snackbar.Add("Please enter a category name.", Severity.Warning);
        }
    }

Приведенный выше код вызывается после нажатия кнопки. Это передает категорию с определенным номером заказа, этот номер передается из простого выпадающего меню.

То SaveCategory функция выглядит так:

CategorySerice.cs

public async Task<Category> SaveCategory(Category category)
        {
            await InsertCategory(category);

            if (categoryRepository.GetByIdAsync(category.Id) == null)
            {
                await categoryRepository.AddAsync(category);
            }
            else
            {
                await categoryRepository.SaveAsync(category);
            }

            EventHelper.NotifyCategoryListChanged(Categories, EventArgs.Empty);

            return category;
        }

Эта функция вызывает проблемную функцию перед фактическим сохранением/добавлением чего-либо в базу данных. Таким образом, это может произойти для недавно добавленной или отредактированной категории.

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

Но я не могу понять, как правильно будет указывать Заказы, когда я их изменю. Быстрое напоминание, эта функция не работает при редактировании существующих категорий. Если бы я добавил новую категорию, например, при заказе 2. Он правильно перемещает все без проблем.

Любая помощь приветствуется!

.net c# entity-framework
2021-11-23 11:52:48
1

Лучший ответ

0

Итак, если пользователь попытается сделать второй заказ, скажем, с заказом 2, он уменьшит номер заказа по сравнению с предыдущим?

Ваша логика цикла этого не поддерживает, потому что ваш цикл увеличивается, поэтому к тому времени, когда это произойдет, вы уже прошли предыдущий, так что, предположительно, после этого вы получите двойной 1.

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

Для:

for (int i = Categories.Count() -1; i >-1; i--)
{
    if (Categories[i].Order <= category.Order)
    {
        Categories[i].Order = Categories[i].Order--;
    }
}

Но для того, чтобы все имело смысл и не впадало в это, я предлагаю вместо этого увеличить заказ, потому что у положительных высоких чисел, так сказать, нет таких же проблем в углах

Или вместо этого:

for (int i = 0; i < Categories.Count(); i++)
{
    if(Categories[i].Order < category.Order) continue;
    Categories[i].Order = Categories[i].Order++;
}

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

--FROM: await categoryRepository.InsertAsync(Categories);
--TO:
await categoryRepository.InsertAsync(category);
2021-11-23 12:22:15

Я попробовал первые 2 решения, но это привело к тому, что при создании новых категорий порядок оставался равным 0. Я не совсем уверен, что делает последнее решение. Но если это поможет, "Категории" - это список внутри CategoryService.cs Это единственный источник истины, когда GetCategories получает вызов, он получает новую информацию из базы данных.
Rowin

@Rowin последнее предполагает, что вы хотите вставить в новую категорию, а не весь список категорий, в который я ничего не включил о фактическом сохранении, верно? это была не ваша проблема, и вы уже овладели этим. Поэтому я также предполагаю, что порядок в вашем параметре категории уже установлен правильно из-за вашего сравнения с ним, и мы не видим, как он установлен. Вы уже установили его перед вызовом категории сохранения? поскольку мы не вводим категорию параметров вручную, а просто добавляем ее как есть, единственная возможность-это всегда было 0?
T. Nielsen

Значение из заказа выводится из выпадающего меню, в котором вы можете выбрать от 0 до текущего количества категорий или при создании одной из них от 0 до текущего количества категорий + 1. Это передается в категорию сохранения. То, что я сейчас пытаюсь сделать, - это создать "Новый" список. Где все сдвигается вверх, чтобы освободить место для новой категории. После чего он сохраняется и фактически добавляется в базу данных. Это прекрасно работает при создании новых категорий, но при редактировании существующих документов это не изменяется соответствующим образом, чтобы оставаться в правильном порядке.
Rowin

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................