【问题标题】:Model items passed to Dictionary is of type error传递给 Dictionary 的模型项目类型错误
【发布时间】:2014-08-14 21:50:42
【问题描述】:

我的 MVC 5 应用程序中有以下内容。我有 3 个用于燃料类型汽车的标签,它们是柴油/汽油/电动汽车。我在 3 个部分视图中有这些 - 类似于:

@model MyProj.DieselviewModel

<p>
    @{ Html.RenderPartial("_CarDetails"); } 
</p>

Petrol 和 Electric 的局部视图然后分别采用 PetrolViewModel 和 ElectricViewModel,并且所有三个都渲染采用 CarDetailsViewModel 的局部视图 _CarDetails。

注意我的 DieselViewModel 在下面:

 public class DieselViewModel : CarDetailsViewModel
    {
        public override CarFuelTypeEnum CarFuelType
        {
            get { return CarFuelTypeEnum.Diesel; }
            set { base.CarFuelType = value; }
        }
    }

所以这里为每种燃料类型设置了燃料类型枚举,然后在我拥有的 CarDetailsViewModel 中:

public virtual CarFuelTypeEnum CarFuelType{ get; set; }

因此,在我的 _CarDetails Partial 视图中,我知道哪个 FuelType 是使用我拥有的 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 页面吗?

【问题讨论】:

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


    【解决方案1】:

    如果您没有初始化嵌套类的新实例,您将收到此错误。在CarDetailsViewModel中,添加一个构造函数以确保其已初始化

    public CarDetailsViewModel()
    {
      OtherClass = new SomeOtherClass();
    }
    

    当模型为空时,它回退到ViewDataDictionary,即DieselViewModel,但您实际上需要DieselViewModel.SomeOtherClass。在这种情况下,错误消息有点误导,因为它应该说 ..但是字典需要 DieselViewModel.SomeOtherClass 类型的模型。这似乎是一个小错误,因为它不包含嵌套类。

    另一种选择是将SomeOtherClass 移出CarDetailsViewModel(即不嵌套)并将_AnotherPartial.cshtml 更改为@model MyProj.OtherClass。在这种情况下,如果您没有初始化它,您会收到错误消息 ..但是字典需要一个类型为 DieselViewModel.SomeOtherClass 的模型,这证实了我的怀疑,它是错误

    【讨论】:

      【解决方案2】:

      问题似乎是你的第一层,你有DieselViewModel,等。作为视图模型得到CarDetailsViewModel。您可以将DieselViewModel 传递给CarDetailsViewModel,但不能反过来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-03
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-20
        • 1970-01-01
        相关资源
        最近更新 更多