Создайте список флажков на странице бритвы из сущности EF Core многие-ко-многим - PullRequest
0 голосов
/ 24 февраля 2019

Мой вопрос: как создать HTML-разметку на бритвенных страницах и запросы LINQ (в бэкэнде), чтобы вывести список флажков всех моих подкатегорий в представлениях EDIT и CREATE.

Разрешение на созданиепродукт с несколькими подкатегориями, а также обновлять их в любое время в режиме редактирования.

Использование .Net EF Core 2.2, Razor Pages.

Основной класс (Продукт):

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public Category Category { get; set; }

    public List<ProductSubcategory> SubCategories { get; set; }

}

Продукт имеет отношение «многие ко многим» с подкатегорией:

public class SubCategory
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<ProductSubcategory> SubCategories { get; set; }
}

Таким образом, объединяющая таблица (сущность) - это ProductSubcategory:

 public class ProductSubcategory
{
    public int ProductId { get; set; }
    public Product Product { get; set; }

    public int SubCategoryId { get; set; }
    public SubCategory SubCategory { get; set; }
}

Правка (и создание)Представление продукта:

 <h2>Editar: @Model.Product.Name</h2>


<form method="post">
    <input type="hidden" asp-for="Product.Id" />
    <div class="form-group">
        <label asp-for="Product.Name"></label>
        <input asp-for="Product.Name" class="form-control" />
        <span class="text-danger" asp-validation-for="Product.Name"></span>
    </div>
    <div class="form-group">
        <label asp-for="Product.Description"></label>
        <textarea asp-for="Product.Description" class="form-control"></textarea>


        <span class="text-danger" asp-validation-for="Product.Description"></span>
    </div>
    <div class="form-group">
        <label asp-for="Product.Category"></label>
        <select class="form-control" asp-for="Product.Category" asp-items="Model.Categories"></select>
        <span class="text-danger" asp-validation-for="Product.Category"></span>
    </div>
    <div class="form-group">

        //Code to allow the subcategory selection.
        //preferable as checkboxes 

        //() subcat1    (x)subcat2    ()subcat3
        //() subcat4    ()subcat5    (x)subcat6

    </div>
    <button type="submit" class="btn btn-primary">Salvar</button>
</form>

Модель редактирования Edit.cshtml.cs

public class EditModel : PageModel
{
    private readonly IProductData _ProductData;
    private readonly IHtmlHelper _HtmlHelper;
    [BindProperty]
    public Product Product { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; }
    public string MessageCreate { get; set; }


    public EditModel(IProductData _productData, IHtmlHelper _htmlHelper)
    {
        _ProductData = _productData;
        _HtmlHelper = _htmlHelper;
    }


    public IActionResult OnGet(int? productId)
    {
        Categories = _HtmlHelper.GetEnumSelectList<Category>();

        if (productId.HasValue)
        {
            Product = _ProductData.GetById(productId.Value);

        }
        else
        {
            MessageCreate = "Criar novo Produto";
            Product = new Product();
        }

        if (Product == null)
        {
            return RedirectToPage("./NotFound");
        }
        return Page();
    }

    public IActionResult OnPost()
    {
        if (!ModelState.IsValid)
        {
            Categories = _HtmlHelper.GetEnumSelectList<Category>();
            return Page();
        }

        if (Product.Id > 0)
        {
            _ProductData.Update(Product);
        }
        else
        {
            _ProductData.Create(Product);
        }

        _ProductData.Commit();

        TempData["Message"] = "Produto salvo!!!";

        //PRG POST-REDIRECT-GET
        return RedirectToPage("./Detail", new { productId = Product.Id });
    }

}

1 Ответ

0 голосов
/ 24 февраля 2019

Флажок используется для представления логического свойства.Я вижу, что у вас нет свойства bool, поэтому я полагаю, вам нужно добавить логическое свойство в класс SubCategories, например:

public bool IsChecked { get; set; } // added this property

Затем вам нужно добавить свойство в вашу PageModel (Редактировать или Создать) для представления данных и обеспечения того, чтобы опубликованные значения были связаны с ними:

[BindProperty]
public List<Subcategory> SubCategories { get; set; } = new List<Subcategory>();

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

@for (var i = 0; i < Model.SubCategories.Count(); i++)
 {
    <input asp-for="SubCategories[i].IsChecked" />
 }
...