模型绑定到继承 class

Model binding to an inheriting class

我有以下 classes:

public abstract class InputVariableVm
{
    public InputVariableVmType Type { get; set; }
}



[KnownType(typeof(BoolInputVariableVm))]
public class BoolInputVariableVm : InputVariableVm
{
    public bool Value { get; set; }

    public BoolInputVariableVm(string name, bool value)
    {
        Value = value;
        Type = InputVariableVmType.Bool;
    }
}

[KnownType(typeof(StringInputVariableVm))]
public class StringInputVariableVm : InputVariableVm
{
    public string Value { get; set; }

    public StringInputVariableVm(string name, string value)
    {
        Value = value;
        Type = InputVariableVmType.String;
    }
}

在我的 Web API 控制器中,我试图绑定到 InputVariableVm(String 或 Bool)的对象。

但是该对象始终为 null - 但是当我从基础 class 中删除 "abstract" 关键字时,它会插入基础 class (但没有具体实现,因此缺少值 属性)。

这可能是什么原因?

顺便说一下,我很清楚编写自定义模型活页夹可以解决这个问题,但我想尽可能避免这样做。

这就是默认模型绑定器的工作方式 - 您作为操作参数输入的类型是绑定器将尝试实例化的类型,它不知道您真的想要一个 derived 类型在幕后实例化。 FWIW 在第一个场景中它是 null 的原因是因为你不能实例化一个 abstract class 因此为什么删除它然后工作。

By the way, I'm well aware that writing a custom model binder would solve this but I would like to avoid doing this if possible.

不幸的是,没有办法解决它 - 您将需要一个自定义模型活页夹。