在ASP.NET MVC(3)中格式化模型属性的最佳位置在哪里?

时间:2011-09-23 10:47:11

标签: asp.net-mvc asp.net-mvc-3

我最近一直在寻找ASP.NET MVC框架中的最佳实践,特别是关注的问题。我的问题是,如果我在模型上有属性,那么在该属性上进行格式化的最佳位置在哪里?

我考虑了几个选项但不确定哪个是最好的。该示例使用DateTime。对不起,这有点长了。

选项1: 在视图中:@Model.TheDate.String("{0:'blah'dd/MM/yyyy}") 我知道这不对,因为格式字符串不应该在这里(如果我想在整个应用程序中更改格式,那该怎么办)

选项2: 视图中使用的扩展方法:@Model.TheDate.DisplayItNicePlease() 这种方式很有意义,因为视图正在选择用于格式化的扩展方法,而viewmodel只是将date属性公开给视图。不确定视图或视图模型是否应该负责格式化。

选项3: 在Html Helper方法中,例如Where should I place Declarative HTML helpers in ASP.NET MVC 3之类的东西,你可以使用:

@Html.DisplayDateNice(Model.TheDate)

选项4: 视图模型上的额外属性,用于格式化它并返回一个字符串,例如:

public string TheDateStr
{
    get
    {
        return TheDate.DisplayItNicePlease();
    }
}

然后在视图中你只有

@Model.TheDateStr

与选项3非常相似,只是它保持视图真实,非常简单 - 视图只是输出模型中的内容而不关心数据的格式。

选项5: DisplayFormat属性,例如: 在视图模型上:

[DisplayFormat(DataFormatString = "{0:'blah'dd/MM/yyyy}")]
public DateTime TheDate { get; set; }

然后在视图上:

@Html.DisplayFor(m => m.TheDate)

我喜欢这个,除了格式字符串不会被重复使用,所以请带上选项5 ...

选项6: 某种自定义DisplayFormatAttribute例如NiceDateDisplayFormatAttribute。 在我看来,这可能是最好的解决方案,如果您只想要一个简单的字符串格式化,那么效果很好。我认为如果你想要更复杂的东西会变得更复杂,例如显示相对时间(Calculate relative time in C#),在这种情况下,最好是在扩展方法/ html助手中。

我可能还有其他方法甚至不知道......

2 个答案:

答案 0 :(得分:3)

如果将大量使用此类型格式或在模型中添加额外属性以返回原始属性的格式化版本,请使用扩展助手格式化类型。

答案 1 :(得分:1)

对于单个视图,我个人使用选项5:将其放在视图模型中。 如果日期格式用于多个页面,则可以创建html帮助程序扩展名以格式化日期。所以在视图中,你会有像

这样的东西
@Model.TheDate.ToDateString()

但总的来说,我仍然更喜欢option5,因为我为每个页面创建了视图模型,只是在其上抛出了一个DisplayFormat属性。