.NET 5 MVC中Bootstrap Datetimepicker英国日期格式提交识别错误问题
故障原因
ASP.NET Core 默认的 DateTime 模型绑定逻辑使用美式日期格式 MM/DD/YYYY 作为解析基准,你提交的英国格式 DD/MM/YYYY 日期在日部分大于12时无法被识别为合法日期,最终返回 DateTime 类型的默认值 0001/01/01 00:00:00。
解决方案
可以根据你的业务场景选择以下任意一种方案:
方案1:全局配置站点区域为英国(适合全站面向英国用户使用)
在 Startup.cs 中添加区域配置:
- 在
ConfigureServices方法中添加如下代码:
using System.Globalization; using Microsoft.AspNetCore.Localization; public void ConfigureServices(IServiceCollection services) { // 你的原有其他配置保留 var gbCulture = new CultureInfo("en-GB"); services.Configure<RequestLocalizationOptions>(opt => { opt.DefaultRequestCulture = new RequestCulture(gbCulture); opt.SupportedCultures = new List<CultureInfo> { gbCulture }; opt.SupportedUICultures = new List<CultureInfo> { gbCulture }; }); services.AddControllersWithViews(); }
- 在
Configure方法的最开头启用区域配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRequestLocalization(); // 你的原有其他中间件配置保留 }
方案2:仅对指定日期属性配置格式(灵活不影响其他业务)
给 WeddingWizardViewModel 的 WeddingDate 属性添加绑定特性即可:
using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; public class WeddingWizardViewModel { [DataType(DataType.DateTime)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm:ss}", ApplyFormatInEditMode = true)] public DateTime WeddingDate { get; set; } public string Name { get; set; } public string Description { get; set; } }
方案3:自定义模型绑定器(格式校验更严格)
如果需要严格校验日期格式,避免其他格式的日期被误解析,可以自定义绑定规则:
- 新增自定义绑定器类:
using System.Globalization; using Microsoft.AspNetCore.Mvc.ModelBinding; public class GbDateTimeBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext context) { var valueResult = context.ValueProvider.GetValue(context.ModelName); if (valueResult == ValueProviderResult.None) return Task.CompletedTask; context.ModelState.SetModelValue(context.ModelName, valueResult); var dateStr = valueResult.FirstValue; if (DateTime.TryParseExact(dateStr, "dd/MM/yyyy HH:mm:ss", CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out var date)) { context.Result = ModelBindingResult.Success(date); } else { context.ModelState.TryAddModelError(context.ModelName, "日期格式不合法,请选择正确的日期"); } return Task.CompletedTask; } }
- 在属性上指定使用该绑定器:
[ModelBinder(BinderType = typeof(GbDateTimeBinder))] public DateTime WeddingDate { get; set; }
内容的提问来源于stack exchange,提问作者Matthew Warr
相关产品推荐
相关产品推荐

