【问题标题】:Format DateTime in MVC4 via Properties通过属性在 MVC4 中格式化 DateTime
【发布时间】:2013-11-28 07:26:53
【问题描述】:

我创建了一个映射到我的数据库模型的类。属性之一是 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();

尝试设置值

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?价值

以我指定的格式显示日期最有效的方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc properties


    【解决方案1】:

    我假设NewsModel 是某种视图模型。在这种情况下,您可以使用一些数据注释来装饰您的属性:

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime StartDate { get; set; }
    

    为了让它工作,你需要使用 HTML 帮助器:

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

    如果您想在使用任何 HTML 编辑器助手时也应用此格式(例如 Html.EditorForHtml.TextBoxFor、...),您还需要为 DisplayFormat 属性指定 ApplyFormatInEditMode = true .因此,该物业最终将被装饰如下:

    [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.TextBoxForHtml.TextBoxFor 可以通过 CSS 类来改变行为,但 Html.EditorFor 没有那种重载。

    有关此问题的可能解决方案,请参阅this answer

    【讨论】:

    • 这很有意义,但是,当我绑定到它时,它不喜欢尝试转换 StartDate = n.StartDate,
    • 无法隐式转换类型“System.DateTime?”到“字符串”
    • linq to entity 无法识别 .ToString()
    • @JonHarding 哦,那是我的错误,对不起。属性类型应为DateTime(如果与您的数据库架构匹配,则可能为DateTime?)。
    【解决方案2】:

    您可以采取的一种方法是在日期值为空时使用今天作为开始日期。从逻辑上讲,这意味着将从今天开始而不是空字符串,这既令人困惑又难以理解。

    【讨论】:

    • StartDate 是从数据库中提取的,它不是今天日期的表示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多