【问题标题】:Display a formatted date in a TextBoxFor()在 TextBoxFor() 中显示格式化的日期
【发布时间】:2013-04-03 08:29:33
【问题描述】:

我正在使用 MVC4 和 Entity Framework 来开发 Intranet Web 应用程序。我有一个可以编辑的人员列表。当我访问编辑视图时,在“开始日期”文本框中,日期显示如下:7/11/2013 00:00:00。我要做的是以 yyyy/MM/dd 格式显示它。我尝试了String.Format("{0:yyyy/MM/dd}", item.StartDate),但它不起作用。我也尝试了注释[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")],但它也不起作用。

在我看来,我有这个:

<div class="editor-field">
        @Html.TextBoxFor(model => model.StartDate, new { @class = "datepicker" })
        @Html.ValidationMessageFor(model => model.StartDate)
    </div>

你知道怎么做吗?

【问题讨论】:

标签: c# asp.net-mvc date


【解决方案1】:
@Html.TextBoxFor(m => m.StartDate, 
    new { @Value = Model.StartDate.ToString("yyyy/MM/dd"), @class="datepicker" })

【讨论】:

  • 太好了,谢谢!不要像我一样用小写的 v 写 @value :-s 否则你会扯掉你的头发。
  • 这对我没用,但 Maxime 的回答对我有用 :)
  • 在我的情况下这有效:@Value = Model.StartDate.ToShortDateString()
  • 这对我不起作用,直到我注意到我使用的是 EditorFor,而不是 TextBoxFor。一旦我改变了它,它就很好用。
  • 对于数据库的可空日期,不要忘记 ? : @Html.TextBoxFor(m => m.StartDate, new { @Value = Model.StartDate?.ToString("yyyy/MM/dd"), @class="datepicker" })
【解决方案2】:

您的问题要求EditorFor(),但您提供的代码使用TextboxFor()。

在您的 Model(例如 MyModel.cs)中,您应该:

public class MyModel
{
    [DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }
}

在您的视图(例如 Index.cshtml)中,您只需像编写它一样使用它:

@Html.EditorFor(m => m.StartDate, new { htmlAttributes = new { @class = "datepicker" } })

它按预期工作。

通过这样做(而不是改变它在视图中的显示方式),您可以在其他地方重用您的模型,而不必指定如何在视图中显示日期。因此,如果由于某种原因,您必须更改显示格式,您只需更改一次即可。

该解决方案也适用于 MVC 5。

【讨论】:

  • 这是一个很好的答案。比公认的答案更好。虽然请注意,为了在 Chrome 中工作,日期格式字符串需要为 yyyy-MM-dd
  • 啊,诀窍是在自定义属性周围添加 htmlAttributes。很高兴知道。谢谢。
  • 更好的答案,应该是视图模型!
  • thnx ,但这个答案删除了 Datepicker :( 它只是文本框格式
  • @Tuta 这个答案不会删除任何东西。在您的具体情况下,它可能不完整,您可能需要对其进行调整以适应您的情况。
【解决方案3】:

对我来说最简单的是添加 type 属性,

@Html.EditorFor(model => model.FechaRegistro, new { htmlAttributes = new { @class = "form-control oso" ,@type = "date"  } })

【讨论】:

    【解决方案4】:

    Html.EditorFor 也可以工作


    @Html.EditorFor(model => model.StartDate, new { htmlAttributes = new { @class = "datepicker", @Value = model.StartDate.ToString("yyyy/MM/dd") } })
    

    【讨论】:

    • 请注意,我必须创建“值”部分:@Value = model.StartDate.Date.ToString("yyyy-MM-dd") 才能显示我的值(并在我有可空日期时使用 .Data.Value.ToString("yyyy-MM-dd"))。
    【解决方案5】:

    我是这里的菜鸟(也使用 MVC),这只是 Maxime 使用部分类的一种变体...

    如果您有一个 DB-first 模型并且不想直接更改它,因为害怕丢失您的更改,只需在您自己的部分类中执行相同的操作。只需在您的模型文件夹中添加一个新的类/文件,并确保它使用与您生成的模型相同的命名空间。

    以下是您如何声明元数据以格式化日期和修改另一个值的显示名称(即:缩写表中的列标题)

    namespace MyProjectName.Models
    {
    
        public class MyModelMeta
        {
    
            [DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]  // format used by Html.EditorFor
            public DateTime StartDate;
    
            [Display(Name = "User ID")] // abbreviation shown in Html.DisplayNameFor
            public string SomeReallyLongUserIDColumn;
    
        }
    
        [MetadataType(typeof(MyModelMeta))]
        public partial class MyModel
        {
    
        }
    }
    

    【讨论】:

    • 您的回答没有回答原始问题。不仅如此,您正在使用自己的问题并提供一个真正离题的答案。我没有否决您的答案,但您应该调整或删除它。
    • 实际上,Maxime,它提供了一个将日期格式应用于 EditorFor 的示例,与您的做法非常相似。但是,如果您使用的是 Database First 模型并选择更新该模型,您的代码将会被破坏。我的示例使用了一个简单的短日期格式“d”,我展示了它在这个类中的结构以及另一列。我想我可以将我的日期列重命名为“StartDate”,但我想人们会明白的......
    • 现在我明白你的意思了。也就是说,我仍然认为您应该根据上下文调整您的答案,并在您的 Contacts (带有“s”?)类中添加几行以使其更加清晰。当我使用 Model-First 时,我必须这样做。我切换到 Code-First 并且不会回去! :-)
    • 另外,当你说“这只是一个扩展 [...]”时,我以为你指的是 Extension Methods。因此,您的代码与接受我的回答和创建扩展无关。这就是我感到困惑的地方。
    【解决方案6】:

    试试这个.. 将日期值转换为 textboxfor.. 中的 htmlAttribute 可以解决您的问题

    <div class="editor-field">
        @Html.TextBoxFor(model => model.StartDate, new { htmlAttributes = new { @Value = Model.StartDate.ToString("yyyy/MM/dd"), type = "date"  }})
        @Html.ValidationMessageFor(model => model.StartDate)
    </div>
    

    【讨论】:

    • 你不能抛出一个代码块作为答案,而不给出你为什么这样编码的解释和线索。
    • 对不起,我没有想到。我已经添加了一个简短的解释,希望现在可以了。
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多