多对多问题(MVC3 + EF4.1)

时间:2012-02-28 20:16:11

标签: asp.net-mvc asp.net-mvc-3 entity-framework

我在MVC 3和EF 4.1工作,而且我是初学者。

所以我宣布了这两个类:

public class Genre
{
    [Key]
    public int GenreId { get; set; }

    public string Name { get; set; }

    public virtual List<Show> Shows { get; set; }
}

public class Show
{
    [Key]
    public int ShowId { get; set; }

    public string Title { get; set; }

    public virtual int[] GenreIds { get; set; }

    public virtual List<Genre> Genres { get; set; }
 }

现在我正在尝试显示特定节目的详细信息,并通过已标记的节目显示循环和显示。我有一个标准的详细信息视图,我正在使用,所以我将以下内容传递给它,来自控制器:

    public ViewResult Details(int id)
    {
        Show show = db.Shows.Find(id);
        return View(show);
    }

我正在使用这个Razor循环来显示流派:

@foreach (ShowCat.Models.Genre Genre in Model.Genres)
{
    @Html.Display(Genre.Name)
}

绝对没有任何事情发生......

没有显示类型......

请帮忙!

2 个答案:

答案 0 :(得分:2)

HTML帮助器Html.Display(string expression)要求您传入模型属性的名称,而不是属性的值。通过将Genre.Name传递给方法,您传递的内容类似于“重金属”,这显然不是模型中任何属性的名称。

最简单的解决方法是将Html.Display替换为Html.DisplayFor

@foreach (ShowCat.Models.Genre Genre in Model.Genres)
{
    @Html.DisplayFor(model => Genre.Name)
}

答案 1 :(得分:0)

您是否已禁用延迟加载

如果是这样,您可能需要急切加载类型:

var show = db.Shows.EagerLoad(x => x.Genres).SingleOrDefault(id);

还有:

@foreach (ShowCat.Models.Genre Genre in Model.Genres)
{
    @Html.Display(Genre.Name)
}

可以缩短为:

@Html.DisplayFor(model => model.Genres)

为“Genre”添加编辑器模板:(Genre.cshtml)

@Html.DisplayFor(model => model.Name)