2015-12-28 2 views
0

У меня есть массив, который я хочу связать с выпадающим списком. Вот код:ASP.NET MVC Binding массив для DropDownFor

@for (int i = 1; i <= 5; i++) 
{ 
    @for (int j = 1; j <= 7; j++) 
    { 
     @Html.DropDownListFor(m => @Model.Periods, new SelectList(@Model.Items, "Id", "Title", @Model.ScheduleList[i, j])) 
    } 
} 

@ Model.Periods обычный пустой массив целых чисел. @ Model.ScheduleList - это двухмерный целочисленный массив и содержит значения параметра, которые должны быть выбраны при привязке. Если я заменяю:

@Model.Periods 

с:

@Model.Periods[i*10 + j] 

Выбранные значения показываются, но генерируемый выбрать вход имеет название, как, например, периоды [34], а не только периоды, и я получаю null модель модель на обратной стороне. Итак, мой вопрос: как связать массив oridnary с выпадающим списком и передать ему выбранное значение другому массиву?

+0

Трудно понять, к какому результату вы пытаетесь достичь, вы хотите иметь 5 * 7 = 35 выпадающих списков? –

+0

Да, я хочу 35 выпадающих списков, которые должны быть сохранены в базе данных, а затем пользователь может их редактировать. В @ Model.ScheduleList У меня есть значения из базы данных, но я не могу изменить сгенерированный вход для ввода, чтобы показать, что введенный по умолчанию первый элемент по умолчанию – snaksa

+1

'@ Model.Periods [i * 10 + j]' is 'почти' правильно - чтобы отправить обратно эти данные, вы должны отправить их обратно со всеми значениями от периодов [0] до периодов [34], если какой-либо из периодов [X] (где X от 0 до 34 включительно) будет отсутствовать, вы выиграли Получать правильные данные.Также индекс массива должен строго начинаться с 0. Поэтому, вероятно, '@ Model.Periods [(i-1) * 10 + (j-1)]' должно быть хорошо. –

ответ

1

@ Model.Periods [i * 10 + j] не является на 100% правильным - чтобы отправить эти данные в ваш контролер, вы должны отправить его обратно со всеми значениями, начиная с Periods[0], прямо до Periods[5 * 7 - 1].

Если какой-либо из Periods[X] (где X от 0 до 34 включительно) будет отсутствовать, вы не получите правильные данные. Также индекс массива должен строго начинать с 0.

Так, например:

Periods[0] = 1 
Periods[1] = 2 
Periods[2] = 3 
Periods[4] = 4 

будет привязан к следующей матрице: [1, 2, 3], потому что нет никакой полезной нагрузки элемент с последовательным индексом между 2 и 4.

Для полезной нагрузки:

Periods[1] = 1 
Periods[2] = 2 
Periods[3] = 3 
Periods[4] = 4 

Результат будет null - первый индекс массива отсутствует в полезной нагрузке.

Для вас, вероятно, @Model.Periods[(i-1)*10 + (j-1)] должно быть хорошо.

Если вы действительно нужны ваши индексы быть непоследовательными, вы можете использовать эту работу вокруг: для каждого элемента добавить скрытое поле:

<input type="hidden" name="Periods.Index" value="{your index}" /> 

Так что ваш код будет выглядеть так:

@for (int i = 1; i <= 5; i++) 
{ 
    @for (int j = 1; j <= 7; j++) 
    { 
     <input type="hidden" name="Periods.Index" value="@(i * j)" /> 
     @Html.DropDownListFor(m => @Model.Periods, new SelectList(@Model.Items, "Id", "Title", @Model.ScheduleList[i, j])) 
    } 
} 

Но это не должно использоваться в вашем текущем сценарии. Более подробную информацию об индексаторах можно найти в Интернете - например. на http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

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