Razor 页面无法将“True”转换为布尔值

问题描述 投票:0回答:1

我正在从 Razor Pages 进行 AJAX 调用。在后端,我有这样的东西。

public class ArriveRailcarInfo
{
    public string Railcar { get; set; }
    public string Product { get; set; }
    public string Customer { get; set; }
    public bool IsLoaded { get; set; }
}

// Verifies the list of products are in the system
public async Task<IActionResult> OnPostValidateRailcarsAsync([FromBody] IEnumerable<ArriveRailcarInfo> railcars)
{
    // Validate railcars...
}

创建传递给 AJAX 调用的数据的 JavaScript 看起来像这样。

var railcars = [];
$checkedItems.each(function () {
    var $row = $(this).closest('tr');
    railcars.push({
        Railcar: $row.data('railcar'),
        Product: $row.data('product'),
        Customer: $row.data('customer'),
    });
});

这个效果很好。但如果我添加

IsLoaded
成员,那么
railcars
在后端为空。

var railcars = [];
$checkedItems.each(function () {
    var $row = $(this).closest('tr');
    railcars.push({
        Railcar: $row.data('railcar'),
        Product: $row.data('product'),
        Customer: $row.data('customer'),
        IsLoaded: $row.data('isloaded'),
    });
});

这也失败了。

var railcars = [];
$checkedItems.each(function () {
    var $row = $(this).closest('tr');
    railcars.push({
        Railcar: $row.data('railcar'),
        Product: $row.data('product'),
        Customer: $row.data('customer'),
        IsLoaded: 'true',
    });
});

但是,这有效。

var railcars = [];
$checkedItems.each(function () {
    var $row = $(this).closest('tr');
    railcars.push({
        Railcar: $row.data('railcar'),
        Product: $row.data('product'),
        Customer: $row.data('customer'),
        IsLoaded: true,
    });
});

因此,我可以将值转换为小写,生成一个真正的布尔值,然后使用它。但谁能告诉我为什么第一个版本不起作用?为什么 Razor Pages 无法将

'True'
转换为
true
值?

有效负载

这是正在发送的有效负载。

失败
[{"Railcar":"WFRX409179","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":"True"},{"Railcar":"TILX339447","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":"True"},{"Railcar":"MRMX016512","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":"True"}]
成功了
[{"Railcar":"SOXX003565","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":true},{"Railcar":"WFRX410561","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":true},{"Railcar":"GBRX069166","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":true},{"Railcar":"TILX337762","Product":"SAND FRACING 100 MESH","Customer":"FML TERMINAL LOGISTICS LLC","IsLoaded":true}]
c# asp.net asp.net-core .net-core razor-pages
1个回答
0
投票

实际上是完整的解决方案,因为我花了一些时间才弄清楚你需要装饰房产:

public class StringToBoolJsonConverter : JsonConverter<bool>
{
    public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.True)
            return true;

        if (reader.TokenType == JsonTokenType.False)
            return false;

        var s = reader.GetString() ?? "";

        if (s.Equals("true", StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (s.Equals("false", StringComparison.InvariantCultureIgnoreCase))
            return false;

        throw new JsonException("Boolean property must be \"true\" or \"false\".");
    }

    public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
        => writer.WriteBooleanValue(value);
}

最重要的是:

public class ArriveRailcarInfo
{
    public string Railcar { get; set; }
    public string Product { get; set; }
    public string Customer { get; set; }

    [JsonConverter(typeof(StringToBoolJsonConverter))]
    public bool IsLoaded { get; set; }
}

这适用于布尔值或字符串的 JSON 属性。

我以为你可以在program.cs中全局注册转换器,但我无法让它工作?

© www.soinside.com 2019 - 2024. All rights reserved.