我正在从 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}]
实际上是完整的解决方案,因为我花了一些时间才弄清楚你需要装饰房产:
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中全局注册转换器,但我无法让它工作?