Проблема с поведением asp.net mvc modelBinding - PullRequest
0 голосов
/ 05 марта 2011

У меня сложная форма

Это позволяет пользователю создавать IncomeDeclaration, который имеет много действий.

Это прекрасно работает, когда разметка для действий выглядит следующим образом:

 <tr>
            <td>SomeActivity
                <input type="hidden" value="13123" name="EconomicActivityIncomeDeclarations[0].EconomicActivityId" id="EconomicActivityIncomeDeclarations_0__EconomicActivityId">
            </td>
             <td>
                <input type="text" name="EconomicActivityIncomeDeclarations[0].GrossIncome" id="EconomicActivityIncomeDeclarations_0__GrossIncome" />
            </td>
   </tr>

<tr>
            <td>SomeActivity
                <input type="hidden" value="654654" name="EconomicActivityIncomeDeclarations[1].EconomicActivityId" id="EconomicActivityIncomeDeclarations_1__EconomicActivityId">
            </td>
             <td>
                <input type="text" name="EconomicActivityIncomeDeclarations[1].GrossIncome" id="EconomicActivityIncomeDeclarations_1__GrossIncome" />
            </td>
   </tr>

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

<tr>
            <td>SomeActivity
                <input type="hidden" value="987987" name="EconomicActivityIncomeDeclarations[1b117bc9-ce4b-46d5-9de0-77ba98b82fd0].EconomicActivityId" id="EconomicActivityIncomeDeclarations_1b117bc9-ce4b-46d5-9de0-77ba98b82fd0__EconomicActivityId">
            </td>
             <td>
                <input type="text" name="EconomicActivityIncomeDeclarations[1b117bc9-ce4b-46d5-9de0-77ba98b82fd0].GrossIncome" id="EconomicActivityIncomeDeclarations_1b117bc9-ce4b-46d5-9de0-77ba98b82fd0__GrossIncome" />
            </td>
   </tr>

Странное поведение, которое я получаю, - это когда первые два (илидалее) имеют обычный формат [0], 1 ... и т. д., а затем я (через ajax) добавляю больше элементов формы, после чего действие Post фактически связывает элементы ajax с моделью ...

Таким образом, в основном IncomeDeclaration, который имеет все 3 действия, которые я использую здесь в качестве примера, получит только ТРЕТЬЕ (со случайными символами) добавленное к IncomeDeclaration ....

Я знаю егонемного сложно, но если кто-то знает, почему это происходит, я ценю это ...

кстати, вот что я использую.http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Ответы [ 3 ]

0 голосов
/ 05 марта 2011

Возможно, вы захотите взглянуть на этот пост: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx, в конце концов, Хакед говорит о помощнике, которого он сделал для связывания элементов, когда они не являются последовательностью.

При этом я обычно берудругой маршрут, когда у меня есть сложный список.Это будет работать только с включенным JavaScript.После отправки я создаю объект json, представляющий список.Затем я использую библиотеку json2, чтобы структурировать json и поместить его в скрытое поле, которое будет опубликовано.На сервере легко создать список с помощью JavaScriptSerializer и его метода десериализации.

Хотя это немного сложнее.Я предполагаю, что в итоге получается около 8 строк javascript и 2 строки серверного кода.

0 голосов
/ 05 марта 2011

Вы можете попробовать использовать механизм связывания словарной модели, описанный в этой статье - Связыватель модели словаря в ASP.NET MVC2 и MVC3

Единственное, что вы должны исправить в своем коде, - это различные типы ключевых элементов. Все ключи должны иметь одинаковый тип.

И, пожалуйста, прочитайте мой комментарий к статье, касающейся предлагаемых изменений в источнике класса DefaultDictionaryBinder.

0 голосов
/ 05 марта 2011

Вы должны сохранить правильную последовательность. После добавления новых действий используйте jquery для переименования текстовых полей в правильном порядке.

это код, который я использовал.

var tbody = $('#tableId');
    var trs = tbody.children();
    var row = 0;
    for (row = 0; row < trs.length; row++) {
        var txts = trs[row].getElementsByTagName('input');
        for (i = 0; i < txts.length; i++) {
            var name = txts[i].getAttribute('name');

            txts[i].setAttribute('name', name.replace(/\[.*\]/, 'People[' + row
+ ']'));
        }
    }
...