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
相关产品推荐
相关产品推荐

