2

我遇到了无法调用正确的 DisplayTemplate 的问题。

我有两个模型:

CompanyName.Application.Web.Controllers.SharedViewModels.PaymentItemViewModel
CompanyName.Application.ViewModels.SharedViewModels.PaymentItemViewModel

这些对象在 IEnumerable 中使用,然后传递给 DisplayTemplate。

DisplayTemplates/PaymentItemViewModel.cshtml:

@model CompanyName.Application.ViewModels.Web.SharedViewModels.PaymentItemViewModel

显示模板/PaymentItems.cshtml:

@model CompanyName.Application.Web.Controllers.SharedViewModels.PaymentItemViewModel

如果我尝试像这样调用 PaymentItems.cshtml 的显示模板:

@Html.DisplayFor(model => model.PaymentItems, "DisplayTemplates/PaymentItem")

它会抛出一个错误,它抱怨传递给字典的模型与字典所期望的模型类型不同。model.PaymentItems 中的类型绝对是一个 IEnumerable

CompanyName.Application.Web.Controllers.SharedViewModels.PaymentItemViewModel

如果我这样调用,另一个模板确实有效:

@Html.DisplayFor(model => model.PaymentItems)

但是,如果我指定模板名称:

@Html.DisplayFor(model => model.PaymentItems, "DisplayTemplates/PaymentItemViewModel.cshtml")

然后它失败了。就好像指定模板名称要么完全被忽略,要么破坏模板功能。

4

1 回答 1

0

Shelakel 对这个问题的评论一半为我回答了这个问题。

我将“DisplayTemplates/PaymentItem”更改为“PaymentItem”,它开始调用正确的模板。但是,它确实引发了另一个问题,它抱怨它试图将 IList 传递给单个对象。

这是 PaymentItems 在主模型上的外观:

private IList<PaymentItemViewModel> paymentItems = new List<PaymentItemViewModel>();

public IEnumerable<PaymentItemViewModel> PaymentItems
{
    get { return paymentItems; }
    set { paymentItems = value.ToList(); }
}

为了解决这个问题,我必须将显示模板上的模型设为 IList 并在其中放置一个 foreach。有点毫无意义,因为我认为模板的主要原因之一是您不需要遍历视图上的集合!

无论如何,我相信 IList 问题源于初始集合作为 IList 开始生活的事实,但我现在已经让它工作了,所以我想这个问题已经得到解答。

将 paymentItems 声明从 更改IList<PaymentItemViewModelIEnumerable<PaymentItemViewModel>不会改变任何东西。

于 2013-02-13T10:04:33.880 回答