在 mvc 中填充嵌套的 icollection
Populating nested icollection in mvc
我有以下 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 集合。 OptionValues 有一个 ICollection of SetValues
我是否通过在我的 ViewModel 中使用 OptionValues 的 ICollection 使其变得多余?
但我无法正确填充 table 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++;
}
}
我错过了什么导致它没有以正确的方式填充?
我试过在视图中使用索引,但它引发了解析器错误。
寻找解决方法。
好的,我已经找到问题的答案了。但答案总是开放的,可以编辑以获得更好的方法。
我删除了 ViewModel,因为我的 ViewModel 有用途,而不是让我的程序更复杂。
所以我有以下模型 class 用于选项和选项值。
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; }
}
在我的控制器中,我添加了需要包含在模型中以供查看的选项值
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>
我得到了正确显示的结果。有更好的解决方法吗?
使用加入?我不确定如何实现联接。
我有以下 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 集合。 OptionValues 有一个 ICollection of SetValues
我是否通过在我的 ViewModel 中使用 OptionValues 的 ICollection 使其变得多余?
但我无法正确填充 table 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++;
}
}
我错过了什么导致它没有以正确的方式填充?
我试过在视图中使用索引,但它引发了解析器错误。 寻找解决方法。
好的,我已经找到问题的答案了。但答案总是开放的,可以编辑以获得更好的方法。
我删除了 ViewModel,因为我的 ViewModel 有用途,而不是让我的程序更复杂。
所以我有以下模型 class 用于选项和选项值。
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; }
}
在我的控制器中,我添加了需要包含在模型中以供查看的选项值
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>
我得到了正确显示的结果。有更好的解决方法吗? 使用加入?我不确定如何实现联接。