Ядро Aspnet MVC Частичное представление для данных подкласса - PullRequest
0 голосов
/ 07 июня 2019

У меня есть модель, которая выглядит следующим образом:

public class Product
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string CatalogId { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Description { get; set; }
    [Required]
    [EnumDataType(typeof(Category))]
    public Category Category { get; set; }

    public IEnumerable<Features> Features { get; set; }
}

И у меня есть представление, позволяющее мне создать новый продукт с использованием этой модели.

Для функций яя пытаюсь создать частичное представление, которое позволит мне добавить новый Features в список, присоединить его к продукту и передать в метод AddNewProduct() в моем контроллере.

Вот мой AddNewProduct вид:

@model Product

<div class="card card-admin-main">
<div class="card card-header-admin">
    <nav class="navbar navbar-expand-lg navbar-light bg-light" style="background-color: grey !important;">
    <a class="navbar-brand" href="/admin">Admin</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
        <li class="nav-item active">
            <a class="nav-link" href="/admin">Overview <span class="sr-only">(current)</span></a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="/admin/products">Products</a>
        </li>

    </div>
    </nav>
</div>


<form asp-action="AddNewProduct">
    <br>
        <div class="col-md-12">
            <div class="row">
                <div class="col-md-6">
                    <a asp-for="CatalogId" >Catalog ID</a>
                    <input asp-for="CatalogId" class="form-control">
                    <a asp-for="Name" >Name</a>
                    <input asp-for="Name" class="form-control">

                    <a asp-for="Category" >Category</a>
                    <select asp-for="Category" asp-items="Html.GetEnumSelectList<Category>()" class="form-control">
                        <option selected="selected" value="">Please select</option>
                    </select>    

                </div>
                <div class="col-md-6">
                    <a asp-for="Description" >Description</a>
                    <textarea asp-for="Description" class="form-control" rows="7"></textarea>
                </div>
            </div>
            <div class="row">
                <div class="col-md-6">
                    @if(Model != null)
                    {
                        foreach(var feature in Model.Features)
                        {
                            @feature.FeatureTitle
                        }
                    }
                    @await Html.PartialAsync("_AddNewFeaturePartial", new Features())

                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <br>
                    <button type="submit" class="btn btn-primary">Save</button>
                </div>

            </div>
        </div>
</form>

Вот мой _AddNewFeaturePartial

@model Features


<form asp-action="AddFeature" asp-controller="Admin" method="POST">
    <a asp-for="FeatureTitle">Feature</a>
    <input asp-for="FeatureTitle" class="form-control">
    <a asp-for="FeatureDescription">Description</a>
    <input asp-for="FeatureDescription" class="form-control">
    <button type="submit" class="form-control">Add Feature</button>
</form>

А вот мои методы контроллера:

    public IActionResult AddNewProduct(Product newProduct)
    {
        if(newProduct.CatalogId != null)
        {

        }
        return View();
    }
    [HttpPost]
    public IActionResult AddFeature(int id, string FeatureTitle, string FeatureDescription)
    {

        return RedirectToAction("AddNewProduct");
    }

Если я добавлю новыйукажите в форме и нажмите Add new Feature Никогда не попадет public IActionResult AddFeature(int id, string FeatureTitle, string FeatureDescription

Есть идеи?

Спасибо

1 Ответ

1 голос
/ 10 июня 2019

Не используйте частичное представление, когда для визуализации разметки требуется сложная логика рендеринга или выполнение кода.См. здесь .

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

1. Модель продукта, измените IEnumerable<Features> на IList<Features>

public class Product
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string CatalogId { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Description { get; set; }

    public IList<Features> Features { get; set; }
}

2. Представление AddNewProduct

 <form asp-action="AddNewProduct" method="post">
    <br>
    <div class="col-md-12">
        <div class="row">
            <div class="col-md-6">
                <a asp-for="CatalogId">Catalog ID</a>
                <input asp-for="CatalogId" class="form-control">
                <a asp-for="Name">Name</a>
                <input asp-for="Name" class="form-control">

            </div>
            <div class="col-md-6">
                <a asp-for="Description">Description</a>
                <textarea asp-for="Description" class="form-control" rows="7"></textarea>
            </div>
        </div>
        <div class="row">
            <div class="col-md-6">
                <label asp-for="Features"></label>

                <div id="FeatureList">
                    <a href="#" id="btnAdd">Add Feature</a>
                    <br />
                    <input type="text" asp-for="Features" class="items" name="Features[0].FeatureTitle" />
                    <input type="text" asp-for="Features" class="items" name="Features[0].FeatureDescription" />
                </div>                 
            </div>
        </div>
        <div class="row">
            <div class="col-md-12">
                <br>
                <button type="submit" class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</form>

@section Scripts
{
    <script type="text/javascript">
        $("#btnAdd").click(function (e) {
            e.preventDefault();
            var i = ($(".items").length) / 2;
            var n = '<br /><input type="text" class="items" name="Features[' + i + '].FeatureTitle" />' +
                '<input type="text" class="items" name="Features[' + i + '].FeatureDescription" />'

            $("#FeatureList").append(n);
        });
    </script>
}

3.Контроллер

[HttpPost]
public IActionResult AddNewProduct(Product newProduct)
...