在mvc中填充嵌套的icollection

时间:2015-10-09 07:50:24

标签: c# linq asp.net-mvc-5 viewmodel

我有以下ViewModel。我试图用基于条件的值填充内部嵌套的Icollection。我使用内部ICollection的值填充外部Icollection的值。但是当我尝试在视图中添加它时,它只显示第一个值。

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; }
}

Option有一个OptionValues的Icollection。 OptionValues的ICollection为SetValues

我是否通过在ViewModel中使用OptionValues的ICollection来使其变得多余?

但是我无法正确填充表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++;
           }

      }

我错过了什么让它没有以正确的方式填充?

我已经尝试在View中使用索引,但它抛出了解析器错误。 寻找解决方法。

1 个答案:

答案 0 :(得分:0)

Okk我找到了问题的答案。但是答案总是可以编辑以获得更好的方法。

我删除了ViewModel,因为我的ViewModel有目的,而不是让我的程序更复杂。

所以我有Options和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>

我得到了正确显示的结果。这有更好的解决方法吗? 使用加入?我不确定如何实施联接。