首页 > 解决方案 > 如何在 ASP.NET MVC 中连接两个模型?

问题描述

我是 ASP.NET MVC 的新手,我正在尝试创建一个存储游泳练习和结果的应用程序。

于是我在 Visual Studio 2019 中创建了应用程序,我已经成功列出、添加、删除和修改游泳结果。这些数据仅存储在一个模型中。但我也想存储练习,但一种练习包括许多练习/练习。所以我假设我需要两个不同的模型类。

所以我创建了这两个类:

实践课:

public class Practice
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public List<Drill> Drills { get; set; }
}

钻头类:

public class Drill
{
    public int Id { get; set; }
    public int? Multiplier { get; set; }
    public int Distance { get; set; }
    public int? RestTime { get; set; }
    public SwimmingStroke SwimmingStroke { get; set; }
    public String Equipment { get; set; }
    public String Notes { get; set; }
}

SwimmingStroke 是一个枚举,它只存储了 4 种不同的游泳类型。

所以我尝试了这种方式,并使用迁移,Entity Framework 为我生成了数据库表。它还在 Drill 表中添加了一个 Practice_Id,我假设它是外键。之后我创建了 PracticeController。由此,我搭建了索引和详细信息视图。在索引中,我可以显示练习列表,但更重要的是,当我单击详细信息时,我想列出该练习的练习。这就是我卡住的地方。

索引方法很简单

    public ActionResult Index()
    {
        var practices = dbContext.Practices.ToList();
        return View(practices);
    }

但是在 details 方法中,我无法弄清楚该怎么做。

我的目标是在详细信息视图中显示所选练习的练习列表。

标签: c#asp.netasp.net-mvcentity-framework

解决方案


正如戴所说,直接在视图中使用实体模型并不是一个好主意。它使事情变得有点混乱,并且您的实体模型并不总是准确地表示您希望用户看到的信息。

我建议按照 PracticeModel 的方式构建一个名为 something 的类(按照惯例,但可以随意命名),其中包含一个 DrillModel 列表。然后选择实践并钻入该模型并将其传递给您的视图。

    public class PracticeModel
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public List<DrillModel> DrillModels { get; set; }

        public PracticeModel()
        {
            DrillModels = new List<DrillModel>();
        }
    }

然后,在您的视图中,您可以遍历您的 PracticeModel 的 DrillModel 列表并根据需要显示它们。假设您将拥有多个练习模型,请创建一个显示每个练习模型的局部视图。这使其易于使用,并且您可以在整个网站上重复使用该部分视图。

@model PracticeModel

@if (Model != null)
{
    // PracticeModel Details
    @for (int i = 0; i < Model.Drills.Count; i++)
    {
        var drill = Model.Drills[i];
        // DrillModel Details
    }
}
else
{
    //Display Appropriate Html
}

推荐阅读