DisplayFor不使用具有不同命名空间的相同型号名称

时间:2013-02-12 17:40:20

标签: c# asp.net-mvc-3 templates razor

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

我有两种模式:

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

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

DisplayTemplates / PaymentItemViewModel.cshtml:

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

DisplayTemplates / 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")

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

1 个答案:

答案 0 :(得分: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<PaymentItemViewModel更改为IEnumerable<PaymentItemViewModel>不会改变任何内容。