Это полное решение с исправлением различных проблем, с которыми я столкнулся:
МОДЕЛЬ
Создайте папку в своем проекте и назовите ее ViewModel
Создайте класс в этой папке и назовите его ProductInfoViewModel.cs
. Вот полное содержимое ProductInfoViewModel.cs
:
namespace ProductTest.ViewModels
{
public class ProductInfoViewModel
{<br>
public int ProductId { get; set; }
public IEnumerable<SelectListItem> ProductName { get; set; } = new List<SelectListItem>();<br>
public int CategoryId { get; set; }
public IEnumerable<SelectListItem> CategoryName { get; set; } = new List<SelectListItem>();<br>
public int SubcategoryId { get; set; }
public IEnumerable<SelectListItem> SubcategoryName { get; set; } = new List<SelectListItem>();<br>
}
}
Инициализация с помощью new List<SelectListItem>();
важна, поэтому вы не получите NULL reference error
.
КОНТРОЛЛЕР
Под // GET: ProductInfoes/Create
добавьте logi c для получения данных из базы данных и загрузки их в ProductInfoViewModel
объект:
public IActionResult Create() {
// Hooks on databse to get list of Products
var products = (from m in _context.Product
select new SelectListItem
{
Value = m.ProductId.ToString(),
Text = m.ProductName
}).ToList();<br>
// Create new instance of our ViewModels.ProductInfoViewModel(()
var vm = new ViewModels.ProductInfoViewModel();<br>
// Fill in ProductName in ProductInfoViewModel with list fetch from database
vm.ProductName = new SelectList(products, "Value", "Text").Where(products => products != null);
// Do same thing to Category and Subcategory
var categories = (from m in _context.Category
select new SelectListItem{
Value = m.CategoryId.ToString(),
Text = m.CategoryName
}).ToList();
vm.CategoryName = new SelectList(categories, "Value", "Text").Where(categories => categories != null);
var subcategories = (from m in _context.Subcategory
select new SelectListItem
{
Value = m.SubcategoryId.ToString(),
Text = m.SubcategoryName
}).ToList();
vm.SubcategoryName = new SelectList(subcategories, "Value", "Text").Where(subcategories => subcategories != null);
//Pass that model to View
return View(vm);
}
ПРОСМОТР
чем go в
Views/ProductInfoes/Create.cshtml
файл. Добавьте следующий код:
@model ProductTest.ViewModels.ProductInfoViewModel
@{
ViewData["Title"] = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>Create</h1>
<h4>ProductInfo</h4>
<hr />
<form asp-action="Create">
@Html.DropDownListFor(model => Model.ProductId, Model.ProductName, "--Select--")
@Html.DropDownListFor(model => Model.CategoryId, Model.CategoryName, "--Select--")
@Html.DropDownListFor(model => Model.SubcategoryId, Model.SubcategoryName, "--Select--")
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Если вы go перейдете на свою страницу создания, введите что-то вроде:
https://localhost:44382/ProductInfoes/Create
, и вы получите следующее:
Щелкните Create
после выбора из раскрывающегося списка. И если вы go вернетесь на страницу индекса, вы увидите, что продукт успешно добавлен в список.