Jon*_*ing 3 c# asp.net-mvc properties
我创建了一个映射到我的数据库模型的类。属性之一是 StartDate
public DateTime? StartDate { get; set; }
我可以在构建模型时轻松抓住它并将其放置在我的视图中。
我想做的是让视图显示更友好的日期 MM/dd/yyyy。我知道.ToString(MM/dd/yyyy)并尝试使用属性来设置它。我遇到了麻烦,因为数据库被设置为可以为空的 DateTime,我想返回一个字符串。也许我没有使用正确的方法
从数据库中检索的代码
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();
Run Code Online (Sandbox Code Playgroud)
尝试设置值
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; }
}
Run Code Online (Sandbox Code Playgroud)
这抱怨是因为 _StartDate 是 DateTime?价值
以我指定的格式显示日期的最有效方法是什么?
我假设NewsModel是某种视图模型。在这种情况下,您可以使用一些数据注释来装饰您的属性:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime StartDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您需要使用 HTML 帮助程序:
@Html.DisplayFor(m => m.StartDate)
Run Code Online (Sandbox Code Playgroud)
如果您希望在使用任何 HTML 编辑器助手(例如Html.EditorFor, Html.TextBoxFor, ...)时也应用此格式,则还需要ApplyFormatInEditMode = true为该DisplayFormat属性指定。因此,该属性最终将被装饰如下:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime StartDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
更新
因此,在聊天中进行了一些讨论后,似乎 MVC 4 中的注释的行为与 MVC 3 中的有些不同。具体来说,使用上述 MVC 3 的注释,将呈现以下 HTML:
<input class="text-box single-line" id="StartDate" name="StartDate"
type="text" value="11/15/2013" />
Run Code Online (Sandbox Code Playgroud)
但是,对于 MVC 4,有一点不同:
<input class="text-box single-line" id="StartDate" name="StartDate"
type="date" value="11/15/2013" />
Run Code Online (Sandbox Code Playgroud)
请注意,它将输入类型更改为date. 这导致日期选择器自动显示在 Chrome 中,这是不受欢迎的行为。
这里的问题是日期格式将通过 应用Html.EditorFor,而不是通过Html.TextBoxFor. Html.TextBoxFor可以通过 CSS 类来改变行为,但Html.EditorFor没有那种重载。