Получение данных из ViewModel в методе POST - PullRequest
0 голосов
/ 14 июля 2020

У меня есть модель представления, которая выглядит так

 public class ItemViewModel
    {
        [Required]
        public int Id { get; set; }
        public string ItemId { get; set; }
        public string ItemName { get; set; }
        public string MFGNumber { get; set; }
        public IList<ItemPartViewModel> Parts { get; set; }
        public IList<ItemComponentViewModel> Components{ get; set; }
        public IList<ComponentPartViewModel> ComponentParts { get; set; }
        public IList<ComponentSubCompViewModel> ComponentSubComps { get; set; }
        public IList<SubCompPartViewModel> SubCompParts { get; set; }
        public IList<SubCompSubCompViewModel> SubCompSubComps { get; set; }
        public IList<SubCompSubCompPartViewModel> SubCompSubCompParts { get; set; }
    }

Как вы можете видеть, модель просмотра также имеет соответствующие модели представления, которые выглядят так

public class ItemPartViewModel
    {
        [Required]
        public int ID { get; set; }
        public string PartID { get; set; }
        public HtmlString PartLink { get; set; }
        public string MFGNumber { get; set; }
        public string PartName { get; set; }
        public float QtyInItem { get; set; }
        public float OnHand { get; set; }
        public float OnWorkOrder { get; set; }
        public float Committed { get; set; }
        public float FSTK { get; set; }

        // This is the additional property to contain what user picks
        public PartActionType SelectedActionType { get; set; }
    }

ItemViewModel заполняется через мой метод OrderSelection GET, который выглядит следующим образом

 public ActionResult SpecialOrderSelection(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            JobOrder jobOrder = db.JobOrders.Find(id);
            if (jobOrder == null)
            {
                return HttpNotFound();
            }
            ViewBag.JobOrderID = jobOrder.ID;
            ItemInstance ii = db.ItemInstances.Where(x => x.serialNumber == jobOrder.serialNumber).FirstOrDefault();
            Item item = db.Items.Find(ii.ItemID);

            var vm = new ItemViewModel
            {
                Id = item.ID,
                ItemId = item.ItemID,
                ItemName = item.Name,
                Parts = new List<ItemPartViewModel>(),
                Components = new List<ItemComponentViewModel>(),
                ComponentParts = new List<ComponentPartViewModel>(),
                ComponentSubComps = new List<ComponentSubCompViewModel>(),
                SubCompParts = new List<SubCompPartViewModel>(),
                SubCompSubComps = new List<SubCompSubCompViewModel>(),
                SubCompSubCompParts = new List<SubCompSubCompPartViewModel>()
            };

            foreach (ItemHasParts ihp in item.IHP)
            {
                Part part = db.Parts.Find(ihp.PartID);
               

                vm.Parts.Add(new ItemPartViewModel
                {
                    ID = part.ID,
                    PartID = part.PartID,
                    PartLink = part.PartIDLink,
                    MFGNumber = part.MFG_number,
                    QtyInItem = ihp.qty,
                    OnHand = part.On_Hand,
                    OnWorkOrder = part.On_Order_Count(true, true),
                    Committed = part.CommittedCount(true, true),
                    FSTK = part.FSTK,
                    PartName = part.Name,
                    SelectedActionType = PartActionType.Transfer
                });
            }

    return View(vm);
}

Затем данные правильно отображаются на странице выбора. Но на этой странице пользователи должны выбрать, хотят ли они собрать / передать / утилизировать деталь. Поэтому, как только пользователь закончил выбирать свои параметры, он нажимает кнопку «Отправить». Затем это POSTS к этому методу

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult SpecialOrderSelection(ItemViewModel model)
        {
            //list of transfers
            //list of harvests
            //list of disposals      
            if (ModelState.IsValid)
            {
                JobOrder jobOrder = db.JobOrders.Find(model.Id);
                if (jobOrder == null)
                {
                    return HttpNotFound();
                }
                ViewBag.JobOrderID = jobOrder.ID;
                // do whatever with 'model' and return or redirect to a View
            }

            //ViewBag.submitted = true;
            return RedirectToAction("SpecialOrderSummary", new { ID = jobOrder.ID });   

        }

Проблема здесь в том, что для каждого списка (Parts / Components / ComponentParts / et c.) ID равен нулю. Почему в POST он пуст, но не в GET? И как я могу это исправить, чтобы оно не было нулевым

Вот начало моего просмотра

 @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(model => model.Id)
        <div class="form-horizontal">

            <h2 class="noprint">Special Order Selection</h2>
            <p style="color:red" class="noprint">Please select what is to be done with each component/part</p>

            <td align="left">


                <hr class="noprint" />
                <h4 class="noprint"><b>Work Order ID:</b> @Html.DisplayFor(model => j.ID)</h4>
                <br class="noprint" />

И вот его полезная нагрузка

<form action="/JODetails/SpecialOrderSelection/3092" method="post"><input name="__RequestVerificationToken" type="hidden" value="LETTERSANDNUMBERS" /><input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="3092" />        <div class="form-horizontal">

            <h2 class="noprint">Special Order Selection</h2>
            <p style="color:red" class="noprint">Please select what is to be done with each component/part</p>

Здесь это пример того, что возвращает «Часть» в моем списке «частей»

Часть

1 Ответ

0 голосов
/ 14 июля 2020

Ваше скрытое поле в форме - Id, которое является Model.Id (ItemViewModel), а не частью! и все же свойство, которое вы проверяете при POST, - это ID (это идентификатор детали). Вы ищете идентификатор части элемента, но у вас есть только идентификатор ItemViewModel в форме. Поскольку у вас есть другие значения для свойств частей элемента, вы должны перебирать этот список частей где-нибудь в вашей форме. Добавьте туда скрытый ввод для идентификатора детали.

@{
  foreach(var part in Model.Parts) {
     @Html.HiddenFor(model => part.ID)
  }
}
...