【问题标题】:How to correctly map value in request?如何正确映射请求中的值?
【发布时间】:2016-05-23 21:49:22
【问题描述】:

我有以下模型类:

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; }
    }

我需要接收带有他的文件的 TextClass 实例。 我尝试执行以下操作:

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

但是“textTerm”每次都是空的。

JSON 请求:

{
    "Field":"string",
    "Value": {
        "Type":"type",
        "TextField":"textfield",
        "ValueField": "valuefield"
    }
}

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

【问题讨论】:

  • 这只是 ASP.NET 代码隐藏还是这个 Post 方法是 ASP.NET MVC 控制器的一部分?从您提出问题的方式来看,它并不是很清楚。
  • @MokonaModoki 当然这是我代码的简化部分。但我需要像模型中的这种层次结构一样映射
  • 你没有回答这个问题,但我认为这是一个 MVC 应用程序。
  • @MokonaModoki 这是 ASP.NET Web Api 控制器的一部分。
  • 你试过调试吗?只是“价值”是空的吗?还是铸造的结果?尝试正确地转换它(不是使用条件转换): (TextClass)(model.Value) 或尝试检查 (model.Value is TextClass) 您可能必须使用组合方法。

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


【解决方案1】:

属性Value 的类型为ExampleClass。反序列化过程没有信息可以实现,需要将Value创建为TextClass

反序列化过程肯定会将Value 创建为ExampleClass,因为它是在没有更多信息的情况下唯一可以做的事情,然后当您尝试将其转换为TextClass 时它会失败,因为该转换没有意义上下文。

您必须将 Value 更改为输入 TextClass 或为此定义自定义反序列化过程(老实说,我不知道如何做到这一点的详细信息)

【讨论】:

    【解决方案2】:

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

    如果您假设可以有各种类继承自ExampleClass,那么模型绑定器应该如何知道请求中包含的数据准确地是,而不是创建ExampleClass 的实例TestClass 的实例应该是创建?

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 2018-09-12
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2022-07-06
      • 2017-01-19
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多