ASP.NET MVC在发送到视图之前更改模型数据类型

时间:2012-04-14 12:47:11

标签: asp.net-mvc-3 linq-to-entities

我使用Linq to Entity,从DB

获取模型
 var works = db.Work.Where(a => a.StartDate == DateTime.Now).ToList();

此模型包含一个DateTime,我希望在将其发送到视图之前将其更改为字符串 beacuase需要将其显示为persianDate时间, 像这样:

    foreach (var item in workslist)
                {
                    item.StartDate = "1391/01/01"; //Just For Exapmle as you know this won't work
                }
return View(workslist);

那么有没有办法在强类型模型中更改数据类型?或其他方式执行此操作,除了在我的数据库中将DateTime保存为字符串

2 个答案:

答案 0 :(得分:0)

您可以在控制器中使用函数将日期时间更改为字符串

public string changeDateTimeToPersianString ( DateTime time)
    {
// your code
}

然后你可以从你的View中调用这个函数。

在Razor中

这样的事情

@changeDateTimeToPersianString(workslistitem.StartDate)

答案 1 :(得分:0)

您可以将[DisplayFormat]属性与EditorFor / DisplayFor帮助程序一起使用来格式化数据。

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy/mm/dd}")]
public DateTime StartDate { get; set; }

然后在视图中:

@Html.EditorFor(m => m.StartDate)

或者,您也可以考虑为“工作”域模型定义单独的ViewModel。虽然这种方法会产生更多的代码,但它提供了更多的灵活性,并被视为良好的实践。 以下是示例代码:

public class Work
{
    public DateTime StartDate {get;set;}
}

public class WorkViewModel
{
    public WorkViewModel()
    {
    }

    public string StartDate { get; set; }

    public static WorkViewModel Map(Work domainModel)
    {
        return new WorkViewModel() { 
            //Apply your Date format logic
            StartDate = domainModel.StartDate.ToString("yyyy/MM/dd")
        };
    }
}

在行动方法中:

var works = db.Work.Where(a => a.StartDate == DateTime.Now).ToList();
var workViewModels = new List<WorkViewModel>(works.Count);
foreach (var work in works)
    workViewModels.Add(WorkViewModel.Map(work));

return View(workViewModels);