Mvc4如何在一个视图中使用2个表

时间:2015-06-02 14:18:01

标签: asp.net asp.net-mvc-4

这是一个带有Entity Framework的ASP.NET MVC4项目。 我需要在单个视图中使用2个表

我的数据库中有2个表(预算和产品)。

我的模型

Budget.cs

public class Budget
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<Product> Products { get; set; }
}

Product.cs

  public class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
    public decimal Value { get; set; }
    public int BudgetId { get; set; }
}

BpDb

 public class BpDb:DbContext
{
    public DbSet<Budget> Budgets { get; set; }
    public DbSet<Product> Products { get; set; }
}

MasterBP

 public class MasterBP
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<Product> ProdName { get; set; }
    public int CountOfValues { get; set; }
}

我需要一些关于控制器的内容来获取ProdName(表产品中的标题)

    public class HomeController : Controller
{
    BpDb _db = new BpDb();
    public ActionResult Index()
    {
        var model=_db.Budgets
            .Select(r=>new MasterBP
            {
                Id = r.Id,
                Title = r.Title,
                ProdName = r.Products.Where(s => s.BudgetId == r.Id).ToList(), 
                CountOfValues = r.Products.Count()
            });
        return View(model);
    }
}

当BudgetId = ID(1个预算可以有超过1个产品)时,我需要一种获取产品列表的方法

我的索引就像:

@model IEnumerable<MvcGg.Models.MasterBP>

@foreach (var item in Model)
  {
      <div>
          <h4>@item.Title</h4>
          @foreach (var product in item.ProdName)
          {
              @(product.Title.ToString());
          }
          Values:@item.CountOfValues
      </div>
  }

2 个答案:

答案 0 :(得分:1)

听起来(如果我错了,请纠正我)你想在视图模型中访问两组实体吗?

然后沿着这些方向行事:

public class BudgetsViewModel
{
    public IEnumerable<MasterBP> MasterBps { get;set; }
    public IEnumerable<Product> Products { get;set;}
}

然后您只需检索所有数据并填充视图模型并将其传递下去。

...
var budgets =_db.Budgets
            .Select(r=>new MasterBP
            {
                Id = r.Id,
                Title = r.Title,
                ProdName = r.Products.Where(s => s.BudgetId == r.Id).ToList(), 
                CountOfValues = r.Products.Count()
            });
var model = new BudgetsViewModel()
{
   MasterBps = budgets
   //Products here
}

return View(model);
...

然而,如果您使用某种形式的服务层来处理实体检索和映射以查看模型而不是在控制器中拥有所有这些逻辑,那会更好。

答案 1 :(得分:0)

最后这解决了我的问题,

<强>模型

<强> MasterBP

public class MasterBP
{
    public int Id { get; set; }
    public string Title { get; set; }
    public IEnumerable<Product> ProdName { get; set; }
    public int CountOfValues { get; set; }
}

我将List<>替换为IEnumerable<>

<强>控制器

public ActionResult Index()
    {
        var model=_db.Budgets
            .Select(r=>new MasterBP
            {
                Id = r.Id,
                Title = r.Title,
                ProdName = r.Products.Where(s => s.BudgetId == r.Id).AsEnumerable(),
                CountOfValues = r.Products.Count()
            });    

        return View(model);
    }

此外,我在ToList()中更改了AsEnumerable(),现在我可以使用此结果查看我的结果

查看

<强>索引

@foreach (var item in Model)
{
    <div>
        @item.Title
        <ul>
            @foreach (var prod in item.ProdName)
            {

                <li>@prod.Title</li>

            }
        </ul>
        <hr />
    </div>
}