传递给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 '或PetrolViewModelElectricViewModel的模型这是我的第一个父视图

然而,我的一个DieselViewModel的定义- public class DieselViewModel : CarDetailsViewModel不是CarDetailsViewModel,我可以传递到_AnotherPartial页?

传递给Dictionary的模型项类型错误

如果您没有初始化嵌套类的新实例,您将得到此错误。在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,但不能反过来传递。