#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);
}