我创建了一个映射到我的数据库模型的类。其中一个属性是StartDate
public DateTime? StartDate { get; set; }
我可以在构建模型时轻松抓住它并将其放在我的视野中。
我想要的是让视图显示更友好的日期MM / dd / yyyy。我知道.ToString(MM/dd/yyyy)
并试图使用属性来设置它。我遇到了麻烦,因为数据库设置为可以为空的DateTime,我想返回一个字符串。也许我没有使用正确的方法
从db
中检索的代码var newsItem = (from n in context.News
where n.NewsID == id
select new Models.Components.NewsModel
{
NewsId = n.NewsID,
Header = n.Header,
MainPhoto = n.MainImage,
Text = n.Text,
Date = n.CreatedDate,
Active = n.Active,
StartDate = n.StartDate,
EndDate = n.EndDate
}).FirstOrDefault();
尝试设置值
private DateTime? _StartDate { get; set; }
public string StartDate
{
get
{
DateTime tmp;
DateTime.TryParse(_StartDate.ToString(), out tmp);
return tmp.ToString("MM/dd/yyyy");
}
set { _StartDate = value; }
}
抱怨因为_StartDate是DateTime?值
以我指定的格式显示日期的最有效方法是什么?
答案 0 :(得分:4)
我认为NewsModel
是某种视图模型。在这种情况下,您可以使用一些数据注释来装饰您的属性:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime StartDate { get; set; }
为了实现这一点,您需要使用HTML帮助程序:
@Html.DisplayFor(m => m.StartDate)
如果要在使用任何HTML编辑器帮助程序(例如Html.EditorFor
,Html.TextBoxFor
,...)时也要应用此格式,还需要指定ApplyFormatInEditMode = true
对于DisplayFormat
属性。因此,该物业最终将被装饰如下:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime StartDate { get; set; }
<强>更新强>
因此,在聊天中进行一些讨论后,似乎MVC 4中的注释与MVC 3的注释略有不同。具体来说,通过上面的MVC 3注释,将呈现以下HTML:
<input class="text-box single-line" id="StartDate" name="StartDate"
type="text" value="11/15/2013" />
但是,对于MVC 4,存在细微差别:
<input class="text-box single-line" id="StartDate" name="StartDate"
type="date" value="11/15/2013" />
请注意,它会将输入类型更改为date
。这导致日期选择器自动显示在Chrome中,这是不受欢迎的行为。
此处的问题是日期格式将通过Html.EditorFor
应用,但不会应用Html.TextBoxFor
。 Html.TextBoxFor
可以传递CSS类来改变行为,但Html.EditorFor
没有那种过载。
有关此问题的可能解决方案,请参阅this answer。
答案 1 :(得分:0)
您可以采用的一种方法是使用Today作为日期值为null的开始日期。从逻辑上讲,这意味着将从今天开始,而不是空字符串,这既困惑又难以理解。