我有一个ASP.NET Core 1.1 API,它接受一个名为DetParameterCreateDto
的DTO参数。我遇到的问题是其中一个属性名称是动态的(instrument_complete
)。该名称实际为[instrument]_complete
,其中[instrument]
是该工具的名称。
因此,如果instrument
是my_first_instrument,那么属性名称将真正为my_first_instrument_complete
。
在此处发布并搜索网页后,似乎最好的解决方案是创建自定义模型绑定器。我想知道是否有一种方法可以自定义映射instrument_complete
参数,并将其余部分设置为默认映射。我觉得我的解决方案不是最好的解决方案,因为必须映射和转换所有参数的性能,并且因为创建新模型不会传输模型状态;所以将清除任何验证错误。我可能错了,但这是我所相信的
DTO
public class DetParameterCreateDto
{
public int Project_Id { get; set; }
public string Username { get; set; }
public string Instrument { get; set; }
public short Instrument_Complete { get; set; }
// Other properties here...
}
自定义模型活页夹
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;
}