我在MVC 5应用程序中有以下内容。我有3个燃料类型的汽车标签,柴油/汽油/电动。我在3个部分视图中有这些 - 类似于:
@model MyProj.DieselviewModel
<p>
@{ Html.RenderPartial("_CarDetails"); }
</p>
Petrol和Electric的部分分别采用PetrolViewModel和ElectricViewModel,所有这三个渲染部分视图_CarDetails,它采用CarDetailsViewModel。
请注意我的DieselViewModel位于以下位置:
public class DieselViewModel : CarDetailsViewModel
{
public override CarFuelTypeEnum CarFuelType
{
get { return CarFuelTypeEnum.Diesel; }
set { base.CarFuelType = value; }
}
}
所以燃料类型Enum在这里为每种燃料类型设置,然后在我有的CarDetailsViewModel中:
public virtual CarFuelTypeEnum CarFuelType{ get; set; }
所以在我的_CarDetails Partial视图中,我知道哪个FuelType是使用我使用的ModelBuilder类设置的,它使用Generics来创建Type T()的模型,它将是DieselViewModel / PetrolViewModel或ElectricViewModel。
这很好用,直到我想在_CarDetails页面中创建另一个局部视图 - 渲染其他一些细节:
所以我的CarDetailsViewModel就像(为了简单起见,删除了大部分属性)
public class CarDetailsViewModel
{
public string Name { get; set; }
public SomeOtherClass OtherClass{ get; set; }
public class SomeOtherClass
{
public double Field1{ get; set; }
}
}
我的_CarDetails部分就像是:
@model MyProj.CarDetailsViewModel
@Html.RenderPartial("_AnotherPartial", Model.OtherClass);
在_AnotherPartial顶部定义的模型是:
@model MyProj.CarDetailsViewModel.OtherClass
然而,即使我试图将该模型类传递给_AnotherPartial,我也会在此处抛出错误,说我传递的是CarDetailsViewModel,但字典需要类型为'DieselViewModel
'或PetrolViewModel
或{的模型{1}}这是我的第一个父视图
然而,根据我对DieselViewModel的定义 - ElectricViewModel
不是CarDetailsViewModel,我可以将其传递给_AnotherPartial页面吗?
答案 0 :(得分:0)
问题似乎是你的第一层,你有DieselViewModel
等。作为视图的模型获得CarDetailsViewModel
。您可以将DieselViewModel
传递给CarDetailsViewModel
,但不能相反。
答案 1 :(得分:0)
如果尚未初始化嵌套类的新实例,则会出现此错误。在CarDetailsViewModel
中,添加构造函数以确保其初始化
public CarDetailsViewModel()
{
OtherClass = new SomeOtherClass();
}
当模型为空时,它会回退到ViewDataDictionary
DieselViewModel
,但您确实需要DieselViewModel.SomeOtherClass
。在这种情况下,错误消息有点误导,因为它应该说 ..但字典需要 DieselViewModel.SomeOtherClass 类型的模型。这似乎是一个小错误,因为它不包括嵌套类。
另一种选择是将SomeOtherClass
移到CarDetailsViewModel
之外(即不嵌套)并将_AnotherPartial.cshtml
更改为@model MyProj.OtherClass
。在这种情况下,如果你没有初始化它,你会收到错误消息 ..但字典需要一个类型 DieselViewModel.SomeOtherClass 的模型,这证实了我怀疑它是一个错误