2015-10-09 3 views
0

У меня есть следующая ViewModel. Я пытаюсь заполнить внутреннее вложенное Icollection значениями, основанными на условии. У меня есть значения, которые заполняются для внешнего Icollection со значениями для внутреннего ICollection. Но когда я пытаюсь добавить его в представление, он показывает только первое значение.Заселение вложенных icollection в mvc

public class Option_OptionValues 
{ 
    public Option_OptionValues() 
    { 
     // this.Option = new Option(); 
     this.OptionValues = new List<OptionValue>(); 
     //this.OptionValues.First().SetValue = new List<SetValue>(); 
    } 
    public Option Option { get; set; } 
    public IEnumerable<OptionValue> OptionValues { get; set; } 
} 

Опция имеет Icollection of OptionValues. OptionValues ​​имеет ICollection SetValues ​​

Я делаю это излишним, используя ICollection OptionValues ​​в моей ViewModel?

Но я не могу правильно заполнить таблицу SetValues.

Контроллер

public ActionResult ViewOptionValues(int id) 
    { 
     var viewmodel = new Option_OptionValues(); 
     var op = db.Option.Include(x => x.OptionValues).FirstOrDefault(x => x.OptionID == id); 

     //var set = (from o in db.Option 
     //join ov in db.OptionValue on o.OptionID equals ov.OptionID 
     // join s in db.SetValue on ov.OptionValueID equals s.OptionValueID 
     //where o.TechnicalCharacteristicID == s.TcSet.TechnicalCharacteristicID 
     //select ov.SetValue).ToList(); 

     var set = (from s in db.SetValue 
         where (s.OptionValueID == op.OptionValues.FirstOrDefault().OptionValueID)).Select ; 

     //var set = db.OptionValue.Include(x => x.SetValue).Where(x => x.OptionValueID == op.OptionValues.FirstOrDefault().OptionValueID).ToList(); 
     //for(int i=0; i< op.OptionValues.Count ;i++) 
     //{ 
     //var set = db.OptionValue.Include(x => x.SetValue).FirstOrDefault(x => x.OptionID == op.OptionID); 
     //} 

     //var set = db.OptionValue.Include(x => x.SetValue).FirstOrDefault(x => x.OptionValueID == id); 

     if(op!=null) 
     { 
      viewmodel.OptionValues = op.OptionValues; 
      // viewmodel.OptionValues.FirstOrDefault().SetValue = op.OptionValues.FirstOrDefault().SetValue.Where(x => x.OptionValueID == id).ToList(); 
      //viewmodel.OptionValues.First().SetValue = new List<SetValue> { };  
     } 
     return View(viewmodel); 
    } 

Комментарии не удаляются в коде, чтобы показать возможности, которые я уже пробовал.

Я также сделал это на мой взгляд

@foreach (var item in Model.OptionValues) 
    { 
     //var row = @item.SetValue.Count + 1; 
     @:<tr> 
     @:<td rowspan="@item.SetValue.Count">@item.OptionVal</td> 
     @:<td rowspan="@item.SetValue.Count">@item.OptionValueID</td> 
     var set = item.SetValue.Where(x => x.OptionValueID == item.OptionValueID).ToList(); 
     //var set = item.SetValue.Where(x=>x.OptionValueID == item.OptionValueID); 
     if (set != null) 
     { 
      //for (int i = 0; i < item.SetValue.Count; i++) 
      int count = 0; 
      foreach(var i in set) 
      { 
        @item.SetValue.FirstOrDefault().TcSet.SetName 
        if (count == 0) 
       { 
        @:<td>@set.FirstOrDefault().TcSet.SetName</td> 
        @:<td> @set.FirstOrDefault().Value</td> 
        @:<td>@set.FirstOrDefault().Status</td> 
        @:</tr> 
       } 
        else 
        { 
         @:<tr> 
         @:<td>@set.FirstOrDefault().TcSet.SetName</td> 
         @:<td> @set.FirstOrDefault().Value</td> 
         @:<td>@set.FirstOrDefault().Status</td> 

       } 
       count++; 
      } 

     } 

Что я упускаю, что делает его не заполнить правильный путь?

Я пробовал использовать индекс в представлении, но это вызывало ошибку парсера. Ищет обходной путь.

ответ

0

Okk Я нашел ответ на свой вопрос. Но ответ всегда открыт для редактирования для лучшего подхода.

Я удалил ViewModel, потому что есть цель, обслуживаемая моей ViewModel, что делает мою программу более сложной.

Итак, у меня есть следующий класс модели для опций и OptionValues.

public class Option 
{ 
    public int OptionID { get; set;} 
    public string OptionName { get; set; } 
    public virtual ICollection<OptionValue> OptionValues { get; set; } 
} 


public class OptionValue 
{ 
    public int OptionValueID { get; set; } 
    public string OptionVal { get; set; } 
    public virtual Option Option { get; set; } 
    public virtual ICollection< SetValue> SetValue { get; set; } 
} 

В моем контроллере, я добавил опцию Value, которые должны быть включены в модели для Просмотра

public ActionResult ViewOptionValues(int id) 
    { 
     var model = new Option(); 
     var ov = db.Option.Include(x => x.OptionValues).FirstOrDefault(x => x.OptionID == id); 
     model.OptionValues = ov.OptionValues; 
     return View(model); 
    } 

И в представлении

@model TEDALS_Ver01.Models.Option 
<table class="table"> 
    <tr> 
     <th>Option Name</th> 
     <th>Option value</th> 
     <th>Set Value</th> 
     <th></th> 
    </tr> 
    @foreach (var item in Model.OptionValues) 
    { 
     //var row = @item.SetValue.Count + 1; 

     @:<tr> 
      @:<td rowspan="@item.SetValue.Count">@item.OptionVal</td> 
      @:<td rowspan="@item.SetValue.Count">@item.OptionValueID</td> 
      int count =0; 
      foreach(var set in item.SetValue) 
      { 
       if (count ==0) 
       { 
       @:<td>@set.TcSet.SetName</td> 
       @:<td>@set.Value</td> 
       @:<td>@set.Status</td> 
       @:</tr> 
       } 
       else 
       { 
        @:<tr> 
        @:<td>@set.TcSet.SetName</td> 
        @:<td> @set.Value</td> 
        @:<td>@set.Status</td> 
       } 
       count++; 
      } 
     @:</tr> 
    } 
    </table> 

Я получил результат правильно отображается , Есть ли лучшее обходное решение для этого? Использование соединения? Я не уверен, как будут выполняться объединения.

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