1

我有一个类库,其中包含一个自定义 MVC 模型绑定器,用于实例化从抽象类派生的各种具体类型。模型绑定器与本文中描述的几乎相同。

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

我的问题是,从程序集创建了一个 nuget 包并将其包含在一个完全独立的 MVC 应用程序中,模型绑定器不再工作,尽管已在 Global.asax.cs 中正确配置它。

在拉了一些头发之后,我直接在单独的 MVC 应用程序中重新创建了模型活页夹,并且当我这样做时,我注意到CreateModel()活页夹中的覆盖方法受到保护。它现在被执行,我怀疑受保护的关键字与它有关,但我想有人解释一下究竟是为什么。

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

谁能给我更多关于为什么会发生这种情况以及我可以做些什么来解决它的信息?请记住,我需要模型绑定器和模型驻留在类库中而不是 MVC 程序集中。

4

2 回答 2

2

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

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

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

而不是这个:

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

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

于 2016-01-20T14:08:49.157 回答
0

好的,所以我很愚蠢。事实证明,一些假设使我陷入了疯狂的追逐。

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

于 2015-03-19T22:13:35.127 回答