在单个视图中显示多个模型

时间:2016-06-29 22:00:03

标签: c# asp.net-mvc entity-framework

我必须创建一张发票视图。我有很多模型(表格),我想在一张发票视图中显示多个模型的所有数据。我创建了一个空的(没有模型)视图并放入了部分视图。部分视图之一返回一个视图与一个模型,但此解决方案返回异常...这是我的工作: 这是我在控制器中的行为:

public ActionResult Customer()
        {
            var data = db.Customer;

            return PartialView("Index", data);
        }

        public ActionResult Invoice()
        {
            var data = db.Invoice;

            return PartialView("Index", data);
        }

        public ActionResult Dealer()
        {
            var data = db.Dealer;

            return PartialView("Index", data);
        }

        public ActionResult Paid()
        {
            var data = dane.Paid;

            return PartialView("Index", data);
        }

        public ActionResult Products()
        {
            var data = dane.Products;

            return PartialView("Index", data);
        }

这是部分观点之一:

@model IEnumerable<Invoice_v1._0.Models.Products>

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Amount)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Amount)
        </td>
    </tr>
}

</table>

这是我的“索引”视图,带有部分视图:

@Html.Partial("_Customer")
@Html.Partial("_Invoice")
@Html.Partial("_Dealer")
@Html.Partial("_Paid")
@Html.Partial("_Products")

我该如何修复它们?

3 个答案:

答案 0 :(得分:2)

如果您坚持使用单个视图,那么您可以使部分视图呈现为条件:

if (Model != null && Model is Customer)
    Html.Partial("_Customer", Model as Customer)

,等等。

在相关的说明中,由于所有模型都是独占的(您从不拥有多个对象),因此我没有看到拥有一个索引视图的重点。您已经为每个类提供了一个(部分)视图,那么为什么不将它们用作常规视图呢?

<强>更新

如果您选择从每个操作方法返回单独的视图,则可以通过指定每个视图的名称来执行此操作。有关详细信息,请参阅此问题:How to return ActionResult with specific View (not the controller name)

在您的特定情况下,这意味着:

public ActionResult Customer()
{
    return View("_Customer", db.Customer);
}

public ActionResult Invoice()
{
    return View("_Invoice", db.Invoice);
}

public ActionResult Dealer()
{
    return View("_Dealer", db.Dealer);
}

public ActionResult Paid()
{
    return View("_Paid", db.Paid);
}

public ActionResult Products()
{
    return View("_Products", db.Products);
}

确保每个视图都需要强类型模型。这样可以轻松实现视图。

答案 1 :(得分:0)

虽然您的方法可行,但您对数据的控制较少或无法控制(如果您想假设加入或使用任何父数据)。在这种情况下,我所做的是创建一个ViewModel,其中包含多个对象。例如

public class InvoiceViewModel
{
    public InvoiceHead Header { get;set; }
    public IList<InvoiceDetail> Details { get; set; }
}

现在我可以在进入我的视图之前填充此视图模型。

public ActionResult Invoice(int id)
{
     InvoiceViewModel viewModel = new InvoiceViewModel();
     viewModel.Header = db.InvoiceHead.SingleOrDefault(i => i.ID == id);
     if(viewModel.Header != null)
     {
         viewModel.Details = db.Details.Where(d => d.Inv_id == id).ToList();
     }
     return View(viewModel);
}

现在,我可以使用部分视图或一个整体视图为我的发票数据设计视图。

我将IEnumerable或IList作为模型

如果我同时使用partial,它将是 @model db.Objects.InvoiceHead //用于标题

@model IEnumerable //了解详情

答案 2 :(得分:0)

html代码中的

将是那样的

 @Html.Partial("~/Views/Customers/_AttachFileList.cshtml")

使用您自己的文件夹路径。希望工作