У меня есть модель с парой полей и списком объектов. Список объектов возвращает null. Любая помощь будет оценена по достоинству, так как я не вижу, что здесь происходит!

Мои классы моделей:

public class TradeDiscount 
{
    public int TradeCustomerId {  get; set; }
    public decimal Discount { get; set; }
    public string CategoryName { get; set; }
    public string CategoryGroupIdentifier { get; set; }
}

public class TradeCustomerDetails 
{
    public List<TradeDiscount> discounts { get; set; }
    public string CustomerName { get; set; }
    public int CustomerId { get; set; }
}

Мой контроллер выглядит так:

public ActionResult Details(int id)
{
    TradeCustomerDetails tradeCustomerDetails = repo.GetCustomerDiscountDetails(id);

    return View(tradeCustomerDetails);
}

[HttpPost]
public ActionResult Details(TradeCustomerDetails tradeCustomerDetails) 
{
    repo.SaveCustomerDiscoutDetails(tradeCustomerDetails);

    return View(tradeCustomerDetails);
}

Наконец, моя точка зрения такова:

@model Trade_Counter.Models.TradeCustomerDetails

@{
    ViewBag.Title = "Discount Details";
}

<h2>Details</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    
<div class="form-horizontal">
    <h4>Discount Details</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.CustomerName, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.CustomerName, new { htmlAttributes = new { @class = "form-control" } })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CustomerId, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.CustomerId, new { htmlAttributes = new { @class = "form-control" } })
        </div>
    </div>
    <div class="container-fluid form-horizontal">
        <h4>Details for @Model.CustomerName </h4>
        @Html.HiddenFor(model => model.CustomerId)

        @foreach (var deets in Model.discounts) {
            <div class="row form-group">
                <div class="col-md-6">
                    @Html.DisplayFor(modelItem => deets.CategoryName, new { htmlAttributes = new { @class = "form-control" } })
                </div>
                @Html.HiddenFor(modelItem => deets.TradeCustomerId)
                @Html.HiddenFor(modelItem => deets.CategoryGroupIdentifier)
                <div class="col-md-6">
                    @Html.EditorFor(modelItem => deets.Discount, new { htmlAttributes = new { @class = "form-control" } })
                </div>
            </div>
        }
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

2 значения верхнего уровня возвращаются нормально, но список пуст.

Заранее спасибо :-)

J

1
Jim Tench 16 Мар 2023 в 21:54

3 ответа

Мой дорогой друг, я пробовал следующие решения в подобных проблемах, с которыми я сталкивался раньше.

Сначала добавьте атрибут [Key] в public int TradeCustomerId { get; набор; } Другой способ — добавить информацию TradeCustomerId в представление, но скрыть ее.

Я надеюсь, это поможет вам.

0
Engin ÇELİK 16 Мар 2023 в 22:08

Используйте индексацию, чтобы привязка MVC работала правильно для списка:

@for (int i = 0; i < Model.discounts.Count(); ++i)
{
<div class="row form-group">
    <div class="col-md-6">
        @Html.DisplayFor(m => m.discounts[i].CategoryName, new { htmlAttributes = new { @class = "form-control" } })
    </div>
    @Html.HiddenFor(m => m.discounts[i].TradeCustomerId)
    @Html.HiddenFor(m => m.discounts[i].CategoryGroupIdentifier)
    <div class="col-md-6">
        @Html.EditorFor(m => m.discounts[i].Discount, new { htmlAttributes = new { @class = "form-control" } })
    </div>
</div>
}
0
Jackdaw 17 Мар 2023 в 02:13

В вашем классе TradeCustomerDetails вам нужно создать новый экземпляр List<TradeDiscount>:

public class TradeCustomerDetails 
{
    public List<TradeDiscount> discounts = new List<TradeDiscount>();
    public string CustomerName { get; set; }
    public int CustomerId { get; set; }
}
0
Rahul Sharma 17 Мар 2023 в 07:12