Заполнение модели представления mvc4 несколькими списками‹›

У меня есть список из 22 категорий с примерно 8 элементами меню в каждой категории, но моя модель просмотра заканчивается только последним элементом в списке. Мне трудно понять, в чем проблема.
На данный момент я уверен, что проблема в том, как я заполняю модель представления, но я не знаю, в чем проблема.

Модели просмотра:

public class MenuViewModel    

    public List<CategoryViewModel> CategoryList { get; set; }

public class CategoryViewModel
{
    public int CategoryID { get; set; }
    public string CategoryTitle { get; set; }
    public List<MenuItemViewModel> MenuItemList { get; set; }
}

public class MenuItemViewModel
{
    public string Title { get; set; }
    public string Note { get; set; }
    public string Description { get; set; }
    public List<PriceViewModel> PriceList { get; set; }

}

public class PriceViewModel
{
    public decimal PriceValueRegularLunch { get; set; }
    public decimal PriceValueSmallLunch { get; set; }
    public decimal PriceValueLargeLunch { get; set; }

    public decimal PriceValueRegularDinner { get; set; }
    public decimal PriceValueSmallDinner { get; set; }
    public decimal PriceValueLargeDinner { get; set; }

    public decimal PriceValueRegularTakeOut { get; set; }
    public decimal PriceValueSmallTakeOut { get; set; }
    public decimal PriceValueLargeTakeOut { get; set; }
}

private MenuViewModel LoadViewModel(int menuNameID)        
{

        List<Category> returnedCategories = GetAllMenuDataModel.GetAllMenuItemsByCategory(menuNameID);

        MenuViewModel vmMenu = new MenuViewModel();

        PriceViewModel vmPrices = new PriceViewModel();

        foreach (Category category in returnedCategories)
        {
            CategoryViewModel vmCategory = new CategoryViewModel
                                               {
                                                   CategoryID = category.categoryId,
                                                   CategoryTitle = category.categoryTitle
                                               };

            foreach (MenuItem menuItem in category.MenuItems)
            {
                MenuItemViewModel vmMenuItem = new MenuItemViewModel
                                                   {
                                                       Title = menuItem.itemTitle,
                                                       Description = menuItem.itemDescription,
                                                       Note = menuItem.itemNote
                                                   };

                foreach (Price price in menuItem.Prices)
                {
                    switch (price.MealType.mealName.ToLower())
                    {
                        case "lunch":
                            if (price.ServingSize.sizeName == "Regular")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            if (price.ServingSize.sizeName == "Small")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            if (price.ServingSize.sizeName == "Large")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            break;
                        case "dinner":
                            if (price.ServingSize.sizeName == "Regular")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            if (price.ServingSize.sizeName == "Small")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            if (price.ServingSize.sizeName == "Large")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            break;
                        case "takeOut":
                            if (price.ServingSize.sizeName == "Regular")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            if (price.ServingSize.sizeName == "Small")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            if (price.ServingSize.sizeName == "Large")
                            {
                                vmPrices.PriceValueLargeLunch = price.priceValue;
                            }
                            break;
                    }

                    vmMenuItem.PriceList = new List<PriceViewModel> { vmPrices };
                }

                vmCategory.MenuItemList = new List<MenuItemViewModel> { vmMenuItem };
            }
            vmMenu.CategoryList = new List<CategoryViewModel> { vmCategory };
        }
        return vmMenu;
    }

person NNassar    schedule 11.01.2013    source источник


Ответы (3)


Да, проблема в том, как вы заполняете свою модель представления. Вы должны инициализировать списки, а затем добавлять в них элементы:

private MenuViewModel LoadViewModel(int menuNameID)
{
    List<Category> returnedCategories = GetAllMenuDataModel.GetAllMenuItemsByCategory(menuNameID);
    MenuViewModel vmMenu = new MenuViewModel();
    vmMenu.CategoryList = new List<CategoryViewModel>();
    foreach (Category category in returnedCategories)
    {
        CategoryViewModel vmCategory = new CategoryViewModel
        {
            CategoryID = category.categoryId,
            CategoryTitle = category.categoryTitle
        };
        vmCategory.MenuItemList = new List<MenuItemViewModel>();

        foreach (MenuItem menuItem in category.MenuItems)
        {
            MenuItemViewModel vmMenuItem = new MenuItemViewModel
            {
                Title = menuItem.itemTitle,
                Description = menuItem.itemDescription,
                Note = menuItem.itemNote
            };
            vmMenuItem.PriceList = new List<PriceViewModel>();

            foreach (Price price in menuItem.Prices)
            {
                PriceViewModel vmPrices = new PriceViewModel();
                switch (price.MealType.mealName.ToLower())
                {
                    case "lunch":
                        if (price.ServingSize.sizeName == "Regular")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        if (price.ServingSize.sizeName == "Small")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        if (price.ServingSize.sizeName == "Large")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        break;
                    case "dinner":
                        if (price.ServingSize.sizeName == "Regular")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        if (price.ServingSize.sizeName == "Small")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        if (price.ServingSize.sizeName == "Large")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        break;
                    case "takeOut":
                        if (price.ServingSize.sizeName == "Regular")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        if (price.ServingSize.sizeName == "Small")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        if (price.ServingSize.sizeName == "Large")
                        {
                            vmPrices.PriceValueLargeLunch = price.priceValue;
                        }
                        break;
                }
                vmMenuItem.PriceList.Add(vmPrices);
            }
            vmCategory.MenuItemList.Add(vmMenuItem);
        }
        vmMenu.CategoryList.Add(vmCategory);
    }
    return vmMenu;
}
person Darin Dimitrov    schedule 11.01.2013

Это может быть связано с тем, что в конце цикла вместо добавления элементов в список вы создаете новый список с одним элементом в нем.

vmMenuItem.PriceList.Add(vmPrices) (и то же самое для vmCategory и vmMenu) решит эту проблему.

person Remy Porter    schedule 11.01.2013
comment
извините, я не уверен, как это изменить. - person NNassar; 11.01.2013
comment
Ага, понятно. Хорошо, я тоже это сделал, но я получу ошибку nullReference в .PriceList. - person NNassar; 11.01.2013
comment
это потому, что вы сначала не инициализировали списки; посмотри мой ответ :) - person Adam Bilinski; 11.01.2013

Добавьте это вверху

 vmMenuItem.PriceList = new List<PriceViewModel> ;
    vmCategory.MenuItemList = new List<MenuItemViewModel> ;
    vmMenu.CategoryList = new List<CategoryViewModel> ;

а потом в конце сделать

                  vmMenuItem.PriceList.Add(vmPrices );
                }
                vmCategory.MenuItemList.Add(vmMenuItem);
            }
            vmMenu.CategoryList.Add(vmCategory );

Вы не добавляли, вы заменяли их новыми

person Adam Bilinski    schedule 11.01.2013
comment
причина, по которой это не сработает, заключается в том, что если я поставлю эти вещи вверху, vmCategory и vmMenuItem еще не были введены в код, поэтому они не будут распознаны. Благодарим вас за участие. - person NNassar; 11.01.2013