2010-08-25 5 views
1

Я пытаюсь создать форму, которая будет использоваться клиентами для размещения заказа на переменное количество моделей. Это похоже на пример от 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

Теперь, если я:

  1. Добавьте 3 модели, используя эту форму (с именами AAA, BBB, CCC)

  2. Щелкните по 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 с данными.

+0

Просим выслать код контроллера. – jfar

ответ

0

EditorFor() и некоторые другие вспомогательные методы используют ViewData.ModelState вместо самой модели. Таким образом, кажется, что изменения в Модели не поддерживаются. На мой взгляд, это похоже на серьезную ошибку в MVC.

2

Добавьте это в действии:

ViewData.ModelState.Clear();