【问题标题】:The model item passed into the dictionary is of type 'MyType', but this dictionary requires a model item of type 'MyType'传入字典的模型项的类型为“MyType”,但此字典需要“MyType”类型的模型项
【发布时间】:2011-07-12 14:39:17
【问题描述】:

是的,我回答了标题相似的问题。它们似乎都不符合我所处的情况。只是程序员向视图发送了错误的对象类型。

这是我收到的确切错误消息:

传入字典的模型项的类型为“IS.Extensions.Models.ContactSelectList”,但此字典需要类型为“IS.Extensions.Models.ContactSelectList”的模型项。

我开始在我们的解决方案中移动视图和模型类,试图使其“类似于框架”。我的意思是,我们拥有的一些视图/模型用于多个 MVC 应用程序,而一些视图/模型特定于某个 MVC 应用程序。
该问题是在移动 ContactSelectList 视图后开始的。
公共视图位于使用Razor generator 编译它们的项目中。

我认为这是:

@model IS.Extensions.Models.ContactSelectList

在调试时我可以看到我发送给 RenderPartial 方法的模型是相同类型的:

一些旁注:

  • IS 是一个 MVC Web 应用程序并引用 IS.Extensions
  • IS.Extensions是IS引用的类库
  • ContactSelectList.cshtml 位于 IS\Views\Controls
  • ContactSelectList.cs 模型类位于 IS.Extensions\Models
  • “父视图”(触发此 RenderPartial 调用的视图位于“通用”项目中:ZModel.Web\Views\Controls

有人知道这里发生了什么吗?错误消息有点令人困惑,并没有真正的帮助..

Erics 评论后编辑:

动态加载包含模型类 (ContactSelectList.cs) 的程序集。为什么?因为我认为创建一种扩展/插件系统是有意义的,其中将某个 dll 放在某个目录中扩展了公共模型和一些特定于应用程序的模型。
这是如何(稍作修改):

var zExtenderAssembly = Assembly.LoadFile(path);
extenderType = zExtenderAssembly.GetTypes().ToList().Where(t => t.GetInterface("IZExtender") != null).FirstOrDefault();
return (Activator.CreateInstance(extenderType) as IZExtender).CreateBO("ContactSelectList");

ZExtender 中的“CreateBo”方法(实现 IZExtender)只是创建一个 ContactSelectList 的新实例(它与 ZExtender 在同一个库中,因此不需要反射):

public Component CreateBO(string name)
{
    ...
            return new ContactSelectList();
    ...
}

【问题讨论】:

  • 只是一个猜测:您是否偶然使用反射?您是否偶然获得了包含该类型的程序集的两个副本,一个通过按路径加载程序集,另一个通过按程序集名称加载相同的程序集?如果你这样做了,那么反射会将来自同一程序集的两个加载的类型视为不同的类型。从其路径加载的任何程序集都被认为不同于通过其程序集名称加载的程序集。这可能会导致此类错误消息。这是超级困惑第一次发生在我身上。
  • @Eric:我只创建了一次 ContactSelectList 对象。它所碰撞的只是视图中的声明。它确实可能与对象的创建方式有关。请参阅我编辑的问题。你能想到什么办法吗?
  • 呜呼,我的精神力量今天显然很强大。几乎可以肯定,执行“LoadFrom”是导致此问题的原因。您可以按程序集名称而不是其路径进行加载吗?如果你这样做了,那么加载器会说“啊,我看到我们已经用它的名字加载了这个东西两次,让我们使用我们已经加载的类型”。
  • 更一般地说:如果您正在构建自己的插件系统,您可能会考虑使用 MEF 或 MAF 作为起点,而不是尝试自行开发。我自己构建了一个插件系统(这是 MAF 的前身),我可以告诉你,你会遇到很多这类棘手的问题。
  • @Eric: 将回到这个 tmrw .. 现在需要回家 :) 这是我希望 SO 有一些私人消息系统的情况.. 这个评论只是为了告诉 Eric 我'我还没有完成关于这个的沟通;)我想我明天会删除这条评论:)

标签: c# asp.net-mvc-3


【解决方案1】:

我将扩展 dll 移动到 web 应用程序的 bin 目录并更改了 dll 的加载方式。
我曾经通过指定 .dll 文件的完整路径来加载它。使用 Assembly.Load('myAssemblyName') 加载扩展 dll,一切都像以前一样工作。

【讨论】:

  • 谢谢!这解决了困扰我一段时间的问题!
猜你喜欢
  • 2020-09-08
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2015-09-27
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多