使用来自不同程序集的自定义模型联编程序并从同一程序集实例化对象

Use custom model binder from different assembly and instantiate object from same

我有一个 class 库,其中包含一个自定义 MVC 模型绑定器,用于实例化从抽象 class 派生的各种具体类型。模型活页夹与 this post.

中描述的几乎相同

在同一个 Visual Studio 解决方案中使用它时工作正常,该解决方案还包括用于测试的 MVC Web 应用程序。

我的问题是,从程序集创建了一个 nuget 包并将其包含在一个完全独立的 MVC 应用程序中后,尽管在 Global.asax.cs.

中正确配置了模型绑定器,但它不再有效。

经过一番摸索后,我直接在单独的 MVC 应用程序中重新创建了模型活页夹,在这样做时我注意到活页夹中被覆盖的 CreateModel() 方法受到保护。它现在被执行了,我怀疑 protected 关键字与它有关,但我希望有人能准确解释原因。

即使使用 'local' 模型绑定器,也存在更多问题。当它执行并尝试实例化具体对象时,我得到一个异常 Could not load type XXXX from assembly { separate MVC project assembly name} 所以看起来模型绑定器无法从它自己的程序集外部加载类型。

任何人都可以告诉我更多信息,说明为什么会发生这种情况以及我可以采取哪些措施来解决这个问题?请记住,我需要模型绑定器和模型驻留在 class 库中,而不是在 MVC 程序集中。

好吧,我是愚蠢的。事实证明,一些假设让我陷入了疯狂的追逐。

ModelBinder 一开始就正确执行。我的视图模型具有嵌套属性,它们也是抽象基类型并且需要模型绑定器,但我没有将隐藏字段放在视图中以标识它们的具体类型,也没有将它们添加到 Global.asax 配置中。一旦我这样做了,一切都开始按预期工作。

我遇到了和你一样的问题,绑定到不同程序集中的模型,但我需要不同的解决方案。我使用了您链接到的相同模型绑定示例,并且我也遇到了相同的异常:Could not load type XXXX from assembly

我最终需要为每个具体类型使用 AssemblyQualifiedName。所以我的观点包含:

@Html.Hidden("ModelType", Model.GetType().AssemblyQualifiedName)

而不是这个:

@Html.Hidden("ModelType", Model.GetType())

我仍然想知道为什么这是必要的,因为默认模型绑定器可以从有问题的程序集中加载类型。