2014-11-05 22 views
0

我有归结为一些非常基本的HttpClient代码:网络API后复杂,对象与泛型列表,物业,计数0

var criteria = new Criteria() { Name = "TestName" }; 
criteria.listProperty.Add(new ComplexObject<int>("value", true)); 
httpClient.PostAsJsonAsync("api/ctl/myAction", criteria) 

控制器看起来是这样的:

[HttpPost] 
public HttpResponseMessage myAction([FromBody]Criteria criteria) 
{ 
    return DoSomethingWithIt(criteria); 
} 

事情是,我在我的PostAsJsonAsync上放了一个断点,并且我的标准对象具有名称“TestName”,并且其listProperty具有一个带有“值”和真实属性的项目。所有事情都应该如此。

但控制器上的断点显示标准具有计数0,但仍显示标准对象的名称为“TestName”。然后我试了一下:

[HttpPost] 
public HttpResponseMessage myAction(Object criteria) 
{ 
    var jsonString = model.ToString(); 
} 

而且jsonString具有一切,包括具有“value”和true属性的复杂属性。

我的标准和ComplexObject对象是像这样:

public class SearchCriteria 
{ 
    public List<ComplexObject> listProperty { get; set; } 
    public string Name { get; set; } 
} 

public class ComplexObject<T> : ComplexObject 
{ 
    public T Value { get; set; } 
    public List<T> Choices { get; private set; } 

    public ComplexObject<T>(string complexName, bool isRequired, List<T> choices = null) 
    { 
     this.ComplexName = complexName; 
     this.IsRequired = isRequired; 
     this.Choices = choices; 
    } 
} 

public abstract class ComplexObject 
{ 
    public string ComplexName { get; protected set; } 
    public bool IsRequired { get; protected set; } 
} 

P.S:我已经试过两个控制器使用和不使用[FromBody。

回答

1

正如您所预料的那样,答案是在通过HTTP或反序列化为JSON时泛型类型会丢失。为了做到这一点,我必须在我的抽象ComplexObject上编写一个自定义分析器(Deserializer),并在SearchCriteria中为迭代器调用每个listProperty的分析器。

最终,这是对我在分享我的Model命名空间的c#项目之间的Web API使用情况的一个优雅回答。但是,使用剃刀和/或angularjs在我的MVC项目中使用它比使用它复杂得多。

如果您在Web API中使用泛型并遇到问题,我的建议是重新评估您的应用程序的哪个部分很漂亮。您可以拥有一个可以轻松传递泛型的漂亮后端,也可以是一个干净的前端,它需要更多基本后端代码才能通过http进行序列化。