2012-09-30 70 views
6

如果我只想返回模型中的一些字段,应该使用什么方法?我希望能够问一些领域,像这样:从ASP.NET Web API返回一些字段

领域是电子邮件,到期日期,化身(thumb_width,thumb_height,thumb_url)

这种表达可能在也头请求。我也有嵌套的对象,如用户头像。

这会为我节省数百MB的流量,因为我的一些模型真的很重。

更新:字段选择应该与Json和XML响应一起工作。

回答

2

我会用一个自定义替换默认合同解析器 (见http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/),覆盖从Newtonsoft.Json.Serialization.DefaultContractResolver类GetSerializableMembers方法以及与查询字符串字段的值筛选的结果。

您是否可以访问这个类的查询字符串是另外一个问题,您可以使用静态httpcontext.current得到它,但也有可能是一个更清洁的选择。

+0

我有一个例子,这将有条件地从JSON序列化对象中删除属性。 https://gist.github.com/33b5e6056c1d59e83b1a.git这可以使用此处显示的详细信息管理到ASP.NET API中http://tostring.it/2012/07/18/customize-json-result-in-web -API / –

6

我发现了一个NuGet包,这是否为你

WebApi.PartialResponse

GIT中毂源代码:
https://github.com/dotarj/PartialResponse

它实质上包裹上面讨论的格式化,这样就只需要配置它是这样的:

GlobalConfiguration.Configuration.Formatters.Clear(); 
GlobalConfiguration.Configuration.Formatters.Add(new PartialJsonMediaTypeFormatter() { IgnoreCase = true }); 

然后,你可以指定?fields=<whatever>在您的请求中,它将返回只有指定的字段的模型。

0

您也可以使用OData。它为您在查询和API方式方面提供了很大的灵活性。您可以使用$ select。我也猜测,阿凡达是另一个类,所以你会使用$ expand

/api/endpoint?$select=email,expiration_date&$expand=avatar($select=thumb_width,thumb_height,thumb_url) 

我不是100%,如果子选择的语法是正确的,但我认为是。