传递给Dictionary的模型项的类型为error

时间:2014-08-14 21:50:42

标签: c# asp.net-mvc asp.net-mvc-4 razor asp.net-mvc-5

我在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页面吗?

2 个答案:

答案 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 的模型,这证实了我怀疑它是一个错误