在ASP.NET MVC 3 Razor视图中,使用其他方式代替@Html.DisplayFor。

3

我是asp.net mvc3的新手。由于asp.net mvc3使用的约定,修改单个代码真的很混乱和困难。我试图仅以格式5 Sep 1999显示BirthDate的日期,而不是显示日期和时间。在Edit.cshtml中,使用datepicker选择日期并将值保存在只有日期的数据库中是可以的。但是,我有一个Data类型为Date的BirthDate列,当在Details.cshtml中使用@Html.DisplayFor(model => model.BirthDate);时,会显示日期和时间。在谷歌上搜寻后,我找到并实现了以下代码以按所需格式显示日期:

@Model.BirthDate.ToString("dd MMM YYYY");

并且

@Html.DisplayFor(model => model.BirthDate.ToString("dd MMM YYYY"));

它报错了,没有1个参数的重载方法。进一步说,我可以这样使用:
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
pubilc DateTime BirthDate { get; set }

我使用了Entity Framework的模型优先方法。在我的情况下,我应该在哪里实现上述DisplayFormat属性?又或者,有什么razor语法可以在Details.csthml中以正确的方式显示日期?

4个回答

1

好的,我知道我在回复一个8个月前发布的问题,但我的唯一意图是,这可能对未来参考此问题的其他人有用。
我也是MVC的新手,我也遇到了类似的问题,我需要显示日期而不是时间,以下方法对我有效。

不要使用@Html.DisplayFor(),而是使用<span>
因此,对于问题中提到的情况,代码应该像这样:

<span>@String.Format("{0:D}", model.BirthDate)</span>

Output: Sunday, September 05, 1999 

不需要添加额外的类/文件进行格式化。

0

根据我的看法,第三种方法是最好的方式,因为:

  1. 你的演示模型处理了UI的所有方面,而你的视图没有不必要和冗余的格式化代码,特别是如果你重用属性。
  2. 可以进行单元测试。
  3. 如果重用模型,则在不同页面上保持一致。

你还可以编写一个帮助方法来格式化日期,并在所有演示/视图模型中始终使用它。

public string FormattedDate(this DateTime dateTime)
{
  return dateTime.ToString("dd MMM YYYY");
}

谢谢您的回复。我对mvc3完全不熟悉,您能否告诉我如何在我的情况下实现helper? - CodeManiac
只需创建一个名为ViewFormatter/FormatHelper的类,放入所需的方法,然后在您的视图或模型中引用此命名空间即可。 - Baz1nga

0

我喜欢使用一种装饰器模式来处理这种情况。 假设您的模型类名为MyModel。 然后像这样定义一个包装类:

public class MyModelDecorator 
{
    public MyModel BaseItem { get; set; }

    [DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
    public DateTime BirthDate { get; set; }

    public MyModelDecorator(MyModel baseItem)
    {
        BaseItem = baseItem;
    }
}

然后在你的视图中,你可以引用基础模型属性或修饰过的属性。

@Html.DisplayFor(m => m.BirthDate)
@Html.DisplayFor(m => m.BaseItem.SomeOtherProperty)

如果有比这更好的解决方案,我真的很想听听它...

好的,我不知道如何使用。我已经创建了名为Decorator的文件夹,并在其中创建了MyModelDecorator.cs文件。现在,在视图中,我有一个引用@model IVRControlPanel.Decorator.MyModelDecoratorMyModel属性没有绑定,但是BirthDate属性被检测到。或者,我做错了什么。 - CodeManiac
@CodeManiac 在这个例子中,MyModel 不是属性名称,而是 BaseItem。不过你可以随意命名。 - McGarnagle
我并没有说它的属性名。在我的场景中,我有一个用户类(作为MyModel),并且有像用户名、电子邮件、密码等属性。这些属性没有绑定到我的视图上。 - CodeManiac
@CodeManiac 对的... 你必须使用 MyModel.BaseItem.username 等等。如果你想作为 MyModel.username 访问它们,那么你需要将它们添加到装饰器类中。 - McGarnagle

0

对于任何ASPX用户,sumbad的答案都有所帮助,但这是您应该这样做的方法:

<%=Html.Enconde(String.Format("{0:D}", item.yourDate))%>

希望这能帮助到某个人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接