ASP. NET Core MVC - Как добавить другие атрибуты из ссылочной таблицы в раскрывающемся списке в представлении - PullRequest
0 голосов
/ 08 мая 2020

Я использую ASP. NET Core v3 MVC с Visual Studio 2019 Enterprise.

У меня есть такая база данных:

ER model of sample database

Я использую подход сначала к базе данных для создания моделей для этой базы данных. После этого я добавляю следующий тип контроллера для таблицы product_info:

enter image description here

, который также будет генерировать представления. Мой вопрос: как я могу отобразить атрибуты из других таблиц в раскрывающемся списке Create View.

Вот пример того, что я имею в виду:

enter image description here

Мне не нужно полное решение, хотя оно может быть полезно, любых подсказок или указателей, как это сделать, будет достаточно.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы можете создать модель просмотра для отображения атрибутов в другой модели.

ViewModel:

public class ViewModel
{
    public IEnumerable<SelectListItem> Model1Items{ get; set; }
    public int SelectedId { get; set; }
}

Контроллер:

var items = (from m in db.Model1s
         select new SelectListItem{
             Value = m.Id,
             Text = m.Name
         }).ToList(); 

var vm = new ViewModel();
vm.Model1Items = new SelectList(items, "Value", "Text");

Просмотр:

@Html.DropDownListFor(model => model.SelectedId, Model.Model1Items, "--Select--")
0 голосов
/ 09 мая 2020

Это полное решение с исправлением различных проблем, с которыми я столкнулся:

МОДЕЛЬ

  1. Создайте папку в своем проекте и назовите ее ViewModel

  2. Создайте класс в этой папке и назовите его 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

, и вы получите следующее:

enter image description here

Щелкните Create после выбора из раскрывающегося списка. И если вы go вернетесь на страницу индекса, вы увидите, что продукт успешно добавлен в список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...