在视图中显示模型

时间:2013-11-25 21:27:33

标签: asp.net asp.net-mvc entity-framework code-first asp.net-mvc-5

我是MVC Noob,但我真的想获得一些使用MVC的经验,所以我尝试使用MVC重新创建一个Asp Classic项目。下面的代码不会显示与膳食/索引页面上的菜单相关的膳食列表。

我已经阅读了几种不同的模式,ninject和自动映射器,然而,从我可以告诉它,在处理简单的关联时,这是不必要的。

我只想将菜单添加到菜单中并汇总每个菜单的餐价。

型号:

public class Meal
{   [Key]
    public int MealId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public int MenuId { get; set; }
}


public class Menu
{
    [Key]
    public int MenuId { get; set; }
    public DateTime WeekendServed { get; set; }
    public decimal Price { get; set; }
    public List<Model> Meals { get; set; //Menus have meals. 
}

菜单控制器:

 public ViewResult Index()
 {
    return View(unitOfWork.MenuRepository.Get());
 }

Menu/Index/

@model IEnumerable<Skimos.Models.Meal>
----

<Table Headers>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.WeekendServed)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @foreach (var meal in item.Meals)
            {
                @Html.Display(meal.Name)
                @Html.Display(meal.Description)
                @Html.Display(meal.Price.ToString())
            }
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.MenuId }) |
            @Html.ActionLink("Details", "Details", new { id=item.MenuId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.MenuId })
        </td>
    </tr>
}

MenuRepository public IQueryable Menus { get { return context.Menus; } } 编辑:

1 个答案:

答案 0 :(得分:2)

问题在于EF对列表类型导航属性需要两件事:1)属性上的ICollection类型和2)virtual

因此,如果您将Meals属性更改为以下内容,那么您应该做得很好:

public virtual ICollection<Meal> Meals { get; set; }

ICollection的原因是EF的返回值为IQueryable类型。虚拟的原因是EF实际上返回代理类而不是实际的模型类。这些代理具有覆盖返回数据集的导航属性的覆盖。如果您的属性不是虚拟的,则EF无法覆盖它。