Почему я не могу вернуть нулевое значение?

Я создаю приложение, в котором пользователи могут вести учет купленных продуктов питания. По мере того как новые пользователи создают свою кладовую, у них есть возможность создавать новые ингредиенты ИЛИ добавлять ингредиенты, которые ранее отправляли другие пользователи (т. е. нет необходимости создавать новый ингредиент под названием «Куриная грудка», если другой пользователь уже имеет его в своей кладовой).

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

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

Представление (newIngredients.cshtml)

@model AddIngredientsView

@{
    ViewBag.Title = "Pantry Setup";
    ViewBag.HeaderText = "Add Your First Set of Ingredients To Your Pantry";
    Layout = "~/Views/Home/_Layout.cshtml";
}

<div class="formBox">
    <form asp-action="CreateIngredients" asp-contoller="Home" method="post">
        <h3>Existing Ingredients</h3>
        @using (Html.BeginForm("NewIngredients", "Home", FormMethod.Get))
        {
            @Html.TextBox("searching")<input type="submit" value="Search">
        }
        @for(int i =0; i < Model.AllIngredients.Count; i++){
            @Html.HiddenFor(m => m.AllIngredients[i].id);
            <label asp-for="IsAddedIngredient[i]">@Model.AllIngredients[i].Name</label>
            <input type="checkbox" asp-for="IsAddedIngredient[i]">

            <label asp-for="AddIngredientsQuantity[i]">Quantity</label>
            <input type="number" step="0.01" asp-for="AddIngredientsQuantity[i]">
            <br>
        }
</div>

Модель просмотра (AddIngredientsView.cs)

using System.Collections.Generic;

namespace ThisProject.Models{
    public class AddIngredientsView{
        public Merchant Merchant{get;set;}

        public List<Ingredient> AllIngredients{get;set;}

        public List<string> AddIngredientsQuantity{get;set;}
        public List<bool> IsAddedIngredient{get;set;}
        public List<Ingredient> NewIngredients{get;set;}
        public List<double> NewIngredientsQuantity{get;set;}
        public List<Pantry> PantryItems{get;set;}
    }
}

Домашний контроллер:

[HttpGet("ingredients/new")]
        public IActionResult NewIngredients(string searching){
            AddIngredientsView viewModel = new AddIngredientsView();
            viewModel.Merchant = context.Merchants.FirstOrDefault(m => m.id == merchantId);
            viewModel.AllIngredients = context.Ingredients.ToList();

            return View("newIngredients", viewModel.AllIngredients.Where(x => x.Name.Contains(searching) || searching == null).ToList());
        }

Ожидаемым результатом будет список всех ингредиентов на начальном этапе. Когда пользователь ищет ингредиент в @Html.TextBox("searching"), он отфильтровывает все элементы, которые не соответствуют его запросу.

У меня есть десять ингредиентов, которые находятся в базе данных и вызываются правильно, когда я опускаю код между @using (Html.BeginForm....){} на странице просмотра и просто возвращаю View("newIngredients") в домашнем контроллере. .

Код компилируется при отправке в том виде, в котором он написан, но не отображается в браузере. Я получаю следующую ошибку при отображении страницы:

При обработке запроса произошло необработанное исключение. ArgumentNullException: значение не может быть нулевым. Имя параметра: значение

string.IndexOf (строковое значение, int startIndex, int count, StringComparison ComparisonType) ArgumentNullException: значение не может быть нулевым. Имя параметра: значение

string.IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
string.Contains(string value)
ThisProject.Controllers.HomeController+<>c__DisplayClass7_0.<NewIngredients>b__1(Ingredient x) in HomeController.cs

            return View("newIngredients", viewModel.AllIngredients.Where(x => x.Name.Contains(searching) || searching == null).ToList());

System.Linq.Enumerable+WhereListIterator.ToList() System.Linq.Enumerable.ToList(источник IEnumerable) ThisProject.Controllers.HomeController.NewIngredients(поиск строки) в HomeController.cs

            return View("newIngredients", viewModel.AllIngredients.Where(x => x.Name.Contains(searching) || searching == null).ToList());

person dmkrebsbach    schedule 26.08.2019    source источник


Ответы (1)


Я решил проблему, я неправильно передавал viewModel.

Конроллер работает при изменении последних двух строк на следующие:

[HttpGet("ingredients/new")]
        public IActionResult NewIngredients(string searching){
            AddIngredientsView viewModel = new AddIngredientsView();
            viewModel.Merchant = context.Merchants.FirstOrDefault(m => m.id == merchantId);
            viewModel.AllIngredients = context.Ingredients.Where(x => x.Name.Contains(searching) || searching==null).ToList();

            return View("newIngredients", viewModel);
        }

Спасибо.

person dmkrebsbach    schedule 26.08.2019