将嵌套的ViewModel更改为IEnumerable时出错

时间:2014-05-23 06:36:57

标签: c# asp.net-mvc

我正在尝试创建一个嵌套的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 - 我需要手动执行此操作还是有更优雅的方式执行此操作?

2 个答案:

答案 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);

Some more info.

答案 1 :(得分:1)

您需要将IEnumerable转换为List才能将商品添加到您的收藏中:

viewModel.Quote.QuoteItems.ToList().Add(new QuoteItem());