Я использую в своем приложении четыре метода, чтобы приготовить рецепты для питья:
1)
public async Task<IActionResult> FirstStep()
{
var alcohols = await _context.Ingredients
.Where(i => i.Type == "Alcohol")
.ToListAsync();
return View("FirstStep", alcohols);
}
2)
[HttpPost]
public async Task<IActionResult> SecondStep(List<Ingredient> alcohols)
{
for (int i=0; i< alcohols.Count(); i++)
{
if (alcohols[i].IsChecked == true)
{
UserAlcohols.Add(alcohols[i]);
}
else
continue;
}
var juices = await _context.Ingredients
.Where(i => i.Type == "Juice")
.ToListAsync();
AllIngredients.Add(UserAlcohols);
AllIngredients.Add(juices);
return View("SecondStep", AllIngredients);
}
3)
[HttpPost]
public async Task<IActionResult> ThirdStep(List<List<Ingredient>> AllIngredients)
{
for (int i = 0; i < AllIngredients[1].Count(); i++)
{
if (AllIngredients[1][i].IsChecked == true)
{
UserJuices.Add(AllIngredients[1][i]);
}
else
continue;
}
AllIngredients[1] = UserJuices;
var additions = await _context.Ingredients
.Where(i => i.Type == "Addition")
.ToListAsync();
AllIngredients.Add(additions);
return View("ThirdStep", AllIngredients);
}
4)
[HttpPost]
public async Task<IActionResult> FinalDrinks(List<List<Ingredient>> AllIngredients)
{
for (int i = 0; i < AllIngredients[2].Count(); i++)
{
if (AllIngredients[2][i].IsChecked == true)
{
UserAdditions.Add(AllIngredients[2][i]);
}
else
continue;
}
AllIngredients[2] = UserAdditions;
for (int i = 0; i < AllIngredients.Count(); i++)
{
for (int j = 0; j < AllIngredients[i].Count(); j++)
{
UserComponents.Add(AllIngredients[i][j].Id);
}
}
И у меня проблема со списком AllIngredients. Я вставил сюда все методы для лучшего понимания моей проблемы. У меня в базе данных таблица с ингредиентами для напитков. Мои методы делят их по типу строки (Алкоголь, Сок или Дополнение). Первый метод пока не использует список AllIngredients, потому что есть только спирты. Во втором методе пользователь может выбрать соки из контрольного списка (конечно, также спирты по первому и дополнения по третьему методу). Далее список спиртов и список соков собираются в AllIngredients [0] и AllIngredients [1]. Это список списков. Третий метод работает аналогично: пользователь выбирает дополнения, список идет к AllIngredients [2]. В представлениях все элементы перенаправляются скрытыми входными данными, поэтому у меня есть все предыдущие данные в каждом методе. И здесь у меня проблема: когда я вошел в FinalDrinks (четвертый метод) в AllIngredients [1], у меня всегда есть «Кола»! Что бы я ни выбрал (у меня в базе три сока: кола, апельсиновый сок и вода), всегда в FinalDrinks у меня есть кола (кола id = 2). Когда я выбираю два или три напитка, кола всегда первая. Даже если я выберу апельсиновый сок и воду, у меня есть кола и апельсиновый сок.
Я проверил это по точкам останова, проблема в конце третьего метода. Я установил две точки останова: одну на строке "AllIngredients.Add (дополнения);" в третьем методе - здесь все по-прежнему в порядке, второй в начале для в FinalDrinks - здесь, в AllIngriedients [1] у меня есть кола.
Интересно, я использовал похожие методы, со спиртами и дополнениями все работает правильно. Я понятия не имею, что я могу сломать между концом третьего метода и началом четвертого.
Надеюсь, кто-то из вас знает, что здесь не так.
С наилучшими пожеланиями,
Камиль
EDIT:
Я помещаю здесь также View for ThirdStep:
@model List<List<DrinkItUp.Models.Ingredient>>
<h2>Your alcohols:</h2>
@foreach (var userAlcohols in Model[0])
{
@Html.DisplayFor(model => userAlcohols.IngredientName)
}
<h2>Your juices:</h2>
@foreach (var juices in Model[1])
{
@Html.DisplayFor(model => juices.IngredientName)
}
<form asp-action="FinalDrinks" asp-controller="DrinkItUp" method="post" role="form">
<fieldset class="form-group">
@{
for (var i = 0; i < Model[0].Count(); i++)
{
<input type="hidden" asp-for="@Model[0][i].IsChecked" />
<input type="hidden" asp-for="@Model[0][i].Id" />
<input type="hidden" asp-for="@Model[0][i].IngredientName" />
<br />
}
}
@{
for (var i = 0; i < Model[1].Count(); i++)
{
<input type="hidden" asp-for="@Model[1][i].IsChecked" />
<input type="hidden" asp-for="@Model[1][i].Id" />
<input type="hidden" asp-for="@Model[1][i].IngredientName" />
<br />
}
}
<h2>Choose yur additions:</h2>
<div class="checkbox checkboxlist">
@{
for (var i = 0; i < Model[2].Count(); i++)
{
<input type="checkbox" asp-for="@Model[2][i].IsChecked" />
<label asp-for="@Model[2][i].Id">@Model[2][i].IngredientName</label>
<input type="hidden" asp-for="@Model[2][i].Id" />
<input type="hidden" asp-for="@Model[2][i].IngredientName" />
<br />
}
}
</div>
<div class="form-group">
<div class="row">
<button type="submit">Go to next step!</button>
</div>
</div>
</fieldset>
</form>
Но это представление ничего не меняет в AllIngredients [1]. Что любопытно, так же, как я посылаю данные между Первым и Вторым Шагом, Вторым и Третьим, и когда я для тестов показываю все ингредиенты в FinalDrinks, у меня тоже все правильно.
РЕДАКТИРОВАТЬ 2:
Я сделал больше точек останова и обнаружил другую мысль: в View также все со списком AllIngredients [1] в порядке. Я установил последнюю точку останова для для Model [2] в представлении, а здесь в AllIngredients [1] - вода, нажал кнопку «Продолжить», снова остановился на методе «{» FinalDrinks в контроллере и ... получил f ** королевскую колу! Зачем?! Пока что у меня есть только кнопка для отправки формы.