我正在尝试创建一个嵌套的ViewModel,并设法让自己感到困惑,我不认为我所遵循的方法是正确的(也不起作用),所以我希望得到一些指导
首先我有一个如下所示的引用项:
public class Quote
{
public Quote()
{
this.QuoteItems = new HashSet<QuoteItem>();
}
[Key]
public int QuoteID { get; set; }
// Other properties not shown
public ICollection<QuoteItem> QuoteItems { get; set; }
}
引用有很多QuoteItems:
public class QuoteItem
{
[Key]
public int QuoteItemID { get; set; }
// Other properties not shown
public Quote Quote { get; set; }
}
我的引用控制器使用名为QuoteFormViewModel的ViewModel主要强烈键入一些下拉列表:
public class QuoteFormViewModel
{
public Quote Quote { get; set; }
public QuoteItemViewModel QuoteItemViewModel { get; set; }
public IEnumerable<SelectListItem> ConstructionTypes { get; set; }
public IEnumerable<SelectListItem> ConditionTypes { get; set; }
public IEnumerable<SelectListItem> DesignTypes { get; set; }
}
我的控制器:
QuoteFormViewModel viewModel = createViewModel(new Quote());
viewModel.Quote.QuoteItems.Add(new QuoteItem());
在我的视图模型中,你会看到我的QuoteItems有一个名为QuoteItemViewModel的viewModel,这是因为我有一个EditorFor for QuoteItems,我将其添加到Create和Edit表单中:
@Html.EditorFor(x => x.Quote.QuoteItems)
我使用QuoteItemViewModel的另一个原因是因为报价项目也需要强类型的下拉列表。
我的问题是,这种方法效果不错,但只有在我添加单引号项目时才有效。我觉得我需要做的是在我的QuoteFormViewModel更改
public QuoteItemViewModel QuoteItemViewModel { get; set; }
到
public IEnumerable<QuoteItemViewModel> QuoteItemViewModels { get; set; }
但是在我的控制器中我无法添加其他项目 - 以下代码不起作用:
viewModel.QuoteItemViewModels.Add // Add doesn't work here...
同样在帖子上我的QuoteItems在他们的单独视图模型中,而不是添加到Quote - 我需要手动执行此操作还是有更优雅的方式执行此操作?
答案 0 :(得分:1)
您无法将项目添加到IEnumberable
。但是,您可以将项目添加到List
。
public List<QuoteItemViewModel> QuoteItemViewModels { get; set; }
更好的方法是使用interface
:
public ICollection<QuoteItemViewModel> QuoteItemViewModels { get; set; }
或者您可以使用LINQ:
将IEnumerable
转换为List
this.QuoteItemViewModels.ToList().Add(item);
答案 1 :(得分:1)
您需要将IEnumerable
转换为List
才能将商品添加到您的收藏中:
viewModel.Quote.QuoteItems.ToList().Add(new QuoteItem());