You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不新建模型的情况下限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:57:04