首页 > 解决方案 > 将 int(1 和 0)转换为 bool(true 和 false)以进行复杂类型属性的模型绑定的最佳方法是什么?

问题描述

我正在将一些服务集成到我的服务器中。但是提供者 api 使某些字段使用 1 和 0 来表示 bool 真假。所以我想在模型绑定发生时进行自定义转换。

请求发送到我的服务器:

{
    ...
    "prefix_success": "1" // or "0"
    ...
}

我的模型:

public class RequestForm {
    ...

    public bool Success { get; set; }

    ...
}

标签: asp.net-coreasp.net-core-mvcasp.net-core-webapi

解决方案


我认为这是最简单的。谢谢你们。

粘合剂:

public class IntToBoolModelBinder : IModelBinder {
    public Task BindModelAsync(ModelBindingContext bindingContext) {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var value = valueProviderResult.FirstValue;

        if (int.TryParse(value, out var intValue)) {
            bindingContext.Result = ModelBindingResult.Success(intValue == 0 ? false : true);

        } else if (bool.TryParse(value, out var boolValue)) {
            bindingContext.Result = ModelBindingResult.Success(boolValue);

        } else if (string.IsNullOrWhiteSpace(value)) {
            bindingContext.Result = ModelBindingResult.Success(false);

        } else {
            bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, 
                $"{bindingContext.ModelName} should be a int, bool or empty string.");
        }

        return Task.CompletedTask;
    }
}

用法:

public class Model {
    ...

    [BindProperty(BinderType = typeof(IntToBoolModelBinder))]
    public bool MarketingConsent { get; set; }

    ...
}

推荐阅读