有时候我们可能不想显示某个实体中的所有字段。比如客户端发出如下请求:

locaohost:43321/api/groups/1/items?fields=id
locaohost:43321/api/groups/1/items?fields=id,name

以上,对于Item这个类,我们可能只想显示id,也有可能是想显示id和name,等等。

如何实现呢?

→ 后端接受fields这个查询字符串的值,split到数组或集合中
→ 遍历这些字段,使用反射获取字段的值,并把每个键值存储起来

假设有如下的领域:

public class Group
{
public int Id{get;set;}
public int UserId{get;set;}
public string Title{get;set;}
public string Descritpion{get;set;}
public int StatusId{get;set;}
public ICollection<Item> Items{get;set;}
} public class Item
{
public int Id{get;set;}
public string Name{get;set;}
}

针对Item的控制器如下:

public class ItemsController : ApiController
{
[Route("groups/{groupId}/items", Name="ItemsForGroup")]
public IHttpActionResult Get(int groupId, string fields = null)
{
List<string> lstOfFields = new List<string>(); if(fields != null)
{
lstOfFields = fields.ToLower().Split('').ToList();
} var result = _repo.GetItems()
.ToList()
.Select(e => ItemFactory.CreateDataShapedObject(e, lstOfFields)); return Ok(result);
}
} public staic class ItemFactory
{
public object CreateDataShapedObject(Item item, List<string> lstOfFields)
{
if(!lstOfFields.Any())
{
return item;
}
else
{
//运行时对象
ExpandObject objectToReturn = new ExpandObject();
foreach(var field in lstOfFields)
{
//获取字段值
var fieldValue = item.GetType()
.GetProperty(field, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)
.GetValue(item, null); ((IDictionary<string, object>)objectToReturn).Add(field, fieldValue);
}
return objectToReturn;
}
}
}

以上,ExpandObject是运行时对象,实现IDictionary<string, object>接口,通过反射,把字段作为ExpandObject的key,把字段值作为ExpandObject的value。

ASP.NET Web API中通过URI显示实体中的部分字段的更多相关文章

  1. How ASP.NET Web API 2.0 Works?[持续更新中…]

    一.概述 RESTful Web API [Web标准篇]RESTful Web API [设计篇] 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 二.路由 ...

  2. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  3. 【ASP.NET Web API教程】1.1 第一个ASP.NET Web API

    Your First ASP.NET Web API (C#)第一个ASP.NET Web API(C#) By Mike Wasson|January 21, 2012作者:Mike Wasson ...

  4. ASP.NET Web API从注释生成帮助文档

    默认情况下,ASP.NET Web API不从Controller的注释中生成帮助文档.如果要将注释作为Web API帮助文档的一部分,比如在帮助文档的Description栏目中显示方法注释中的su ...

  5. HttpClient + ASP.NET Web API, WCF之外的另一个选择

    WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美.为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS. 于是有了让人晕头转向的配置.让人郁 ...

  6. 【ASP.NET Web API教程】2.1 创建支持CRUD操作的Web API

    原文 [ASP.NET Web API教程]2.1 创建支持CRUD操作的Web API 2.1 Creating a Web API that Supports CRUD Operations2.1 ...

  7. 关于操作 ASP.NET Web API的实例

    WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美.为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS. 于是有了让人晕头转向的配置.让人郁 ...

  8. 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

    随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...

  9. 细说Asp.Net Web API消息处理管道(二)

    在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...

随机推荐

  1. SQL Server 触发器demo

      GO /****** Object: Trigger [dbo].[tri_device] Script Date: 2018/6/11 10:56:08 ******/ SET ANSI_NUL ...

  2. Highcharts 使用

    官网:https://www.hcharts.cn/ api:https://api.hcharts.cn/highcharts 效果 html代码 <div id="containe ...

  3. 【splunk】数据输入-文件目录 导入失败

    今天用splunk的“数据输入-文件目录”自动监控文件并索引,结果失败了,完全没有出现我要的索引. 解决: 删除文件监控 改为一次性索引 再重新添加连续监控 原因: 尚不明确 https://answ ...

  4. 使用caffe模型测试图片(python接口)

    1.加载相关模块 1.1 加载numpy import numpy as np 1.2 加载caffe 有两种方法. 方法一(静态导入): 找到当前环境使用的python的site-packages目 ...

  5. ural1855 线段树区间更新+推公式维护一元二次式

    和威威猫系列故事差不多,都是根据条件推出公式 /* 操作c a b d:a到b道路上的所有边权值加d 操作e a b:问a到b中包含的道路的平均权值 区间平均值=所有可能路径权值/所有路径数, 而路径 ...

  6. Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka

    一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...

  7. HDU 1029 某个数出现的次数大于等于(N+1)/2的是哪个 map水题

    题意:输入n个数 n为奇数 问某个数出现的次数大于等于(N+1)/2的是 哪个 输出来Sample Input51 3 2 3 3111 1 1 1 1 5 5 5 5 5 571 1 1 1 1 1 ...

  8. Hibernate api 之常见的类(配置类,会话工厂类,会话类)

    1:Configuration :配置管理类对象 1.1:config.configure(): 加载主配置文件的方法(hibernate.cfg.xml) ,默认加载src/hibernate.cf ...

  9. join 关键字

    参考:http://www.blogjava.net/vincent/archive/2008/08/23/223912.html

  10. 6-2 S树 uva712

    这题关键是  反转    查询是固定按照x1x2x3来的   那么先收集前面的顺序  然后在数组里面直接调用即可 比如前面的树是 x3 x1 x2  就把这个当作数组下标 最左边的树是 1<&l ...