2013-09-23 2 views
0

У меня есть модель, которая имеет список подпунктов в нем, что-то вроде этого:список Подающий элементов с удаленной первой удаляет все элементы

class MyObj { 
    public string Name {get;set;} 
    public List<mySubObject> Items {get;set;} 
} 

и

class mySubObject { 
    public string Name {get;set;} 
    public int Order {get;set;} 
} 

Теперь, когда я сделать список с для цикла и editorFor, HTML, я получаю somethign так:

<input type="text" name="Items[0].Name"> 
<input type="Number" name="Items[0].Order"> 
<input type="text" name="Items[1].Name"> 
<input type="number" name="Items[1].Order"> 
... 
<input type="text" name="Items[9].Name"> 
<input type="number" name="Items[9].Order"> 

Теперь представьте удалить первый эл ement из HTML через jQuery, потому что я больше не хочу его в моем списке, а затем сохраняю список. Данные, восходящая без первого [0] элемента и всех элементов от 1 до 9 зайдете на сервер, но модель связывания терпит неудачу, и он показывает (на сервере), что список элементов является null

Что утра я делаю неправильно?

Является ли это ошибкой связующего по умолчанию?

ответ

0

Что я делаю неправильно?

Оставляя отверстия в индексах.

Является ли это ошибкой связующего по умолчанию?

Нет, это по дизайну. Вы не должны оставлять никаких отверстий в индексах.

Одна из возможностей состоит в том, чтобы пересчитать индексы, когда вы удаляете строку, но вам нужно будет написать тонну дрянного javascript для этого.

Я бы порекомендовал вам использовать другой подход. Вместо использования последовательных индексов используются Гиды. Этот подход подробно описан в следующем блоге Фила Хаака: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx (Секция без последовательных индексов).

И Стивен Сандерсон проиллюстрирована хороший маленький помощник в этом посте, который позволит вам очень легко достичь: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Что вы могли бы использовать так:

@using(Html.BeginCollectionItem("Items")) 
{ 
    for (var i = 0; i < Model.Items.Count; i++) 
    { 
     @Html.EditorFor(x => x.Name) 
     @Html.EditorFor(x => x.Order) 
    } 
} 

и он будет генерировать следующие :

<input type="hidden" name="Items.Index" value="F769E33C-4D07-4586-8D9C-63D386C641FA" /> 
<input type="text" name="Items[F769E33C-4D07-4586-8D9C-63D386C641FA].Name"> 
<input type="Number" name="Items[F769E33C-4D07-4586-8D9C-63D386C641FA].Order"> 

<input type="hidden" name="Items.Index" value="F4A4A9BB-4427-497E-BFD5-3CDE1F46095B" /> 
<input type="text" name="Items[F4A4A9BB-4427-497E-BFD5-3CDE1F46095B].Name"> 
<input type="number" name="Items[F4A4A9BB-4427-497E-BFD5-3CDE1F46095B].Order"> 

... 

Теперь не стесняйтесь добавлять/удалять строки столько, сколько вы хотите на клиенте с JavaScript, не опасаясь, что это нарушило бы т он моделирует привязку вашей коллекции.

+0

, потому что гораздо проще использовать вспомогательную функцию и дополнительную логику, чем просто для стандартного связующего устройства, чтобы игнорировать индексы? а? Я думаю, что этот подход ошибочен. Возможно, это не так, но не идеальное решение? – Aviatrix

+0

Erm, извините, какой подход неправильный? Я не совсем понял, что вы имеете в виду. Тот факт, что связующее устройство по умолчанию игнорирует отверстия в индексах или мое рекомендуемое решение без последовательных индексов? В обоих случаях, если вам не нравятся эти подходы, как объясняется в моем ответе, у вас всегда есть возможность пересчитать индексы при удалении строк на клиенте. Это просто альтернативный метод. –

+0

факт, что связующее устройство по умолчанию игнорирует отверстия, кажется мне неправильным. Рекомендуемое решение будет работать, и все в порядке. Но тот факт, что мы должны написать это ...:/ Другой вариант - сериализовать JSON и опубликовать его ... – Aviatrix

 Смежные вопросы

  • Нет связанных вопросов^_^