Коллекция форм MVC не показывает предыдущие отправленные элементы

#c# #asp.net-mvc #model-view-controller #formcollection

Вопрос:

Я использую FormCollection и getValues (), и у меня возникают проблемы, если я повторно отправляю информацию. У меня есть кнопка, которая вычисляет наклон диапазона записей. Когда я вычисляю наклон, я сохраняю информацию во временной таблице и повторно отображаю значения в списке. Когда я впервые сохраняю записи, нет проблем с сохранением и построением списка. Однако, когда я попытаюсь снова рассчитать наклон, он не распознает предыдущие записи или какие-либо изменения в предыдущих записях, но любые новые элементы будут распознаны.

мой контроллер для создания отображает список, если в временной таблице есть какие-либо значения

                 model.TempPointList = db.Temp_SO2AuditMultipointCal
                .Where(x => x.SO2AuditCalID == tempID)
                .OrderByDescending(x => x.CalPoint).ToList();
 

и HttpPost смотрит на коллекцию форм

                 if (Command == "CalcSlope")
            {
                string[] pointItems1 = form.GetValues("Point");
                string[] concItems1 = form.GetValues("CalConc");
                string[] dasItems1 = form.GetValues("DAS");
                string[] diffItems1 = form.GetValues("Diff");
               //use arrays to calculate the slope ...
            }
 

мое представление собирает и отображает значения

         <table class="table">
        <tbody id="myTable">
            <tr>
                <th>Select</th>
                <th>Point</th>
                 <th>Cal Conc</th>
                <th>DAS</th>
            </tr>
                foreach (var item in Model.TempPointList)
                {
                    <tr>
                        @Html.HiddenFor(modelItem => item.Temp_SO2AuditMultipointCalID)
                        <td><input type='checkbox' name='record'></td>
                        <td>@Html.EditorFor(modelItem => item.CalPoint, new { @autocomplete = false })</td>
                        <td>@Html.EditorFor(modelItem => item.CalConc, new { @autocomplete = false, @Cache = false })</td>
                        <td>@Html.EditorFor(modelItem => item.DASResponse, new { @autocomplete = false, @Cache = false })</td>
                    </tr>
                }
            }
 

когда я добавляю элемент в список, у меня есть кнопка Добавить строку, которая выполняет следующую функцию

 $(".add-row").click(function () {
            var Point = $("#Point").val();
            var CalConc = $("#CalConc").val();
            var DAS = $("#DAS").val();
            
                var count = $('#myTable').children('tr').length;
                $('#counter').html(count);

                $('#myTable').append("<tr><td><input type='checkbox' name='record'></td><td><input type='text' name='Point' value= "   Point   "></td><td><input type='text' name='CalConc' value= "   CalConc   "></td><td><input type='text' name='DAS' value= "   DAS   "></td></tr>");
        });
 

Я пробовал настраивать @Cache = false и добавлять ModelState.Clear(); в контроллер, однако они ни на что не влияют.

Ответ №1:

Я решил проблему, удалив список и отобразив его. Я добавил функцию window.onload.

         window.onload = function () {
        if ($('#Temp').val() == "yes") {
            $.ajax({
                type: "POST",
                url: "/CertsHelper/SOAudit",
                data: { id: $('#SO2AuditCalID').val() },
                dataType: "json",
                success: function (index) {
                    var count = $('#myTable').children('tr').length;
                    $('#counter').html(count);
                    $('#myTable').append(index);
                },
                error: function (error) {
                    alert("Display Temp Points not working: "   error);
                }
            });
        }
    }
 

Функция выполняет действие Result, которое предоставляет строковый результат для добавления таблицы.

     public JsonResult SOAudit(int id)
    {
        var tempPoints = db.Temp_SO2AuditMultipointCal
            .Where(x => x.SO2AuditCalID == id);
        string Color = "";
        StringBuilder sb = new StringBuilder();
        foreach (var x in tempPoints)
        {
            sb.Append("<tr><td><input type='checkbox' name='record'></td><td><input type='text' name='Point' value= "   x.CalPoint   "></td><td><input type='text' name='CalConc' value= "   x.CalConc   "></td><td><input type='text' name='DAS' value= "   x.DASResponse   "></td></tr>");

            //delete the recorded temp point
            Temp_SO2AuditMultipointCal _Points = db.Temp_SO2AuditMultipointCal.Find(x.Temp_SO2AuditMultipointCalID);
            db.Entry(_Points).State = EntityState.Deleted;
            db.SaveChanges();
        }
        string points = sb.ToString();
        return Json(points);
    }