MVC4 DataType.Date EditorFor不会在Chrome中显示日期值,在Internet Explorer中也不错

Ben*_*kel 197 asp.net-mvc editorfor asp.net-mvc-4

我在我的模型中使用DataType.Date属性,在我的视图中使用EditorFor.这在Internet Explorer 8Internet Explorer 9中运行良好,但在谷歌浏览器中它显示日期选择器,而不是显示值,它只是在褪色的灰色文本中显示"月/日/年".

为什么Google Chrome不会显示价值?

模型:

[DataType(DataType.Date)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图:

<td class="fieldLabel">Est. Pur. Date</td>
<td class="field">@Html.EditorFor(m=>m.EstPurchaseDate)</td>
Run Code Online (Sandbox Code Playgroud)

铬

IE浏览器

Dar*_*rov 374

[DataType(DataType.Date)]在ASP.NET MVC 4中使用默认模板修饰模型属性时,会生成以下输入字段type="date":

<input class="text-box single-line" 
       data-val="true" 
       data-val-date="The field EstPurchaseDate must be a date."
       id="EstPurchaseDate" 
       name="EstPurchaseDate" 
       type="date" value="9/28/2012" />
Run Code Online (Sandbox Code Playgroud)

支持HTML5的浏览器(例如Google Chrome)会使用日期选择器呈现此输入字段.

为了正确显示日期,必须将值格式化为2012-09-28.从规范中引用:

value: [RFC 3339]中定义的有效完整日期,附加限定年份组件是四位或更多位数,表示大于0的数字.

您可以使用以下DisplayFormat属性强制执行此格式:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 达林谢谢你,那太棒了!在过去的两年里,你已经回答了我的许多MVC问题,你摇滚! (44认同)
  • 对于标记为"[DataType(DataType.Date)]"的所有属性,"全局"这样做的方法是什么?所以我不必单独标记所有这些属性,而忽略一些属性的风险? (7认同)
  • 达林,美国以外的人可以做些什么呢?如何设置规格值但显示自定义日期格式?即英国? (7认同)
  • 很好的答案,但我觉得这是有吸引力的你必须强制它只是为了让控件正常工作! (3认同)
  • @ MarjanVenema-我使用了Matt Honeycutt的FailTracker(https://github.com/MattHoneycutt/Fail-Tracker)的"ExtensibleModelMetadataProvider".在Infrastructure文件夹下查看ModelMetadata.我已经使用了这些类,然后创建了IModelMetadataFilter的过滤器实现.调用TransformMetadata方法后,您可以编辑元数据的"DisplayFormatString"和"EditFormatString"属性.希望这能让你朝着正确的方向前进(顺便说一下,有一个很棒的复数视频使用失败跟踪器) (3认同)
  • @ppumkin:这不是美国特有的.事实上,HTML5规范使用"YYYY-MM-DD"的原因是因为它是一个国际标准(ISO 8601).如果需要以不同的格式显示日期,则需要在视图中使用视图模型,以便可以将表单的日期格式设置为ISO 8601,但是将详细视图的日期格式设置为无论你想要的本地化版本是什么. (2认同)
  • Chrome中显示的格式是系统全球化设置中设置的任何格式。因此,是的,按照ISO 8601中的示例设置所有内容,但请确保将系统设置为正确的Globale。链接后,请确保重新启动Chrome,Firefox ..不确定IE或其他浏览器。 (2认同)
  • @MarjanVenema - 我已经连接到模型元数据,我将它添加到DisplayFormatString和EditFormatString. (2认同)

Cha*_*lie 42

在MVC5.2中,将Date.cshtml添加到文件夹〜/ Views/Shared/EditorTemplates:

@model DateTime?
@{
    IDictionary<string, object> htmlAttributes;
    object objAttributes;
    if (ViewData.TryGetValue("htmlAttributes", out objAttributes))
    {
        htmlAttributes = objAttributes as IDictionary<string, object> ?? HtmlHelper.AnonymousObjectToHtmlAttributes(objAttributes);
    }
    else
    {
        htmlAttributes = new RouteValueDictionary();
    }
    htmlAttributes.Add("type", "date");
    String format = (Request.UserAgent != null && Request.UserAgent.Contains("Chrome")) ? "{0:yyyy-MM-dd}" : "{0:d}";
    @Html.TextBox("", Model, format, htmlAttributes)
}
Run Code Online (Sandbox Code Playgroud)


Arj*_*jan 16

作为Darin Dimitrov回答的补充:

如果您只希望此特定行使用某种(不同于标准)格式,则可以在MVC5中使用:

@Html.EditorFor(model => model.Property, new {htmlAttributes = new {@Value = @Model.Property.ToString("yyyy-MM-dd"), @class = "customclass" } })
Run Code Online (Sandbox Code Playgroud)


Azo*_*oro 11

在MVC 3中,我不得不添加:

using System.ComponentModel.DataAnnotations;
Run Code Online (Sandbox Code Playgroud)

在添加属性时使用:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
Run Code Online (Sandbox Code Playgroud)

特别是如果你像我这样在.edmx文件中添加这些属性.我发现默认情况下.edmx文件没有这个使用,所以只添加propeties是不够的.


小智 10

如果您[DataType(DataType.Date)]从模型中删除,则Chrome中的输入字段type="datetime"将呈现为,并且也不会显示日期选择器.