Вернуться в список Razor View к действию - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть Action, где я перебираю неизвестное количество значений.Это каналы, которые относятся к устройству, пользователь выбирает устройство из раскрывающегося списка, и форма создается на основе количества каналов, которые имеет устройство, оно может быть 1 или 50 или где-то между ними.

 //This is the model I use

        [Display(Name = "Select a customer")]
        public IEnumerable<SelectListItem> CustomerNames { get; set; }
        public string CustomerNameSelected { get; set; }

        [Display(Name = "Select a device")]
        public IEnumerable<SelectListItem> Devices { get; set; }
        public string DeviceSelected { get; set; }

        [Display(Name = "Channel Name")]
        public string ChannelName { get; set; }

        [Display(Name = "Channel Type")]
        public string ChannelType { get; set; }

        [Display(Name = "Calculated")]
        public bool Calculated { get; set; }

        public int ChannelCount { get; set; }

        public List<ChannelManagerModel> ChannelNames { get; set; }

        private List<string> UomList {
            get
            {
                var l = new List<string>();
                l.Add("Electricity");
                l.Add("Gas");
                l.Add("Water");
                l.Add("Heat");
                l.Add("kWh");
                l.Add("Wh");
                l.Add("kVarh");
                l.Add("Wh");
                l.Add("Volts 1");
                l.Add("Volts 2");
                l.Add("Volts 3");
                l.Add("Current 1");
                l.Add("Current 2");
                l.Add("Current 3");
                l.Add("Hz");
                l.Add("Litres");
                l.Add("Cubic Metres");
                l.Add("Cubic Feet");

                return l;
            }
        }

        public IEnumerable<SelectListItem> Uom {

            get {

                List<SelectListItem> sl = new List<SelectListItem>();
                foreach (var item in UomList)
                {
                    sl.Add(new SelectListItem() { Text = item, Value = item });
                };

                return sl;
            }

            set { }
        }
        public string UomSelected { get; set; }

Поскольку я теперь создал новые элементы формы, используя цикл, как я могу передать эту дополнительную информацию обратно в действие, используя ViewModel.

   @{List<string> channelName = Model.ChannelNames.Select(x => x.ChannelName).OrderByDescending(x => Model.ChannelName).ToList();
                    int count = 0;
                    foreach (var channel in channelName)
                    {
                        count++;
                        var ddlId = ("ddlId" + count).ToString();
                        var txtBoxId = ("txtBoxId" + count).ToString();
                        <tr>
                            <td>
                               @Html.Label(@channel)
                            </td>
                            <td>
                                @Html.DropDownListFor(x => x.UomSelected, Model.Uom, "Select", new { @class = "form-control form-control-sm", @id = @ddlId, @data_val = false })
                                <script type="text/javascript">

                                        $('#@ddlId').change(function () {
                                            $('#@txtBoxId').val($(this).val());
                                        });
                                </script>
                            </td>
                            <td>
                                @Html.EditorFor(model => model.ChannelType, new { htmlAttributes = new { @id = @txtBoxId, @class = "form-control form-control-sm" } })
                                @Html.ValidationMessageFor(model => model.ChannelType, "", new { @class = "text-danger" })
                            </td>
                            <td>
                                @Html.CheckBoxFor(model => model.Calculated)
                            </td>
                        </tr>
                    }
                }

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

Это действие в контроллере, в которое я хочу передать новые данные.

 public async Task<ActionResult> SaveData(ChannelManagerViewModel cvm)
    {
        var cm = new channelManagerModel();

        //Maybe loop through the ViewModel and add to the EF Model
        var channelManagerModel = new ChannelManagerModel();

        if (ModelState.IsValid)
        {
            db.ChannelManager.Add(channelManagerModel);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        return View(channelManagerModel);
    }

1 Ответ

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

Сделал это на днях, используйте цикл for(int count... вместо foreach, как показано ниже;

for(int count=0;count<channelName.Count;count++) {
     <tr>
          <td>
               @Html.Label(@channelName[count])
          </td>
          <td>
               @Html.DropDownListFor(x => x[count].UomSelected, Model.Uom, "Select", new { @class = "form-control form-control-sm", @data_val = false })
          </td>
          <td>
               @Html.EditorFor(x => x[count].ChannelType, new { htmlAttributes = new { @id = @txtBoxId, @class = "form-control form-control-sm" } })
               @Html.ValidationMessageFor(x => x[count].ChannelType, "", new { @class = "text-danger" })
          </td>
          <td>
               @Html.CheckBoxFor(x => x[count].Calculated)
          </td>
     </tr>
}

Теперь в вашем контроллере вы можете получить что-то вроде ниже

public async Task<ActionResult> SaveData(List<ChannelManagerViewModel> cvm)
...