通用可序列化WebAPI MVC4

时间:2012-08-16 16:24:19

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

所以我试图对我们的MVC4框架项目的所有WebAPI调用进行一般性返回。

我遇到的问题是object类型无法轻松序列化。

所以我们的回归结构是......,

[DataContract]
class UiOutput {
    [DataMember("success")]
    public bool Success {get;set;};
    [DataMember("success")]
    public object Data {get;set;};
}

这种方式每次进行调用时,如果成功与否,则返回数据。数据可以是模型数组或其他任何数据。显然,这是php中的一项简单任务,但我们不在那里:)

所以我读到我遇到的问题是Error Three来自网站http://www.johnsoer.com/blog/?tag=the-type-was-not-expected-use-the-xmlinclude-or-soapinclude-attribute-to-specify-types-that-are-not-known-statically

所以我想创建一个可以解决这个问题的通用超类,除了它如何处理ViewModel数组?

[XmlInclude(typeof(MyAwesomeViewModel))]
class SuperType { }

实施例

[DataContract]
class UiOutput {
    [DataMember("success")]
    public bool Success {get;set;};
    [DataMember("success")]
    public SuperType Data {get;set;};
}

这将有助于返回说

[DataContract]
class MyAwesomeViewModel {
    [DataMember("awesome")]
    public bool Awesome {get;set;};
    [DataMember("viewModel")]
    public string ViewModel {get;set;};
}

但是如果我有一个想要返回array MyAwesomeViewModel的控制器,那么我不知道该怎么做!

我的意思是,如果有像

这样的控制器
class MyAwesomeController : ApiController {
    public UiOutput ByYear(int year) {
        MyAwesomeViewModel[] models = Rep.GetByYear(year);
        UiOutput output = new UiOutput();
        output.success = true;
        output.data = //Todo:  Is there a way to overcome?
    }
}

1 个答案:

答案 0 :(得分:0)

如果你想要一个泛型返回值,那么使用HttpResponseMessage并创建一个派生自HTTPContent的有效负载对象。

class MyAwesomeController : ApiController {
    public HttpResponseMessage ByYear(int year) {
        MyAwesomeViewModel[] models = Rep.GetByYear(year);
        return new HttpResponseMessage(statusGoesHere) { Content = GetUIContent(models) };
    }
}

class UIContent : HttpContent {
   ...
}