C# A从已经工作的CustomModelBinder创建了一个新的CustomModelBinder。为什么新版本从未被调用进行任何绑定?

C# A从已经工作的CustomModelBinder创建了一个新的CustomModelBinder。为什么新版本从未被调用进行任何绑定?,c#,asp.net-mvc-3,custom-model-binder,C#,Asp.net Mvc 3,Custom Model Binder,我可以这样做吗 [HttpPost] public ActionResult Index(WizardViewModel wizard, IStepViewModel step) { 在我的global.asax.cs应用程序\u start中有以下内容 ModelBinders.Binders.Add(typeof(IStepViewModel), new StepViewModelBinder()); ModelBinders.Binders.Add(typeof(Wiza

我可以这样做吗

[HttpPost]
public ActionResult Index(WizardViewModel wizard, IStepViewModel step)
{
在我的global.asax.cs应用程序\u start中有以下内容

    ModelBinders.Binders.Add(typeof(IStepViewModel), new StepViewModelBinder());
    ModelBinders.Binders.Add(typeof(WizardViewModel), new WizardViewModelBinder());
    ModelBinders.Binders.Add(typeof(WizardViewModel), new WizardViewModelBinder());
更新 所以,我试着看看到底出了什么问题。这是我的新代码。问题似乎出在WizardViewModel及其活页夹上。什么“告诉”应用程序预期和传入的向导模型

[HttpPost]
public ActionResult Index(WizardViewModel wizard)
{
在我的global.asax.cs应用程序\u start中有以下内容

    ModelBinders.Binders.Add(typeof(IStepViewModel), new StepViewModelBinder());
    ModelBinders.Binders.Add(typeof(WizardViewModel), new WizardViewModelBinder());
    ModelBinders.Binders.Add(typeof(WizardViewModel), new WizardViewModelBinder());
完整活页夹代码
我过去也做过类似的事情,我传递了一个字符串,然后分割了值。

我会说答案是:是的!在你的评论中,你担心“许多其他问题”,这可能会引起麻烦。不知道你在想什么,很难帮助你。但您所做的正是模型绑定器的设计目的。没有理由,为什么每个动作只有一个对象。

答案很简单-是的!当您拥有将值绑定到参数的自定义逻辑时,应该这样做。您甚至可以使用单独设置每个参数的

    [HttpPost]
    public ActionResult Index([ModelBinder(typeof(WizardViewModelBinder))]WizardViewModel wizard, 
[ModelBinder(typeof(StepViewModelBinder))]IStepViewModel step)
    { }
正如我所看到的,错误在于您的模型绑定器代码中。我没有时间检查它,但据我记忆所及,
CreateModel
被模型绑定器用来创建模型的实例,然后返回的实例被模型绑定。因此,重写
BindModel
而不是
CreateModel
,并在
BindModel
中编写模型绑定逻辑。那肯定管用

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{
//your model binding logic here
}

我真的对ASP.NETMVC模型绑定要求我跳出去实现一些基本的反序列化的怪圈不再抱有幻想

由于模型绑定远没有我所希望的复杂模型/视图模型那么透明,我只构建了一个自定义ActionFilter来解析我希望在action方法中反序列化的类型[并且仅解析类型],并用于满足所有序列化/反序列化需要

请看这里:


是的,但我很容易遇到许多其他问题,导致此功能无法正常工作。因此,在我进一步讨论之前,我想我应该检查一下这是否可行。道格,正如我在上一个问题中所回忆的那样,WizardViewModel将
IList
作为一个属性包含在内。还是这样吗?如果是这样,那么WizardViewModelBinder可能也应该处理子IStepViewModel类的绑定。正如其他人所建议的,请发布您的模型活页夹代码。更新了我的问题。像以前一样,有两个绑定,一个“执行”,一个不会。Doug,你能不能也展示一下简化的模型,简单的GET和POST控制器动作以及一个视图?当我尝试您的绑定器时,我遇到的问题是StepViewModelBinder,而不是WizardViewModelBinder。我的理解是ModelBinder的全部目的是允许将复杂对象作为参数传递到控制器操作中,而不是简单的数据类型。这不正确吗?ModelBinder是在3.5中引入的。在此之前,我的解决方案是一个有效但原始的选择。我的意思是,我的代码可能在其他地方导致意外的结果。我更喜欢看一个真实世界的例子。而不是热情的“是”。在这种情况下,如果没有一些专家的意见,我不想与我几乎无法理解的代码对抗。我真的不明白你的问题:你使用的模型绑定器正是它们设计的方式。在我看来,使用archil提出的属性通常是一个不好的选择,但这取决于您的确切用例。如果创建奇怪的类型层次结构,也可能会遇到问题。但这一切都独立于模型绑定和(或多或少)完全不同的主题。所以我的答案仍然是:是的,您正在以正确的方式使用模型绑定器!我不确定是否需要重新提交我的问题,但我确实需要一个动作上多个绑定的示例。这就是Archil所提供的。您最初的示例也使用了多重绑定!?当我执行代码时,我希望能够在每个自定义模型绑定器上设置一个断点,并且在调用我的操作期间,可以看到自定义绑定器被调用,但它会跳过第二个ModelBinder。这向我表明,要做的不仅仅是让参数列表接受模型,而不是简单的数据类型。一旦我有机会测试它,我就接受它。如果你觉得这个问题很有趣,我会非常感激你提出一个问题,这不会导致任何变化。我的CustomModelBinder for WizardViewModel仍然没有被调用。这两种方法——通过Global.asax和通过参数属性都应该有效。发布您的ModelBinder代码,也许这可以帮助我们帮助您,先生。这太棒了!这给我的控制器增加了很多简单性。只需输入模型和“vwwwoop”!如果这个答案是有帮助的,你可以奖励它以询问的奖励