【问题标题】:Date only from TextBoxFor()仅来自 TextBoxFor() 的日期
【发布时间】:2010-12-29 23:41:29
【问题描述】:

我无法使用 TextBoxFor(expression, htmlAttributes) 将 DateTime 的唯一日期部分显示到文本框中。

该模型基于Linq2SQL,字段是SQL 和实体模型中的DateTime。

失败:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

这个技巧似乎被贬低了,对象htmlAttribute中的任何字符串值都被忽略了。

失败:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

我想在详细信息/编辑视图中仅存储和显示日期部分,而不包含“00:00:00”部分。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:
    net Razor problems DateTime
    
    
    Models
    public class UsuarioFecha
    {
           [DataType(DataType.DateTime)]
            [DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
            public DateTime? dateXXX { get; set; }
    }
    
    view
    
    @model proyect.Models.UsuarioFecha
    
       @Html.TextBoxFor(m => m.dateXXX , new { Value = @Html.DisplayFor(m => m.dateXXX ), @class = "form-control", @type = "date" })
    

    【讨论】:

    • 请在您的代码中添加一些解释。不鼓励在 SO 上仅提供代码答案。
    【解决方案2】:

    TL;DR;

    @Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date" })
    

    申请[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")] 不适合我!


    说明:

    date 类型的 html input 元素的日期必须相对于ISO8601 进行格式化,即:yyyy-MM-dd

    显示的日期是根据用户浏览器的区域设置的, 但解析后的值始终是 yyyy-mm-dd 格式。

    我的经验是,语言不是由Accept-Language 标头决定的,而是由浏览器显示语言或操作系统系统语言决定的。

    为了使用Html.TextBoxFor 显示模型的日期属性:

    模型类的日期属性:

    public DateTime DOB { get; set; }
    

    在模型方面不需要其他任何东西。


    在 Razor 中,您可以:

    @Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date" })
    

    【讨论】:

    • 小东西,最后少了花括号
    【解决方案3】:

    如果你坚持使用[DisplayFormat],但你没有使用MVC4,你可以使用这个:

    @Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
    

    【讨论】:

      【解决方案4】:

      您可以使用以下代码以 HH:mm 格式打印时间,在我的情况下 属性类型是 TimeSpan 所以值以 HH:mm:tt 格式 出现,但我必须以上述格式显示,即。 HH:mm

      所以你可以使用这个代码:

      @Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 Bootstrap 日期选择器,则只需添加 data_date_format 属性,如下所示。

              @Html.TextBoxFor(m => m.StartDate, new { 
        @id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
        })
        

        【讨论】:

          【解决方案6】:

          请记住,展示将取决于文化。虽然在大多数情况下所有其他答案都是正确的,但它对我不起作用。如果附加了 jQuery datepicker,文化问题也会导致不同的问题。

          如果您希望通过以下方式强制格式转义/

          @Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")
          

          如果没有为我转义,它会显示 08-01-2010 与预期的 08/01/2010

          如果没有转义,jQuery datepicker 也会选择不同的 defaultDate,在我的例子中是May 10, 2012

          【讨论】:

            【解决方案7】:

            我使用 Globalize,因此可以使用多种日期格式,因此请使用以下格式:

            @Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")
            

            这会根据浏览器的区域设置自动调整日期格式。

            【讨论】:

              【解决方案8】:

              在 ASP.NET Core 中使用标签助手时,需要以 ISO 格式指定格式。如果没有这样指定,绑定的输入数据将无法正确显示,并将显示为没有值的 mm/dd/yyyy。

              型号:

              [Display(Name = "Hire")]
              [DataType(DataType.Date)]
              [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
              public DateTime? HireDate { get; set; }
              

              查看:

              <input asp-for="Entity.HireDate" class="form-control" />
              

              也可以使用 asp-format 属性在视图中指定格式。

              生成的 HTML 如下所示:

              <input class="form-control" type="date" id="Entity_HireDate" 
                  name="Entity.HireDate" value="2012-01-01">
              

              【讨论】:

                【解决方案9】:
                [DisplayName("Start Date")]
                [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
                public DateTime StartDate { get; set; }
                

                然后:

                <%=Html.EditorFor(m => m.StartDate) %>
                

                【讨论】:

                • 是的,因为现在有了 EditorFor 助手并且 MVC2 已完成,您的解决方案就是要走的路
                • 但是现在 Jquery UI datepicker 不能应用于这个输入,因为它忽略了我的 @class="datepicker" 属性,正如 Html.EditorFor() 帮助器所指定的那样。因此,此文本框现在格式正确,但单击时不会启动日期选择器。所以它修复了一件事,破坏了另一件事。
                • 我怎样才能让它按照这个解决方案显示,但也让它像使用 Html.TextboxFor() 一样启动日期选择器
                • 我使用的是 MVC4 Razor 语法,日期字段呈现为@Html.EditorFor(m =&gt; m.IssueDate),模型上的格式应用为[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )],但日期仍显示为01/01/0001 12:00:00 AM
                • @Aaron 没有具有 htmlAttributes 参数的 EditorFor 重载。您可能将它传递给 viewTemplate 参数或其他东西,以为您正在传递 htmlAttributes。这是Editorfor的缺点。 TextBoxFor 忽略 DisplayFormat 注释。 Alexeyss 的解决方案采用不同的格式来解决这个问题。
                【解决方案10】:

                对我来说,我需要保留TextboxFor(),因为使用EditorFor() 会将输入类型更改为最新。其中,在 Chrome 中,添加了一个内置的日期选择器,它搞砸了我已经在使用的 jQuery 日期选择器。因此,要继续使用TextboxFor() 并且只输出日期,您可以这样做:

                <tr>
                    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
                    @{
                        string deliveryDate = Model.DeliveryDate.ToShortDateString();
                    }
                    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
                    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
                </tr>
                

                【讨论】:

                  【解决方案11】:

                  您还可以通过应用此数据注释来使用 HTML 5 属性:

                  [DataType(DataType.Date)]
                  

                  但问题是这为 HTML 5 浏览器启用了特定于浏览器的日期选择器。对于没有支持的浏览器,您仍然需要自己的日期选择器,然后您必须确保您的日期选择器不会出现在浏览器之外(Modernizr 可以轻松地做到这一点),或者隐藏浏览器(如果出现的话)(复杂而且我不知道我看到的方法有多可靠)。

                  最后我选择了 Alex 的,因为我当前的环境没有 Modernizr,但如果有,我会使用它来有条件地仅在浏览器不支持时显示我的数据选择器。

                  【讨论】:

                    【解决方案12】:

                    这对我有用。

                    @Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })
                    

                    【讨论】:

                      【解决方案13】:

                      只需在您的模型旁边添加即可。

                      [DataType(DataType.Date)]
                      public string dtArrivalDate { get; set; }
                      

                      【讨论】:

                        【解决方案14】:

                        当然可以使用 Html.EditorFor。 但是如果你想使用 TextBoxFor 并使用 DisplayFormat 属性中的格式,你可以这样使用它:

                        @Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)
                        

                        或创建下一个扩展:

                        public static class HtmlExtensions
                        {
                            public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
                            {
                                return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
                            }
                        }
                        

                        【讨论】:

                          【解决方案15】:

                          MVC4 通过添加一个新的TextBoxFor 重载解决了这个问题,该重载采用字符串格式参数。您现在可以简单地执行此操作:

                          @Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")
                          

                          还有一个需要 html 属性的重载,因此您可以设置 CSS 类、连接日期选择器等:

                          @Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })
                          

                          【讨论】:

                          • 这是 MVC4 的最佳答案 - 它允许我使用 jquery UI datepicker 并格式化选择这样做:@Html.TextBoxFor(m =&gt; m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
                          • 谢谢!但是 TextBoxFor 忽略模型的 [DisplayFormat] 属性似乎是一个错误。很高兴 TextBoxFor 中至少有一个覆盖(并且您提醒了我)。
                          • 我这样设置 @Html.TextBoxFor(model =&gt; model.CDate, "{0:dd.MM.yyyy}") 但在 httpPost 上我得到的数据类似于 MM.dd.yyyy。如何解决?
                          • 我请你喝啤酒!在我找到这个答案之前,这个小问题让我非常头疼。
                          • 仅供参考Many browsersinput[type=date] spec 需要 "{0:yyyy-MM-dd}" 格式。
                          【解决方案16】:

                          // datePicker 中显示的 datimetime 是 11/24/2011 12:00:00 AM

                          // 你可以用空格分割它并将值设置为仅日期

                          脚本:

                              if ($("#StartDate").val() != '') {
                                  var arrDate = $('#StartDate').val().split(" ");
                                  $('#StartDate').val(arrDate[0]);
                              }
                          

                          标记:

                              <div class="editor-field">
                                  @Html.LabelFor(model => model.StartDate, "Start Date")
                                  @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
                              </div>
                          

                          希望这有帮助..

                          【讨论】:

                          • 您的解决方案应该有效。但以我的拙见,依赖客户端在服务器端发布的格式化字符串日期可能是危险的。如果服务器端的区域设置不包含日期和时间之间的空格,则您公开的解决方案将失败。
                          【解决方案17】:
                          <%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>
                          

                          【讨论】:

                          • EditorFor 解决方案有效,除非您需要覆盖其他 HTML 属性,如 id 或类。这是一个很好的解决方案。奇怪的是 V 必须是大写的。
                          • 为了安全地处理 null,您可以执行 Model.EndDate.GetValueOrDefault().ToString("dd.MM.yyyy")。如果 Model.EndDate 为 null,将显示 Datetime 的默认值。
                          • 关于空值,DateTime 的默认值是 1901 年 1 月 1 日,在我看来,最好使用@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
                          • @Spikolynn,这并没有为我生成第二个“值”属性(MVC3/razor 模板)。
                          • 重要提示:检查“Value”中的大写“V”,小写字母不行!
                          【解决方案18】:

                          模板编辑器仅用于显示目的。 如果您使用相同的编辑器(这很有意义,因为它是一个编辑器)并且您提供了类似 31/01/2010 的值 - 您将收到一条错误消息,指出格式无效。

                          【讨论】:

                            【解决方案19】:

                            DisplayFormat 属性在初始加载时以任何一种形式都不适用于我。我创建了一个 EditorTemplate:

                            <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
                            <%@ Import Namespace="System.Web.Mvc.Html" %>
                            <%=
                                Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>
                            

                            【讨论】:

                              【解决方案20】:

                              或者使用无类型的帮助器:

                              <%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>
                              

                              【讨论】:

                              • 略有变化@Html.TextBoxFor(model =&gt; model.EndDate, "{0:d}", new { type = "date" })
                              • 它确实使用 Razor 而不是 ASPX 视图引擎,但它们都在 MVC 4 中工作,并且从一种语法更改为另一种语法是微不足道的。我在 Razor 上发帖,因为这就是我使用和测试过的。就像我说的,这是一种变体。
                              • @Dan Friedman :这就是我要走的路!我曾经使用编辑器模板,但后来我还必须创建自己的 html,还必须包含所有验证消息和所有 Bootstrap 属性,所以这确实是我要走的路(asp.net mvc5)跨度>
                              • 您能否创建一个新问题并详细说明您所做的工作。标记我,我很乐意提供帮助。
                              • 当您需要全球化时,这个解决方案是最好的。
                              【解决方案21】:

                              不要害怕使用原始 HTML。

                              <input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />
                              

                              【讨论】:

                              • 那时候他怎么发呢?因为日期几乎肯定不会在服务器上被解析回。
                              • 只要您包含正确的 'name="StartDate"',模型绑定器就会选择它。
                              • @DrJokepu 是 MVC3 上唯一为我工作的人。那就是我无论如何都无法制作TextBoxForEditorFor 格式值。请参阅我的问题:TextBoxFor helper mixes day and month in dates
                              猜你喜欢
                              • 1970-01-01
                              • 2015-04-05
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2013-04-03
                              • 1970-01-01
                              相关资源
                              最近更新 更多