У меня проблема в моем коде. Я пытаюсь отредактировать сведения о продукте и добавить поле «Категория» и «Издатель» в виде раскрывающегося списка при обновлении сведений, как на этом изображении: здесь
Это мой код в контроллере:
[HttpGet]
public IActionResult Edit_Products(string productId)
{
ViewBag.ListofPublisher = context.Publisher.ToList();
ViewBag.ListofCategory = context.Category.ToList();
return View(context.Product.Find(productId));
}
В представлении я добавляю два выпадающих списка для загрузки категории и издателя и отправляю их обратно в контроллер.
<div class = "form-group">
<label>Category</label>
<br />
<select class = "form-control" asp-for = "CategoryCode"
asp-items = "@(new SelectList(ViewBag.ListofCategory,"CategoryCode","CategoryName"))">
</select>
</div>
@*Product Category*@
<div class = "form-group">
<label>Publisher</label>
<br />
<select class = "form-control" asp-for = "PublisherCode"
asp-items = "@(new SelectList(ViewBag.ListofPublisher,"PublisherCode","PublisherName"))">
</select>
</div>
@*Product Publisher*@
В контроллере Edit я обновлю это до таблицы
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit_Products(Product product,string productCode)
{
if (ModelState.IsValid)
{
Product result = context.Product.SingleOrDefault(p => p.ProductCode.Equals(product.ProductCode));
try
{
string proCode = product.ProductCode;
result.ProductCode = (product.CategoryCode) + (product.PublisherCode) + (proCode.Substring(proCode.Length - 2));
result.ProductName = product.ProductName;
result.Price = product.Price;
result.Quantity = product.Quantity;
result.AuthorName = product.AuthorName;
result.ReleaseYear = product.ReleaseYear;
result.Ver = product.Ver;
result.Used = product.Used;
result.Review = product.Review;
result.CategoryCode = product.CategoryCode;
result.PublisherCode = product.PublisherCode;
result.Picture = product.Picture;
context.SaveChanges();
}
catch (Exception exx)
{
ViewBag.Msg = exx.Message;
}
return RedirectToAction("Index", "Manage_Products");
}
return View();
}
Затем я получил эту ошибку:
ArgumentNullException: значение не может быть нулевым. (Параметр «предметы»)
Пожалуйста, помогите мне.
Отвечает ли это на ваш вопрос? Что такое NullReferenceException и как его исправить?
Код ошибки отображается в двух строках. Выбрать в представлении
Насколько я могу судить… asp-items = "@(new SelectList(ViewBag.ListofCategory,"CategoryCode","CategoryName"))">
… или строка списка издателей возвращает значение null
.
Как я могу установить значение для выбора?
Я предполагаю, что «настроено» правильно. Компилятор не жалуется на «настройку»… он жалуется на то, что… «когда настройка» завершена, код передает ему значение null
в одном из параметров. Я бы предположил, что это может быть один из списков… ViewBag.ListofCategory
или ViewBag.ListofPublisher
. Поскольку это, возможно, «новые» списки… вы уверены, что списки «инициализируются» в содержащем классе?
Я уверен, что создал его в содержащем классе
Ну… ошибка кажется довольно очевидной… один или оба списка — это null
. Если списки инициализируются, значит, что-то еще должно создавать один или оба списка null
. Вы отследили это, например, поставили точку останова в коде и проверили списки, чтобы увидеть, могут ли они быть null
? Это будет проблемой при съемке 101.
Это происходит, когда ваш пост заканчивается ModelState.IsValid == false
? Если да - вам нужно "пополнить" ViewBag
значениями, потому что они не распределяются между запросами.
Из того, что я вижу в вопросе, я бы предположил, что ошибка возникает при запросе POST, когда ваша модель не проходит проверку (т. Е. ModelState.IsValid
является false
). Если это так - вам нужно снова заполнить ListofPublisher
и ListofCategory
, потому что данные, которые вы поместили в ViewBag/ViewData, доступны только в течение жизненного цикла запроса, в рамках которого вы их заполнили (подробнее здесь). то есть вызов:
ViewBag.ListofPublisher = context.Publisher.ToList();
ViewBag.ListofCategory = context.Category.ToList();
Перед return View();
в вашем методе POST.
Какая строка в коде выдает ошибку?