如何分解我的数据,以便将其提供给我的视图?

时间:2011-04-13 17:23:39

标签: asp.net-mvc linq

我是asp.net的绝对初学者,我遇到了一个非常复杂的问题,具体来说我如何获取我刚刚从数据库获得的数据。下面是我的查询和处理数据的开始。

        var brandslist = from brand in brandDB.brands
                         join brand_family in brandDB.brand_family
                         on brand.brand_family_id equals brand_family.bf_id
                         orderby brand_family.brand_family_name,
                                 brand.priority,
                                 brand.genre_id
                         select new
                         {
                             brand_family.brand_family_name,
                             brand.priority,
                             brand.roll_image
                         };

        var viewModel = new BrandIndexViewModel{
            Brands = brandslist.ToList()
        };

我习惯用PHP做事,而不是asp这就是为什么我这么绝对难倒。我确实有一个以前的数据库调用,但我只从数据库中获取一件事,而在这里我试图从数据库中获取多个项目。我想我的问题是如何让我的视图类可以访问数据?

感谢所有帮助我的人,因为我确信这是一个相当基本的问题。

修改

以下是我在编译时收到的错误消息:

错误1无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.List'C:\ Inetpub \ wwwroot \ hcd \ hcd \ Controllers \ HomeController.cs 35 26 hcd

编辑2

确认我正在使用ASP MVC 2。

编辑3

这是我的品牌索引视图模型(但我已经看到它可能存在问题)

public class BrandIndexViewModel
{
    public List<string> Priority { get; set; }
    public List<string> FamilyName { get; set; }
    public List<string> RollImage { get; set; }
    public List<string> Brands { get; set; }

}

3 个答案:

答案 0 :(得分:2)

问题的根源在于您的LINQ查询返回匿名类型,但您要分配给List<string>的品牌。最终,你需要得到你想要的字符串。我将假设“brand_family_name”是您想要进入List<string> Brands的数据。

var viewModel = new BrandIndexViewModel{
            Brands = brandslist.Select(b => b.brand_family_name).ToList() // Or whichever property you want to use to populate List<string> Brands
        };

答案 1 :(得分:1)

正如其他答案中所提到的,您没有在ViewModel的Brands列表中指定您想要的内容(最合适的是brand.Name)。发布您的brandbrand_family类可以澄清这一点。

如果我理解正确,您基本上需要在视图中显示Brands列表。在这种情况下,将FamilyNamePriorityRollImageBrand分组到一个对象中并将其列在ViewModel中的列表会更简洁:

public class BrandIndexViewModel
{
    public List<BrandIndexItem> BrandIndexItems { get; set; }
}

public class BrandIndexItem
{
    public string Priority { get; set; }
    public string FamilyName { get; set; }
    public string RollImage { get; set; }
    public string Brand { get; set; }
}

在这种情况下,您无需执行Select即可填充每个列表。相反,您可以将查询结果直接投影到ViewModel上。以下是使用join的代码:

    var viewModel = new BrandIndexViewModel
                    {
                        BrandIndexItems = 
                           (from brand in brandDB.brands
                            join brand_family in brandDB.brand_family
                            on brand.brand_family_id equals brand_family.bf_id
                            orderby brand_family.brand_family_name,
                                    brand.priority,
                                    brand.genre_id
                            select new BrandIndexItem
                            {
                                FamilyName = brand_family.brand_family_name,
                                Priority = brand.priority,
                                RollImage = brand.roll_image,
                                Brands = brand.name // ?
                            }).ToList()
                    }    

此外,您提到使用数据库,但是您没有提到您是否正在使用ORM,例如EF或LINQ-to-SQL。如果您使用其中一个,如果您可以发布模型的屏幕截图,那将非常有用。同时,根据您的代码,您似乎在brand_familybrand之间存在一对多关系,因此如果您使用的是ORM,则可能具有导航属性{{1 }}。在这种情况下,您的LINQ查询中不需要brand.brand_family

join

答案 2 :(得分:0)

我将假设您正在使用ASP.NET MVC。

要从视图中访问brandslist变量,请使用model参数从控制器传递。例如:

ActionResult ListAllBrands()
{
    var brandslist = from brand in brandDB.brands
                         join brand_family in brandDB.brand_family
                         on brand.brand_family_id equals
                         brand_family.bf_id
                         orderby brand_family.brand_family_name,
                         brand.priority,
                         brand.genre_id
                         select new
                         {
                             brand_family.brand_family_name,
                             brand.priority,
                             brand.roll_image
                         };

    return View("List", brandslist);
}

然后在您看来,将会有一个名为“Model”的变量,它将包含此值。然后,您可以使用for / each循环遍历.ASPX代码中的每个记录。