为单个属性设置自定义模型绑定器

时间:2017-08-03 13:09:49

标签: c# asp.net-mvc asp.net-core model-binding custom-model-binder

我有一个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;

    }

0 个答案:

没有答案