列表的异常行为

时间:2019-03-19 21:05:25

标签: c# .net list .net-core

我在我的应用程序中使用了四种方法来准备饮料食谱:

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]。在视图上,每个元素都由隐藏的输入转发,因此我在每种方法中都具有所有先前的数据。这就是我的问题:在AllIngredients [1]中进入FinalDrinks(第四种方法)时,我总是有“可乐”!无论我选择什么(数据库中有三种果汁:可乐,橙汁和水),在FinalDrinks中总是有可乐(可乐ID = 2)。当我选择两种或三种饮料时,可乐总是第一位。即使我选择橙汁和水,我也会喝可乐和橙汁。

我通过断点检查了它,问题出在第三种方法的末尾。我设置了两个断点:一个在“ AllIngredients.Add(additions);”行上在第三个方法中-一切仍然正常,在FinalDrinks中for的开头第二个-在AllIngriedients [1]中我有可乐。

有趣的是,我使用了类似的方法,使用酒精和添加剂可以使一切正常。我不知道在第三种方法的结束和第四种方法的开始之间可以打破什么。

我希望你们中的任何一个都知道这里出了什么问题。

最好的问候, 卡米尔(Kamil)

编辑: 我在这里还放置了“第三步视图”:

@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: 我提出了更多的断点,我发现了另一个想法:在“查看”列表中的所有内容AllIngredients [1]也可以。我在View中使用Model [2]为其设置了最后一个断点,在这里AllIngredients [1]中是水,单击继续,再次在控制器中的“ {” FinalDrinks方法上停止,并且……有个好主意!为什么?!同时,我只有一个按钮可以发送表格。

0 个答案:

没有答案