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

时间:2015-03-19 21:04:02

标签: asp.net-mvc-3 custom-model-binder

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

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

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

在一些头发拉动后,我直接在单独的MVC应用程序中重新创建了模型绑定器,正如我所做的那样,我注意到绑定器中被覆盖的CreateModel()方法受到保护。它现在被执行了,我怀疑受保护的关键字与它有关,但我希望有人解释原因。

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

任何人都可以向我提供更多有关这种情况发生的信息以及我可以采取哪些措施来解决这个问题?请记住,我需要模型绑定器和模型驻留在类库中而不是MVC程序集中。

2 个答案:

答案 0 :(得分:2)

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

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

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

而不是:

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

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

答案 1 :(得分:0)

好的,所以我是傻瓜。事实证明,一些假设让我陷入了疯狂的追逐。

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