MVC 4,在视图中显示来自多个表和关联的数据作为列表

MVC 4, Displaying data from multiple tables & association in a view as a list

我无法从多个 table 获取数据以在视图中显示,主要是因为其中一个是关联 table。

您好,我有这 3 个 table 及其专栏

剧院 ID 说明

控件 ID 数字 说明

ThreatHasControl 威胁编号 控件 ID

我正在尝试创建一个视图来显示与所选威胁相关联的所有控件

因为我正在使用关联 table 我不确定如何获取我需要的数据。我想我需要以某种方式加入 tables。

我目前在我的存储库中有这个方法来获取 ThreatHasControl table 中的每个项目,这些项目与为所选威胁传递的 ID 相匹配

  public IQueryable<ThreatHasControl> ThreatHasControl(int ThreatID)
    {
        _context = new RiskAssessmentApplicationEntities();  
        IQueryable<ThreatHasControl> ThreatControl = _context.ThreatHasControl.Where(t => t.ThreatID == ThreatID);
        return ThreatControl;
    }

我猜它在这里我需要做点别的事情。

我也有这个作为我的控制器

public ActionResult GetThreatControls(int ThreatID)
        {
            repository = new EFThreatRepository();
            ViewModel MyModel = new ViewModel();
            MyModel.ThreatHasControl = repository.ThreatHasControl(ThreatID);
            List<ViewModel> ViewModelList = new List<ViewModel>();
            ViewModelList.Add(MyModel);
            return View(ViewModelList);
        }

有人可以提供一些建议吗?提前致谢

您尝试过使用 ViewBag 吗?

http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-2cplusViewBagplusandplusTem

它可以容纳任何物体...

你在视图中设置了吗:

@model System.Collections.Generic.List<ViewModel>

在页面顶部?并将其用作常规列表?

foreach(var ViewModel in Model) 
{
 ....
}

我设法找到了我的问题的解决方案。

事实证明,我只需要增强 linq 查询导航路径,使其 select 并包含所需的 table / 数据

为了让事情更容易理解,我暂时从存储库中删除了该方法

GetThreatControls 操作方法

 public ActionResult GetThreatControls(int ThreatID)
        {
            RiskAssessmentApplicationEntities _DBContext = new RiskAssessmentApplicationEntities();
            ThreatHasControl ViewModel = new ThreatHasControl();
            ViewModel.Threat = _DBContext.Threats.Single(x => x.ID == ThreatID);
            ViewModel.Controls = _DBContext
                                        .ThreatHasControl
                                        .Include("ThreatHasControl.Control")
                                        .Where(x => x.ThreatID == ThreatID)
                                        .Select(x => x.Control);

            return View(ViewModel);                                   
        }