Я пытаюсь создать форму, которая будет использоваться клиентами для размещения заказа на переменное количество моделей. Это похоже на пример от Steve Sanderson's blog, но я не использую javascript - у меня просто несколько представлений в моей форме.EditorFor с перечнем переменной длины - после удаления элемента отображаются неправильные данные
Все работает нормально, я могу добавить столько элементов, сколько хочу, но когда я удаляю элемент, всегда удаляется последний из списка. Вот код:
Фрагмент из Create.aspx
:
<% for (int i = 0; i < Model.Input.Models.Count; i++){%>
<%: Html.EditorFor(m => m.Input.Models[i])%>
<p><input type="submit" name="deleteModel#<%:i%>" value="Delete" /></p>
<%}%>
Интересный фрагмент из ModelCreateModel.ascx
EditorTemplate:
<div class="editor-field">
<%: Html.EditorFor(model => model.Name) %>
<%: Html.DisplayFor(model => model.Name) %>
</div>
В моей OrderCreateModel
У меня есть свойство Input
типа OrderCreateModel.InputModel
так Model.Input.Models
просто список ModelCreateModel
s
Теперь, если я:
Добавьте 3 модели, используя эту форму (с именами AAA, BBB, CCC)
Щелкните по
delete#0
представить, чтобы удалить модель ААА
В результате я получу редакторы для моделей AAA и BBB, но отображены для моделей BBB и CCC. Это просто слишком сумасшедшая для меня! Я проверил его с помощью скрипача, и на самом деле так выглядит ответ: это не ошибка моего браузера. Кроме того, после отладки моего кода я на 100% уверен, что удаляю модель BBB из моего Input.Models
перед тем, как передать ее View()
.
Любые предложения, как я могу это исправить?
Примечание: Я не хочу использовать javascript для этого. Он будет добавлен позже, чтобы обеспечить лучший пользовательский интерфейс, но сайт должен работать также с отключенным javascript.
Edit:
код контроллера:
[HttpPost]
[ActionName("Create")]
[MultipleSubmits(InputName = "deleteModel", Argument = "deleteModelNr")]
[Authorize(Roles = RoleHelper.Accountant + "," + RoleHelper.Admin)]
public ActionResult CreateDeleteModel(OrderCreateModel.InputModel input)
{
var viewModel = new OrderCreateModel {Input = input};
FillCreateModelWithMaps(viewModel, input.ClientId);
var deleteModelNr = (int) ViewData["deleteModelNr"];
if (input.Models.Count > deleteModelNr)
input.Models.RemoveAt(deleteModelNr);
return View(viewModel);
}
MutlipleSubmitsAttribute
наследует от ActionNameSelectorAttribute
и здесь он извлекает из deleteModelNr
ПРЕДСТАВЛЯЕТ имя и помещает его в ViewData
.
FillCreateModelWithMaps
только заполняет viewModel.ExistingMaps
с данными.
Просим выслать код контроллера. – jfar