传递给Dictionary的模型项类型错误
本文关键字:类型 错误 模型 Dictionary | 更新日期: 2023-09-27 18:18:00
我有以下在我的MVC 5应用程序。我有3个标签的燃料类型的汽车是柴油/汽油/电动。我在3个局部视图中设置了这些,比如:
@model MyProj.DieselviewModel
<p>
@{ Html.RenderPartial("_CarDetails"); }
</p>
汽油和电气的部分分别采用PetrolViewModel和ElectricViewModel,并且所有三个都呈现采用CarDetailsViewModel的部分视图_CarDetails。
注意我的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部分视图中,我知道哪种燃料类型是使用ModelBuilder类设置的,我使用泛型来创建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
或ElectricViewModel
的模型这是我的第一个父视图
然而,我的一个DieselViewModel的定义- public class DieselViewModel : CarDetailsViewModel
不是CarDetailsViewModel,我可以传递到_AnotherPartial页?
如果您没有初始化嵌套类的新实例,您将得到此错误。在CarDetailsViewModel
中,添加一个构造函数以确保其初始化
public CarDetailsViewModel()
{
OtherClass = new SomeOtherClass();
}
当一个模型为null时,它回落到ViewDataDictionary
,也就是DieselViewModel
,但你实际上想要DieselViewModel.SomeOtherClass
。在这种情况下,错误信息有点误导,因为它应该显示..但是字典需要一个类型为DieselViewModel.SomeOtherClass的模型。这似乎是一个小错误,因为它不包括嵌套类。
另一个选择是将SomeOtherClass
移到CarDetailsViewModel
之外(即不嵌套),并将_AnotherPartial.cshtml
更改为@model MyProj.OtherClass
。在这种情况下,如果您没有初始化它,您将收到错误消息..但是字典需要一个类型为DieselViewModel的模型。SomeOtherClass这证实了我的怀疑,这是一个bug
问题似乎是你的第一层,在那里你有DieselViewModel
等模型的视图正在获得CarDetailsViewModel
。您可以将DieselViewModel
传递给CarDetailsViewModel
,但不能反过来传递。