模型绑定到继承 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.
不幸的是,没有办法解决它 - 您将需要一个自定义模型活页夹。
我有以下 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.
不幸的是,没有办法解决它 - 您将需要一个自定义模型活页夹。