如何在不新建模型的情况下限制IActionResult仅返回指定前缀的属性
实现方案
入参绑定限制(仅接收machine_前缀参数)
如果是要限制接口请求参数仅绑定machine_开头的属性,避免传入的app_前缀参数被赋值到模型,可以直接在入参处加[Bind]特性指定允许绑定的属性列表:
public IActionResult UpdateMachineStatus([Bind(nameof(YourModel.machine_status_name), nameof(YourModel.machine_status_value))] YourModel model) { // 此时model中app_开头的属性不会被请求参数赋值,始终为默认值 // 后续业务逻辑 return Ok(); }
出参筛选限制(仅返回machine_前缀属性)
方案1:构造匿名类(最简单)
返回时直接筛选需要的属性构造匿名对象即可,不需要新增模型:
public IActionResult GetMachineStatus() { // 此处为你获取到的完整原模型实例,假设名为statusModel YourModel statusModel = GetModelFromSource(); return Ok(new { machine_status_name = statusModel.machine_status_name, machine_status_value = statusModel.machine_status_value }); }
无额外依赖,代码量少,适合machine_前缀属性数量固定且较少的场景。
方案2:反射动态筛选(扩展性最优)
如果后续会新增更多machine_开头的属性,不想每次修改返回代码,可以用反射动态获取符合要求的属性:
public IActionResult GetMachineStatus() { YourModel statusModel = GetModelFromSource(); var result = new Dictionary<string, object>(); // 反射筛选所有以machine_开头的公共属性 var matchProperties = typeof(YourModel).GetProperties() .Where(p => p.Name.StartsWith("machine_", StringComparison.OrdinalIgnoreCase)); foreach (var prop in matchProperties) { result[prop.Name] = prop.GetValue(statusModel); } return Ok(result); }
后续新增machine_前缀属性不需要修改返回逻辑,会自动包含到返回结果中。
方案3:自定义JSON序列化规则(复用性最优)
如果需要在多处用到相同的过滤规则,可以自定义序列化过滤器,不需要每次手动构造返回对象:
public class MachinePrefixJsonFilter : JsonSerializerOptions { public MachinePrefixJsonFilter() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase; DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { if (typeInfo.Type != typeof(YourModel)) return; // 仅保留machine_开头的属性 var keepProperties = typeInfo.Properties .Where(p => p.Name.StartsWith("machine_", StringComparison.OrdinalIgnoreCase)) .ToList(); typeInfo.Properties.Clear(); foreach (var prop in keepProperties) { typeInfo.Properties.Add(prop); } } } }; } }
返回时指定序列化选项即可:
public IActionResult GetMachineStatus() { YourModel statusModel = GetModelFromSource(); return Json(statusModel, new MachinePrefixJsonFilter()); }
内容的提问来源于stack exchange,提问作者Alleria
相关产品推荐
相关产品推荐

