2013-09-10 3 views
0

В других частях моего веб-сайта я использую вложенные списки и могу отображать и сохранять без проблем.mvc 4 complex list, возвращающий null

Однако я не могу понять, почему он не работает на этот раз.

ViewModel

public class ActivityEditViewModel 
{ 
    //Activity 
    public int ActivityID { get; set; } 

    //... more properties 

    public List<ActivityService> ActivityServices { get; set; } 
    public class ActivityService 
    { 
     public int ServiceID { get; set; } 
     [DisplayName("Outcome Comment")] 
     public string OutcomeComment { get; set; } 

     //... more properties 
    } 
} 

Просмотр (соответствующая часть)

@for (int i = 0; i < Model.ActivityServices.Count; i++) 
{ 
    @Html.HiddenFor(x => x.ActivityServices[i].ServiceID) 
    @Html.LabelFor(x => Model.ActivityServices[i].OutcomeComment) 
    @Html.TextBoxFor(x => Model.ActivityServices[i].OutcomeComment) 
} 

Контроллер

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(ViewModels.ActivityEditViewModel vm) 
    { 
     //vm.ActivityServices <== is always null 

Вопрос

Почему vm.ActivityServices null null?

+0

Беглым взглядом кажется мне верным. Лучший способ отладки MVC-привязки - посмотреть на фактические значения форм, которые представлены в HTTP-запросе, на странице, где он работает, и на странице, где нет. Обычно несоответствие легко обнаружить. – Zruty

+1

Собственно, посмотрите на свой код вида: он должен быть 'x => x.Something' все время – Zruty

+0

@ Zruty Хорошее пятнистость, однако изменение кода не имеет значения. Все еще null. Любые другие идеи? Кроме того, как я могу просмотреть «фактические значения формы»? – PostureOfLearning

ответ

0

Вы можете создать частичный вид на ActivityService и сделать это в Еогеасп:

В вашей фактической точки зрения:

@foreach(ActivityService item in Model.ActivityServices) 
{ 
    @Html.Partial("ActivityService", item) 
} 

В новом частичном зрения ActivityService.cshtml:

@model Proyect.Models.ActivityEditViewModel.ActivityService 

@Html.HiddenFor(m => m.ServiceID) 
@Html.LabelFor(m => m.OutcomeComment) 
@Html.TextBoxFor(m => m.OutcomeComment) 
0

Таким образом, ваш синтаксис Razor для дизайна должен быть следующим:

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

@ 
{ 
Model.ActivityServices.RemoveAll(o=> //your skip condition); 
for (int i = 0; i < Model.ActivityServices.Count; i++) 
{ 
    @Html.HiddenFor(x => Model.ActivityServices[i].ServiceID) 
    @Html.LabelFor(x => Model.ActivityServices[i].OutcomeComment) 
    @Html.TextBoxFor(x => Model.ActivityServices[i].OutcomeComment) 
} 
} 
+0

Благодаря вашим комментариям о потребностях в индексах и о том, что они должны быть в порядке, мне удалось выяснить проблему. Проблема заключалась в том, что мой код был немного сложнее, чем показывал пост, и индекс не использовался по порядку и иногда пропускал число. Если вы отредактируете свой ответ с этими точками, я могу отметить его как правильное. – PostureOfLearning

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