2013-09-09 3 views
2

У меня есть View, который позволяет редактировать List из ViewModel. Код работает до отображения функциональности. Но я не могу получить значение в том же списке из представления.Получение списка <ViewModel> from View to Controller

 public ActionResult Funtion() 
     { 
      List<ViewModel> ViewModel= (List<ViewModel>)TempData["ViewModel"]; 
      return View(ViewModel); 
     } 

     [HttpPost] 
     public ActionResult UserFormSubmission(List<ViewModel> ViewModel) 
     {  
      return View(); 
     }   

Значение в списке функции POST равно null. Как я могу получить значения из представления в контроллер.

EDIT: Я попытался с помощью решений, упомянутых в assolution на вопрос How to pass IEnumerable list to controller in MVC including checkbox state?. Но возникла следующая ошибка:

Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable

Также я не мог понять, использование определенных тегов в нем, как AntiForgeryToken, HiddenFor и т.д. Так что, если возможно, кто-то пожалуйста, придумать простое решение или лучшего объяснения.

EDIT 2: Я изменил @model IEnumerable<ViewModel> к @model List<ViewModel> и ошибке Невозможно применить индексирование с [] к выражению типа «System.Collections.Generic.IEnumerable было исправлено.

EDIT 3: я был в состоянии получить значение Textbox и CheckBox в контроллер, но RadioButton и DropDownList's selected values cant be identified at the [HttpPost] `функция? Что мне здесь не хватает?

@for (i = 0; i < Model.Count(); ++i) 
{ 
if (Model[i].TypeId == 4) 
        { 
         //radiobutton 
         for (int j = 0; j < Model[i].Options.Count(); ++j) 
         { 
        <div> 
         @Html.HiddenFor(m => m[i].Options[j].OptionId)       
         @Html.HiddenFor(m => m[i].Options[j].OptionValue) 
         @Html.HiddenFor(m => m[i].Options[j].Id) 

         @Html.RadioButtonFor(m => m[i].Options[j].Value, @Model[i].Options[j].DisplayText) 
         @Html.DisplayFor(m => m[i].Options[j].DisplayText) 
        </div> 

         } 
        } 
} 
+0

Введите код, например:

html tag? –

+2

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx – Vladimir

+0

@ ElvinArzumanoğlu - Это не имеет отношения к текущей ситуации.Я включил только то, что нужно. –

ответ

3

Я предлагаю:

  1. Использование сильно типизированных
  2. использования for(i = 0; ...; ...) петель, иначе он не будет работать это просто

другой подход может быть (, пожалуйста, не используйте этот подход):

  1. Создание JSON массив из списка JS после события
  2. Отправить запрос AJAX POST в контроллер с этими данными
+0

Я обновил свой вопрос. Посмотрите, является ли ваш ответ решением в этом случае –

+0

@Rohit, я не тот человек, который может судить, верен ли мой ответ или нет. Выберите этот ответ в качестве логически правильного решения (так, чтобы другие читатели не ошибались), и ответ, который дал вам решение или подсказывал вам решение. –

+0

Ничего не работает в моем случае. :-( –

1

Вы должны использовать индексатор istead из Еогеасп даного, чтобы позволить MVC построить свой список обратно. simmilar вопрос уже задавался How to pass IEnumerable list to controller in MVC including checkbox state?

+0

Я видел это, и я попытался использовать его. Но столкнулся с следующей ошибкой: «Невозможно применить индексирование с [] к выражению типа« System.Collections.Generic.IEnumerable » –

+0

Вам нужно изменить тип в представлении, чтобы использовать List вместо Ienumerable –

+1

Объявление модели в представлениях должно быть: @model List

1

как #theghostofc предложил вы можете использовать цикл и управления с использованием для на индекс генерировать элементы управления например

for(int i=0;i<Model.Count;i++) 
{ 
<tr> 
<td> 
    @Html.TextBoxFor(model=>Model[i].Text) 
</td> 
<tr>  
} 

И при отправке формы, поскольку вы использовали список моделей, вы можете легко получить его.

+0

Проблема заключается в том, что у меня есть более одного типа типа TextBox, CheckBox, RadioB utton, DropDownList и т. д. –

+0

Если я не предоставил Id как скрытое поле, он не работал. –

+0

Вы имеете в виду, что у вас есть более одного типа элементов управления для того же свойства.? Но если вы имеете в виду, что у вас есть другие элементы управления, такие как checkbox или radiobutton или dropdownlist для разных свойств, то у вас нет проблем с получением выбранных значений этих элементов управления, а также с помощью элемента управления с тегами, поскольку я преувеличил для текстового поля, но подходящий тип данных, например Для флажка не требуется Nullable boolean и т. Д. – serene