2016-02-12 74 views
0

我有以下的模型类:如何在请求中正确映射值?

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的情况下与他的Fileds。 我试着做做以下:

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有人展示了它是如何工作的?或者我可以听到有关此问题的任何解决方案。

+0

这只是ASP.NET代码隐藏或是ASP.NET MVC控制器的Post方法的一部分吗?从你提出问题的方式来看,IT并不是很清楚。 –

+0

@MokonaModoki当然这是我的代码的简化部分。但我需要在模型 – neustart47

+0

中完全像这个层次结构一样映射您没有回答这个问题,但我认为这是一个MVC应用程序。 –

回答

1

属性Value的类型是ExampleClass。反序列化过程没有任何信息来实现它需要创建Value作为TextClass

反序列化过程中必然产生ValueExampleClass,因为它是当你试图将其转换为TextClass因为这转换不会在这方面意义它失败,可以做到没有更多的信息,那么唯一的事情。

你必须改变Value键入TextClass或定义一个定制的反序列化进程(老实说,我不具备的细节在我的怎么办头顶)

1

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

如果您认为有可能是从ExampleClass继承各种类,模型绑定怎么会知道请求包含正是这样,而不是创建的ExampleClass实例应创建的TestClass实例的数据?

即使您可能使用这些类组合客户端上的对象,也只会将JSON传输到服务器。基于此JSON和TrackModel参数类型的动作,开箱即用模型联编程序只能创建ExampleClass的实例。

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