2016-08-28 5 views
-1

Передаю список на частичный просмотр, и он отлично работает, он отображает все данные, но когда я сохраняю модель, List возвращает null, что мне не хватает?Partial View List возвращает null при сохранении модели

  • Не обращайте внимания на объекты, я написал поддельные для примера.

этого cshtml:

@model ViewModels.StudentVM 

@using (Html.BeginForm("SaveStudent", "StudentsView", FormMethod.Post})) 
{ 
    @Html.AntiForgeryToken(); 
    <div class="row"> 
     <span>Student name:</span> 
     @Html.TextBoxFor(s => s.Name) 
    </div> 
    <div> 
     @Html.Partial("StudentsList", Model.Students) 
    </div> 
    <div class="form-group"> 
     <input type="submit" value="Save" class="btn"> 
    </div> 
} 

При загрузке зрения я получаю все студенты к View Model:

vm.Students = await _studentController.GetAllStudents(); // returned 20 Students. 

Частичный вид:

@model IEnumerable<Entities.Students> 

<table class="table-bordered"> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.CheckBoxFor(modelItem => item.IsSelected) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Name) 
      </td> 
     </tr> 
    } 
</table> 

I хотел бы получить всех выбранных учеников, поэтому скажем, что я выберу 3 студентов. И затем нажмите кнопку «Сохранить». Результат: Model.Students - null, хотя я выбрал 3 ученика. Как я могу получить этих студентов?

+1

вы не можете использовать частичный для создания элементов управления для сложного объекта, если вы не передать 'HtmlFieldPrefix' (см [этот ответ] (http://stackoverflow.com/questions/29808573/ получение самой ценности, из-а-вложенного комплексно-Ob ject-that-is-pass-to-a-partial-view/29809907 # 29809907)), но правильный подход заключается в использовании «EditorTemplate» для типа «Студенты» (см. [этот ответ] (http: // stackoverflow .com/questions/30094047/html-table-to-ado-net-datatable/30094943 # 30094943) для примера) –

+1

И отметьте флажок по своему обыкновенному сообщению ничего значимого - вам понадобится вход для свойства ID объект «Учащиеся» –

ответ

1

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

Предполагая, что ваш StudentVM имеет Students коллекции типа IEnumerable<Students>

Если параметр вашего HttpPost метода действия является типом StudentVm, вы должны убедиться, что ваш частичный вид генерирует входные поля формы с именем, как «Студенты [ 0] .Name , 'Students[1].Name и т.д. вы можете использовать метод Html.TextBox хелперов и указать пользовательские имена

@model IEnumerable<Students> 
<table class="table-bordered"> 
    @{ 
     var counter = 0; 
    } 
    @foreach (var student in Model) 
    { 
     <tr> 
      <th>Name</th> 
      <td>@Html.TextBox("Students[" + counter + "].Name", student.Name)</td> 
     </tr> 
     counter++; 
    } 
</table> 

Если вы просто отображения имен существующих студентов, вам не нужно текстовых полей, вы можете простофиля и отображать их внутри цикла. В таком случае, когда подает форму, почему вы беспокоитесь о том, что коллекция студентов составляет null? Вы пытаетесь сохранить нового студента, который будет находиться в .Name. Итак, если вам нужны уже существующие студенты (но почему?), Вы можете вызвать метод GetAllStudents.

+0

Я забыл написать главное - я обновил свой пост.У меня на самом деле есть флажок рядом с каждым учеником, и я хочу получить всех выбранных студентов, но он возвращает null. Например: Если я выберу 1 ученика, то я увижу в своем списке: Имя: «Имя студента», IsSelected: true. И все остальные ученики будут выбраны: false. –

+1

Вы должны рассмотреть возможность использования шаблонов редакторов. Взгляните на [Как узнать выбранные флажки из метода создания действия HttpPost Create?] (Http://stackoverflow.com/questions/38961222/how-to-know-the-selected-checkboxes-from-within- -httppost-create-action-metho) – Shyju

+0

@Shyju почему бы не использовать цикл for вместо счетчика? –

0

может быть, вы использовали 2 различных модели с точки зрения ...... вы можете использовать 2 модели в 1 ViewModel Нет необходимости частичный вид

ViewModels.StudentVM != IEnumerable<Entities.Students> 

вы можете все данные (многие модели) прошли в 1 вид модели :

var vm = new TestViewModel(); 
vm.one = db.one.tolist(); 
vm.two = db.two.tolist();