2011-10-09 141 views
2

我有一个显示客户详细信息的视图。ASP.Net MVC剃刀视图 - 使用出生日期查找年龄

我想根据出生日期显示年龄。

我尝试了一些这样的事情。

@Html.DisplayTextFor(model => DateTime.Now.Date.Subtract(model.DOB)) 

其中model.DOB有一个像1985年7月23日12:00:00 AM

一个值,给我一个错误

模板只能用于具有字段访问权限,属性访问权限,单维数组索引或单参数自定义索引器表达式。

你能帮我一下,我可以如何显示年龄与我的出生日期。

回答

1

哟ü可以这样做

@{ 
var date=DateTime.Now.Date.Subtract(Model.DOB); 

@Html.DisplayTextFor(model =>date.Years); 
} 
+0

Jayanth,当我尝试你的方式我得到这个值9574.00:00:00为日期7/23/1985 12:00:00上午 – HaBo

+0

看到我编辑了代码 –

+0

它给编译错误,但下面的代码为我工作。谢谢您的意见。那帮助了我。 @ { var age = DateTime.UtcNow.Year - Model.DOB.Year; 年龄: @ Html.DisplayTextFor(model => age); } – HaBo

1

这里有两个问题:

  1. 这个逻辑应该你的观点之前进行。您的视图模型应该有一个Age属性,因为这就是您真正想要显示的内容。该属性应该由控制器填充。
  2. 计算某人的实际年龄可能会非常棘手,因为您可能不想根据他们活着的365天的年数从字面上显示该人的年龄。

    public class MyViewModel 
    { 
        ... 
        public TimeSpan Age {get;set;} 
    } 
    

    然后使用the correct method来计算,当你创建模型别人的年龄:

    var model = new MyViewModel 
          { 
           ... 
           Age = CalculateAge(person.DOB, DateTime.Now) 
          }; 
    

    然后修改您的视图代码

所以,你应该通过修改你的模型开始:

@Html.DisplayTextFor(model => model.Age) 
+0

请使用'DateTime.UtcNow'计算人的年龄。你不想依赖于当前的服务器时间,你会吗?)? –

+0

@MariusSchulz:其实,理想情况下,我会使用依赖注入为我提供一个'IUserDateTimeProvider'实现,它查看用户的时区首选项。它比'DateTime。*'更容易测试,我不喜欢假装世界仍围绕着格林威治(对女王陛下的尊重)。;-) – StriplingWarrior

+0

这也非常好 - 但'DateTime.Now'不是(这是我试图做的唯一的一点)。 –

2

首先,弄清楚如何计算年龄: Calculate age in C#

然后该代码添加到您的视图模型作为新属性(或填充它,当你设置你的视图模型)。

public int Age { get{ 
    DateTime now = DateTime.Today; 
    int age = now.Year - DOB.Year; 
    if (DOB > now.AddYears(-age)) age--; 
    return age; 
}} 

然后使用该属性,而不是:

@Html.DisplayTextFor(model => model.AGE)