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

Posted

技术标签:

【中文标题】如何将 DbContext 从模型绑定到视图【英文标题】:How to bind DbContext from Model to View 【发布时间】:2013-01-06 17:15:24 【问题描述】:

我是 MVC 的新手,遇到了这个简单的问题(我认为)。 我有一个 DbContext

public class UsersContext : DbContext

    public UsersContext() : base("Share_DB") 
    public DbSet<ItemDB> Items  get; set; 

其中包含带有 id 和 Title 的项目列表:

[Table("Items")]
public class ItemDB

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id  get; set; 
    public string Title  get; set; 

我想将包含数据库表中所有项目的列表绑定到模型。但是我不知道该怎么做。

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

<ul>
@foreach (XXX.Models.ItemModel.ItemDB item in @Items)

    <li>@item.Title</li>

</ul>

但是它找不到 @Items 属性未找到。这个怎么写?

【问题讨论】:

我认为你的模型定义应该是@model xxx.models.userscontext。将您的模型引用到实际保存项目的类 您也可以包含您的控制器操作代码吗?这实际上是您将从 DbContext 加载模型数据的地方。有多种不同的方法可以做到这一点,但最明显的是创建 IEnumerable 的强类型视图 你的视图有一个属性 Model 【参考方案1】:

MVC 的工作方式是当您在控制器中返回视图时,传递给 View() 的任何内容最终都会作为 Model 属性。换句话说:

public ActionResult Index()

    return View("Hello World");

会将字符串“Hello World”传递给您的视图。然后在您的 Index.cshtml 文件的顶部,您需要声明模型类型:

@model string

而用法变成:

<div>@Model</div>

在您的情况下,您只需将项目列表传递给视图,并告诉它期望正确的模型类型:

public ActionResult Index()

    using (var db = new UsersContext()) 
    
        var items = db.Items.ToList();

        return View(items);
    

然后在你看来:

@model IEnumerable<ItemDB>

您可以将其用作:

@foreach (var item in Model)

    <div>@item.Title</item>

【讨论】:

这会导致我的错误,物品已被处理,有什么解决办法吗? 您是否在查询中调用 ToList()?这实际上会将项目加载到内存中,以便您可以将其传递给视图。 是的,我正在这样做,就像您正在做的那样,但是我得到一个异常,即元素已被释放并且无法访问。但是当我创建没有usingContext 时,它可以工作。 您可能正在访问未加载的贷款对象中的某些内容,并且由于 DbContext 已被处置,您会遇到该异常。您可以禁用延迟加载(谷歌实体框架延迟加载),或使用 .Include() 方法加载额外数据:db.Loans.Include(loan =&gt; loan.User).Where(....) 如果将 DbContext 包装在 using() 语句中,它将在控制权传递给视图时被释放。当您不将它放在 using 语句中时,它不会被释放,因此您可以访问那些延迟加载的属性。最佳做法是将其包装在 using() 中并预取您需要的任何数据。理想情况下,视图不应触发数据库调用。

以上是关于如何将 DbContext 从模型绑定到视图的主要内容,如果未能解决你的问题,请参考以下文章

使用合金加速器将模型绑定到控制器视图

从数据模板内部绑定到视图模型

如何将部分更新操作从 ObjectContext 转换为 DbContext

从视图模型绑定到 ListView 项目的点击属性

将 [VisualStateManager] 视图状态绑定到 MVVM 视图模型?

当dbcontext中有多个模型时,如何创建一个空模型以传递给插入更新视图?