Razor Pages无法将'True'字符串转换为Boolean类型的问题
Razor Pages无法绑定字符串'True'到bool字段的原因及解决办法
核心原因
ASP.NET Core的模型绑定规则分两种场景,直接导致你遇到的问题:
- JSON格式提交时:如果AJAX请求用
contentType: "application/json"提交数据,JSON规范里布尔值是小写无引号的true/false,而你提交的"True"是字符串类型,类型不匹配。System.Text.Json默认不会自动将字符串类型的"True"转换为bool,模型绑定失败后,整个railcars对象会被设为null。 - 表单编码格式提交时:虽然表单绑定器支持宽松转换(不区分大小写的"true"/"false"字符串都能转bool),但如果你的请求头或数据格式不对,也可能导致绑定失败。
解决办法
- 前端修正(最直接):把从DOM获取的字符串值转为布尔类型后再提交,比如:
// 假设从DOM拿到的是字符串'IsLoaded'值 const isLoadedStr = document.querySelector('#someElement').dataset.isloaded; const data = { IsLoaded: isLoadedStr === 'True' || isLoadedStr === 'true' // 其他字段... }; // 提交AJAX时确保是布尔值而非字符串 - 后端自定义转换规则:如果无法修改前端,可以给模型字段添加自定义类型转换:
using System.ComponentModel; using System.Globalization; public class ArriveRailcarInfo { [TypeConverter(typeof(CustomBooleanConverter))] public bool IsLoaded { get; set; } // 其他字段... } public class CustomBooleanConverter : BooleanConverter { public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { return string.Equals(str, "True", StringComparison.OrdinalIgnoreCase) || string.Equals(str, "1", StringComparison.OrdinalIgnoreCase); } return base.ConvertFrom(context, culture, value); } } - 改用表单编码提交:如果不需要JSON格式,把AJAX的
contentType设为application/x-www-form-urlencoded,并将数据转为表单格式提交,此时表单绑定器会自动处理字符串"True"到bool的转换。
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

