如何在请求中正确映射值?

时间:2016-02-12 16:39:48

标签: c# asp.net asp.net-web-api

我有以下模特课:

inline uint32_t is_not_zero(uint32x4_t v)
{
    uint32x2_t tmp = vorr_u32(vget_low_u32(v), vget_high_u32(v));
    return vget_lane_u32(vpmax_u32(tmp, tmp), 0);
}

我需要用他的fileds接收TextClass的实例。 我尝试做以下事情:

public class TrackModel
    {
        public string Field;
        public ExampleClass Value;
    }
    public class ExampleClass
    {
        public string Type { get; set; }
    }

    public class TextClass : ExampleClass
    {
        public string TextField { get; set; }
        public string ValueFiled { get; set; }
    }

但每次“textTerm”都为空。

JSON请求:

 public class DefaultController : ApiController
{
    public string Post(TrackModel model)
    {
        TextClass textTerm = model.Value as TextClass;
        return "something";
    }
}

我需要这个类层次结构。我该如何正确映射? 也许JsonConverter? C这个例子中有人展示它是如何工作的?或者我可以听到解决这个问题的任何方法。

2 个答案:

答案 0 :(得分:1)

属性Value的类型为ExampleClass。反序列化过程没有信息可以意识到它需要将Value创建为TextClass

反序列化过程肯定会将Value创建为ExampleClass,因为它是唯一可以在没有更多信息的情况下执行的操作,然后当您尝试将其转换为TextClass时,它会失败,因为该转换不会在这种背景下有意义。

您必须将Value更改为键入TextClass或为此定义自定义反序列化过程(老实说,我没有详细说明如何做到这一点)

答案 1 :(得分:1)

当请求到达服务器时,HttpRequest的数据绑定到操作方法参数中使用的模型。在此过程中,内容被反序列化为对象。

如果您假设可以存在从ExampleClass继承的各种类,那么模型绑定器应该如何知道请求包含的数据与而不是创建ExampleClass TestClass实例的数据{ {1}}应该被创建?

即使您可以使用这些类在客户端上编写对象,也只会将JSON传输到服务器。基于此JSON和操作的TrackModel参数类型,开箱即用的模型绑定器只能创建ExampleClass的实例。

解决此问题的一种方法是创建一个自定义模型绑定器,其中包含为您的特定需求创建正确对象的逻辑。有关绑定过程和自定义选项的详细信息,请参阅此link