You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文化但未解决。

问题根源

  1. 请求本地化中间件未启用:仅在ConfigureServices中配置了文化选项,但未在Configure方法中启用中间件,导致文化设置未生效。
  2. EditorFor与type="date"的兼容性:EditorFor未正确将格式化后的日期值传递给type="date"的input控件,浏览器无法识别格式导致提交时无法绑定。
  3. 视图中线程文化设置冗余且无效:视图中手动设置线程文化无法覆盖请求级别的文化配置,且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;
}

验证步骤

  1. 启动项目,打开Create1页面,确认日期控件默认显示当前日期(格式为yyyy-MM-dd)。
  2. 提交表单,在控制器的[HttpPost] Create1方法中检查test.TrDate的值,确认已正确绑定提交的日期。

内容的提问来源于stack exchange,提问作者Lisa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:27:09