在视图模型中包括不相关的数据

本文关键字:不相关 数据 包括 视图 模型 | 更新日期: 2023-09-27 18:35:34

我正在使用 asp.net mvc和Entity Framwork。我仍然熟悉这个堆栈。我想包含与传递给视图的模型没有外键关系的数据。

最初,模型是这样传递给视图的...

public ActionResult Edit(int id = 0)
{
booking booking = db.bookings.Find(id);
return View(booking);
}

我在视图中需要的数据与预订没有 FK 关系。

我尝试创建一个单独的类来将两个实体放入...

public ActionResult Edit(int id = 0)
{
booking booking = db.bookings.Find(id);
viewModel.bookingtraces = (from l in db.traces where l.bookingid == booking.bookingid     select l);
viewModel.bookings = booking;
return View(viewModel);
}

目前,我遇到了一个错误。GET页面将加载,但是在尝试更新时,我得到

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我还尝试添加一个 modelBuilder 条目来显式定义关系,但这不起作用。

最终,问题是,如果两个实体之间没有 FK 关系,如何访问视图中与正在传递的模型无关的数据?

在视图模型中包括不相关的数据

我建议不要简单地使用实体类作为模型,而是考虑创建复合模型,其中包含所需的属性(我通常在基本视图模型中实现通用功能,并从中继承)。这样,您就可以完全控制模型对象的实例化以及它们包含的属性。这样,当您回发时,整个模型将回发到服务器。

复合模型的一个优点是能够在单个模型中包含许多实体或 POCO 对象,例如:

public class MyModel {
   public booking Booking {get;set;}
   public SomeOtherEntityObject EObject{get;set;}
   public SomePocoObject {get;set;}
}

这意味着模型的全部内容将回发到服务器。

您可以将实体用作模型,并通过 ViewBag 将其他数据传递给视图

public ActionResult Edit(int id = 0) {
    Booking booking = db.bookings.Find(id);
    ViewBag.bookingtraces = 
        from l in db.traces 
        where l.bookingid == booking.bookingid
        select l;
    return View(booking);
}

您可以定义视图模型

public class MyViewModel {
    public Booking booking { get; set; }
    public IEnumerable<BookingTrace> traces { get; set; }
}

然后在您的操作方法中,您只能绑定回预订属性

[HttpPost]
public ActionResult Edit(Booking booking) {
    ...
}