[英]Render multiple strongly typed partial views inside a view?
我有这个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; }
}
}
问题在于,无论何时加载此视图,我都会收到错误消息,说我已将错误的模型传递给字典,并且未指定哪个部分视图导致问题。 每个部分都有不同的模型类型,一个名为Product的IEnumerable,一个名为Service的IEnumerable,以及一个名为InvoiceViewModel的视图模型的Invoice局部视图。
任何人都可以解释如何使这项工作? 顺便说一句,我在Razor和MVC上有点菜鸟。
UPDATE
我收到此错误消息:
传递到字典中的模型项的类型为“ProOptInteractive.ViewModels.InvoiceViewModel”,但此字典需要“ProOptInteractive.ViewModels.InvoicePageViewModel”类型的模型项。
该错误是因为您已将“ Invoice
部分视图设置为具有类型为InvoicePageViewModel
的模型,但您正在InvoicePageViewModel
传递InvoiceViewModel
类型的模型。
更新您的InvoiceViewModel
属性为类型InvoicePageViewModel
,或更改Invoice
使用类型的模型图InvoiceViewModel
。
错误在行<div>@Html.Partial("Invoice", Model.InvoiceViewModel)</div>
您的视图Invoice
正在接受InvoicePageViewModel
类型的模型,并且您正在传递InvoiceViewModel
将您的代码更改为<div>@Html.Partial("Invoice", Model)</div>
或修改您的Invoice
视图以接受InvoiceViewModel
为
@model ProOptInteractive.ViewModels.InvoiceViewModel
Invoice.cshtml
可能以以下内容开头:
@model ProOptInteractive.ViewModels.InvoicePageViewModel
替换为:
@model ProOptInteractive.ViewModels.InvoiceViewModel
您可以将模型传递到部分视图,如下所示:
@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
...
我发现了错误。 它在于控制器方法。 当我调用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);
}
感谢大家的所有帮助和建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.