在视图中渲染多个强类型的局部视图?

时间:2013-05-08 12:09:38

标签: c# asp.net-mvc asp.net-mvc-4 razor visual-studio-2012

我有这个Index.cshtml类:

@model ProOptInteractive.ViewModels.InvoicePageViewModel

@{
    ViewBag.Title = "Index";
}

<div>@Html.Partial("ListServices", Model.Services)</div>
<div>@Html.Partial("ListProducts", Model.Products)</div>
<div>@Html.Partial("Invoice", Model.InvoiceViewModel)</div>

这是我的InvoicePageViewModel:

namespace ProOptInteractive.ViewModels
{
    public class InvoicePageViewModel
    {
        public InvoiceViewModel InvoiceViewModel { get; set; }
        public IEnumerable<Service> Services { get; set; }
        public IEnumerable<Product> Products { get; set; }
    }
}

问题在于,无论何时加载此视图,我都会收到错误消息,说我已将错误的模型传递给字典,并且未指定哪个部分视图导致问题。每个partial都有一个不同的模型类型,一个名为Product的IEnumerable,一个名为Service的IEnumerable,以及一个名为InvoiceViewModel的视图模型的Invoice局部视图。

任何人都可以解释如何进行这项工作吗?顺便说一句,我在Razor和MVC中有点像菜鸟。

更新

我收到此错误消息:

传递到字典中的模型项的类型为“ProOptInteractive.ViewModels.InvoiceViewModel”,但此字典需要“ProOptInteractive.ViewModels.InvoicePageViewModel”类型的模型项。

5 个答案:

答案 0 :(得分:2)

错误是因为您已将Invoice部分视图设置为具有InvoicePageViewModel类型的模型,但您传递的是InvoiceViewModel类型的模型。

InvoiceViewModel属性更新为InvoicePageViewModel类型,或更改Invoice视图以使用InvoiceViewModel类型的模型。

答案 1 :(得分:2)

错误在行<div>@Html.Partial("Invoice", Model.InvoiceViewModel)</div>

您的观点Invoice正在接受类型模型 InvoicePageViewModel您正在通过InvoiceViewModel

将您的代码更改为<div>@Html.Partial("Invoice", Model)</div>

或修改您的Invoice视图以接受InvoiceViewModel

@model ProOptInteractive.ViewModels.InvoiceViewModel

答案 2 :(得分:2)

Invoice.cshtml可能以:

开头
@model ProOptInteractive.ViewModels.InvoicePageViewModel

将其替换为:

@model ProOptInteractive.ViewModels.InvoiceViewModel

答案 3 :(得分:1)

您可以将模型传递到部分视图,如下所示:

@Html.Partial("Invoice", Model.InvoiceViewModel) 

或类似的东西。

主视图模型:

class InvoicePageViewModel {
...
    public InvoiceViewModel InvoiceViewModel { get; set; }
    public IEnumerable<Service> Services { get; set; }
    public IEnumerable<Product> Products { get; set; }
...
}

然后更新您的局部视图以接受这样的视图模型:

@model InvoiceViewModel

...

答案 4 :(得分:1)

我发现了错误。它在于控制器方法。当我调用Index视图(对应于ActionResult Index方法)时,我将viewmodel InvoiceViewModel返回到Index页面,即使它强烈键入InvoicePageViewModel。我把它改成了这个,有效:

public ActionResult Index()
{

    var invoice = InvoiceLogic.GetInvoice(this.HttpContext);

    // Set up our ViewModel
    var pageViewModel = new InvoicePageViewModel
    {
        Products = proent.Products.ToList(),
        Services = proent.Services.ToList(),
        InvoiceViewModel = new InvoiceViewModel
    {

        InvoiceItems = invoice.GetInvoiceItems(),
        Clients = proent.Clients.ToList(),
        InvoiceTotal = invoice.GetTotal()
    }
};
    // Return the view
    return View(pageViewModel);
}

感谢大家的所有帮助和建议。