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

ASP.NET MVC中列表DateTime属性转为dd MMM yyyy格式的问题

问题描述

我在ASP.NET MVC Web应用中,将数据库数据赋值到MyTasks列表。数据库中的start_date以DateTime属性存储,希望在视图中以dd MMM yyyy格式展示。目前通过foreach循环将DateTime转为字符串并赋值给模型新增的格式化属性,但仅第一条记录生效,其余记录的格式化属性为null。

当前代码

IEnumerable<MyTasks> myTasks = (from t in db.TaskMain 
                                join c in db.Customer on t.Customer_Id equals c.Id 
                                join s in db.Services on t.Service_Id equals s.Id 
                                join step in db.ServiceSteps on t.Task_Step_Id equals step.Id 
                                join state in db.ServiceState on t.Task_State_Id equals state.Id 
                                where t.CreateBy == UserId && t.Status == true && t.Task_Step_Id != 12 
                                select new MyTasks 
                                {
                                    Id = t.Id,
                                    Customer_Name = c.Name,
                                    Service = s.Service_NameEng,
                                    Current_Step = step.Service_Step_Primary_Language,
                                    End_Date = t.Service_End_Date,
                                    Start_Date = t.CreatedDate,
                                    Task_Number = t.TaskNumber,
                                    Task_State = state.Service_State_Name
                                }).ToList();

foreach(var item in myTasks) 
{
    myTasks.First().Start_Date_Formated = item.Start_Date.ToString("dd MMM yyyy");
    myTasks.First().End_Date_Formated = item.End_Date.ToString("dd MMM yyyy");
}

问题现象

仅第一条记录格式化生效

错误原因

你在foreach循环中始终使用myTasks.First()赋值,这只会修改列表中第一条元素的属性,循环迭代的item并未被实际使用,因此只有第一条记录的格式化属性有值,其余均为null。

解决方案

方案1:修复foreach循环

直接修改循环迭代的当前对象,替换掉myTasks.First():

foreach(var item in myTasks) 
{
    item.Start_Date_Formated = item.Start_Date.ToString("dd MMM yyyy");
    item.End_Date_Formated = item.End_Date?.ToString("dd MMM yyyy") ?? string.Empty;
}

方案2:LINQ查询时直接生成格式化值

无需后续循环,在select阶段直接完成日期格式化:

IEnumerable<MyTasks> myTasks = (from t in db.TaskMain 
                                join c in db.Customer on t.Customer_Id equals c.Id 
                                join s in db.Services on t.Service_Id equals s.Id 
                                join step in db.ServiceSteps on t.Task_Step_Id equals step.Id 
                                join state in db.ServiceState on t.Task_State_Id equals state.Id 
                                where t.CreateBy == UserId && t.Status == true && t.Task_Step_Id != 12 
                                select new MyTasks 
                                {
                                    Id = t.Id,
                                    Customer_Name = c.Name,
                                    Service = s.Service_NameEng,
                                    Current_Step = step.Service_Step_Primary_Language,
                                    End_Date = t.Service_End_Date,
                                    Start_Date = t.CreatedDate,
                                    Task_Number = t.TaskNumber,
                                    Task_State = state.Service_State_Name,
                                    // 直接生成格式化字符串
                                    Start_Date_Formated = t.CreatedDate.ToString("dd MMM yyyy"),
                                    End_Date_Formated = t.Service_End_Date?.ToString("dd MMM yyyy") ?? string.Empty
                                }).ToList();

方案3:给模型添加计算属性(推荐)

在MyTasks模型中添加只读计算属性,自动完成日期格式化,无需额外赋值:

public class MyTasks
{
    // 原有属性...
    public DateTime Start_Date { get; set; }
    public DateTime? End_Date { get; set; }

    // 自动格式化的计算属性
    public string Start_Date_Formated => Start_Date.ToString("dd MMM yyyy");
    public string End_Date_Formated => End_Date?.ToString("dd MMM yyyy") ?? string.Empty;
}

之后直接在视图中使用@item.Start_Date_Formated即可,无需控制器额外处理。

方案4:在视图中直接格式化(最简洁)

遵循MVC职责分离原则,直接在Razor视图中对DateTime属性格式化:

@foreach(var item in Model)
{
    <tr>
        <td>@item.Start_Date.ToString("dd MMM yyyy")</td>
        <td>@(item.End_Date?.ToString("dd MMM yyyy") ?? "")</td>
        <!-- 其他列 -->
    </tr>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:41