ASP.NET Core MVC提交后TrDate显示01-01-0001问题求助
ASP.NET Core MVC DateTime字段提交后变为默认值问题解决
问题背景
模型中TrDate字段为DateTime类型,仅需存储日期数据,已配置DisplayFormat并在控制器初始化当前日期,但表单提交后TrDate值变为01-01-0001 12:00:00 AM,已尝试配置en-US文化但未解决。
问题根源
- 请求本地化中间件未启用:仅在
ConfigureServices中配置了文化选项,但未在Configure方法中启用中间件,导致文化设置未生效。 EditorFor与type="date"的兼容性:EditorFor未正确将格式化后的日期值传递给type="date"的input控件,浏览器无法识别格式导致提交时无法绑定。- 视图中线程文化设置冗余且无效:视图中手动设置线程文化无法覆盖请求级别的文化配置,且ASP.NET Core中应通过中间件处理文化。
解决方案
1. 启用请求本地化中间件
在Startup.cs的Configure方法中添加请求本地化中间件,确保文化配置生效:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件(如UseStaticFiles、UseRouting等)... // 启用请求本地化,必须放在UseMvc之前 app.UseRequestLocalization(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
2. 替换EditorFor为TextBoxFor以确保格式正确
type="date"的input控件要求值为yyyy-MM-dd格式,使用TextBoxFor可直接指定输出格式,避免EditorFor的格式丢失问题:
@Html.TextBoxFor(model => model.TrDate, "{0:yyyy-MM-dd}", new { @type = "date", @id = "TrDateInput", @class = "form-control" })
3. (可选)使用DateOnly类型替代DateTime(.NET 6+)
若仅需日期数据,推荐使用.NET 6+引入的DateOnly类型,更贴合业务需求:
模型修改:
public class MasterM { [Key] public int ID { get; set; } public DateOnly TrDate { get; set; } }
控制器初始化:
public ActionResult Create1() { var model = new MasterM(); model.TrDate = DateOnly.FromDateTime(DateTime.Now.Date); return View(model); }
视图代码:
@Html.TextBoxFor(model => model.TrDate, "{0:yyyy-MM-dd}", new { @type = "date", @id = "TrDateInput", @class = "form-control" })
4. 移除视图中的冗余文化设置
删除视图中的线程文化设置代码,由请求本地化中间件统一处理:
@{ // 移除以下冗余代码 // CultureInfo usCulture = new CultureInfo("en-US"); // System.Threading.Thread.CurrentThread.CurrentCulture = usCulture; // System.Threading.Thread.CurrentThread.CurrentUICulture = usCulture; }
验证步骤
- 启动项目,打开
Create1页面,确认日期控件默认显示当前日期(格式为yyyy-MM-dd)。 - 提交表单,在控制器的
[HttpPost] Create1方法中检查test.TrDate的值,确认已正确绑定提交的日期。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

