BeginCollectionItem() предоставляет только последний добавленный элемент для PostBack

InquiryOrderViewModel

public class InquiryOrderViewModel
{
    public InquiryOrder InquiryOrder { get; set; }
    public List<InquiryOrderDetail> InquiryOrderDetails { get; set; }
}

InquiryOrderIndex View и скрипт для добавления элементов

@model eKnittingData.InquiryOrderViewModel
@using (Html.BeginForm("Save", "InquiryOrder"))
{
    <div id="editorRows">
        @foreach (var item in Model.InquiryOrderDetails)
        {
            Html.RenderPartial("_DetailEditorRow", item);
        }
    </div>
    @Html.ActionLink("Add another...", null, null, new { id = "addItem" })
    <div class="col-md-6">   <input type="submit" value="Save" class="btn btn-success" /> </div>
}

<script>
$('#addItem').click(function (e) {
    e.preventDefault();
    var isExist = false;
    $('.editorRow').each(function () {
        if ($(this).children('.class01').val() == 0 || $(this).children('.class02').find("option:selected").text() == "Select") {
            isExist = true;
            return false;
        }
    });
    if (isExist == false) {
        $('.editorRow').each(function () {
            $(".editorRow").children().attr("disabled", "disabled");
        });
        $.ajax({
            url: '@Url.Action("BlankEditorRow", "InquiryOrder")',
            cache: false,
            success: function (data) {
                $("#editorRows").append(data);
            }
        });
    }
});
</script>

DetailEditorRow PartialView

@model eKnittingData.InquiryOrderDetail
@using eKnitting.Helpers

@using (Html.BeginCollectionItem("InquiryOrderDetails"))
{
<div class="editorRow">
    @Html.DropDownListFor(a => a.ComponentId, (SelectList)ViewBag.CompList, "Select", new { Class = "class02" })
    @Html.DropDownListFor(a => a.DesignCodeId, (SelectList)ViewBag.DCodeList, "Select", new { Class = "class03" })
    @Html.TextBoxFor(a => a.NoOfParts, new { Class = "class01" })
    <a href="#" class="deleteRow">delete</a>        
</div>
}

ActionResult, который возвращает PartialView

public ActionResult BlankEditorRow()
{
        var objContext = new KnittingdbContext();
        ViewBag.CompList = new SelectList(objContext.Components, "ComponentId", "ComponentName");
        ViewBag.DCodeList = new SelectList(objContext.DesignCodes, "DesignCodeId", "DesignCodeCode");

        return PartialView("_DetailEditorRow", new InquiryOrderDetail());
 }

ActionResult для 'GET'

        var objContext = new KnittingdbContext();

        var newIovm = new InquiryOrderViewModel();
        var newIo = new InquiryOrder();
        //initial item
        var newIoD = new List<InquiryOrderDetail>
        {
            new InquiryOrderDetail()
        };

        newIovm.InquiryOrder = newIo;
        newIovm.InquiryOrderDetails = newIoD;

        ViewBag.CompList = new SelectList(objContext.Components, "ComponentId", "ComponentName");
        ViewBag.DCodeList = new SelectList(objContext.DesignCodes, "DesignCodeId", "DesignCodeCode");

        return View(newIovm);

ActionResult для 'POST'

public ActionResult Save(InquiryOrderViewModel inquiryOrderViewModel)
{
     .................
}

Когда я нажимаю кнопку добавления, я могу добавлять элементы динамически. Но для PostBack он дает мне только последний добавленный элемент. Я проверил это, поставив точку останова на пост ActionResult. Как я могу получить всю коллекцию для PostBack? Где я неправ? Вся помощь приветствуется. Спасибо!

1 ответ

Решение

Ваши скрипты устанавливают переменную var isExist = false;, Когда вы добавляете новый элемент, вы проверяете, является ли значение false (что, если вы получили это далеко), а затем отключите все существующие входы.

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

Непонятно, почему вы хотите отключить их, но если вы хотите запретить редактирование существующих строк, сделайте их readonly

$(".editorRow").children().prop("readonly", true);
Другие вопросы по тегам