C# API输入中的动态属性名称

C# API输入中的动态属性名称,c#,asp.net-mvc,api,asp.net-core,asp.net-apicontroller,C#,Asp.net Mvc,Api,Asp.net Core,Asp.net Apicontroller,我有一个ASP.NET核心API,它接受一个名为DetParameterCreateDto的DTO参数,如下所示 DTO 我遇到的问题是,从客户端传入的参数有一个名为Instrument_Complete的属性;这是动态的 名称实际上是[instrument]\u complete,其中[instrument]是仪器的名称。因此,如果工具的名称是my_first_项目,那么参数的属性名称实际上将是my_first_instrument_complete,这将无法正确映射到my API的输入参数;

我有一个ASP.NET核心API,它接受一个名为DetParameterCreateDto的DTO参数,如下所示

DTO

我遇到的问题是,从客户端传入的参数有一个名为Instrument_Complete的属性;这是动态的

名称实际上是[instrument]\u complete,其中[instrument]是仪器的名称。因此,如果工具的名称是my_first_项目,那么参数的属性名称实际上将是my_first_instrument_complete,这将无法正确映射到my API的输入参数;所以它总是显示一个0的值

API方法

更新8/2

根据布拉德利的建议,我似乎可以通过自定义模型绑定来实现这一点。但是,我必须设置每个模型属性,而不仅仅是我想要设置instrument_complete并从字符串转换一些属性的属性。这似乎不是一个最佳的解决方案

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var instrumentValue = bindingContext.ValueProvider.GetValue("instrument").FirstValue;

        var model = new DetParameterCreateDto()
        {
            Project_Id = Convert.ToInt32(bindingContext.ValueProvider.GetValue("project_id").FirstValue),
            Username = bindingContext.ValueProvider.GetValue("username").FirstValue,
            Instrument = instrumentValue,
            Instrument_Complete = Convert.ToInt16(bindingContext.ValueProvider.GetValue($"{instrumentValue}_complete").FirstValue),

        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;

    }
Web API中的DTO参数是有限的,尤其是当属性是动态的时。我以前使用JObject解决过类似的问题。你的可能是:

[HttpPost("create")]
public IActionResult CreateDetEntry(JObject detParameters)
{
    //DO something with detParameters
    ...
    //Optionally convert it to your DTO
    var data = detParameters.ToObject<DetParameterCreateDto>();
   // or use it as is
}

在调用CreateAttachery之前,您可能会使用ActionFilter来定位参数并更改其名称。实际上,a可能更适合于更改数据的映射方式。如果数据没有以JSON表示法传递,这仍然有效吗?我不认为API使用JSON,因为当我在参数中使用[FromBody]时,它不起作用。此外,接受所有参数是否是最佳做法?我喜欢有强烈的验证
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var instrumentValue = bindingContext.ValueProvider.GetValue("instrument").FirstValue;

        var model = new DetParameterCreateDto()
        {
            Project_Id = Convert.ToInt32(bindingContext.ValueProvider.GetValue("project_id").FirstValue),
            Username = bindingContext.ValueProvider.GetValue("username").FirstValue,
            Instrument = instrumentValue,
            Instrument_Complete = Convert.ToInt16(bindingContext.ValueProvider.GetValue($"{instrumentValue}_complete").FirstValue),

        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;

    }
[HttpPost("create")]
public IActionResult CreateDetEntry(JObject detParameters)
{
    //DO something with detParameters
    ...
    //Optionally convert it to your DTO
    var data = detParameters.ToObject<DetParameterCreateDto>();
   // or use it as is
}