Razor 如何将DbContext从模型绑定到视图

Razor 如何将DbContext从模型绑定到视图,razor,binding,view,model,asp.net-mvc-4,Razor,Binding,View,Model,Asp.net Mvc 4,我是MVC新手,有一个简单的问题(我想)。 我有一个DbContext public class UsersContext : DbContext { public UsersContext() : base("Share_DB") {} public DbSet<ItemDB> Items { get; set; } } 我想将数据库表中的所有项绑定到模型。但是我不知道该怎么做 在视图(cshtml文件)中,我想我已经定义了我必须使用的模型(@model XXX.

我是MVC新手,有一个简单的问题(我想)。 我有一个DbContext

public class UsersContext : DbContext
{
    public UsersContext() : base("Share_DB") {}
    public DbSet<ItemDB> Items { get; set; }
}
我想将数据库表中的所有项绑定到模型。但是我不知道该怎么做

在视图(cshtml文件)中,我想我已经定义了我必须使用的模型(
@model XXX.Models.ItemModel
),然后用如下内容显示它:

<ul>
@foreach (XXX.Models.ItemModel.ItemDB item in @Items)
{
    <li>@item.Title</li>
}
</ul>
    @foreach(XXX.Models.ItemModel.ItemDB@Items中的item) {
  • @项目.标题
  • }

但是,它找不到
@Items
属性。我该怎么写呢?

MVC的工作方式是,当您在控制器中返回一个视图时,传递给view()的任何内容都将作为Model属性。换言之:

public ActionResult Index()
{
    return View("Hello World");
}
将字符串“Hello World”传递给您的视图。然后在Index.cshtml文件的顶部,您需要声明模型类型:

@model string
并且用法变成:

<div>@Model</div>
在你看来:

@model IEnumerable<ItemDB>
@model IEnumerable
您可以将其用作:

@foreach (var item in Model)
{
    <div>@item.Title</item>
}
@foreach(模型中的变量项)
{
@项目.标题
}

我认为您的模型定义应该是@model xxx.models.userscontext。将您的模型引用到实际包含itemsCan的类,您是否也包含控制器操作代码?这就是从DbContext加载模型数据的地方。有多种不同的方法可以做到这一点,但最明显的是创建IEnumerableAnd的强类型视图,并且您的视图有一个属性模型。这对我来说是导致错误的原因,项目已被处理,有解决方案吗?您是否在查询中调用ToList()?这将实际将项目加载到内存中,以便您可以将其传递给视图。是的,我正在这样做,与您所做的完全相同,但我得到一个异常,即元素已被释放,无法访问。但是当我在不使用的情况下创建
上下文
时,它是有效的。您可能正在访问loan对象中未加载的内容,并且由于DbContext已被释放,因此您将获得该异常。您可以禁用延迟加载(google Entity Framework延迟加载),或者使用.Include()方法加载额外的数据:
db.Loans.Include(loan=>loan.User)。其中(…)
如果将DbContext包装在using()语句中,则当控件传递到视图时,它将被释放。当您不将其放入using语句中时,它不会被释放,因此您可以访问那些延迟加载的属性。最佳做法是使用()将其包装起来,并预取您需要的任何数据。理想情况下,视图不应该触发数据库调用。
@model IEnumerable<ItemDB>
@foreach (var item in Model)
{
    <div>@item.Title</item>
}