Тип данных MVC4.Date EditorFor не будет отображать значение даты в Chrome, отлично в Internet Explorer
Я использую тип данных.Атрибут даты на моей модели и EditorFor на мой взгляд. Это работает нормально в Internet Explorer 8 и Internet Explorer 9, но в Google Chrome он показывает выбор даты и вместо отображения значения он просто отображает "месяц/день/год" в выцветшем сером тексте.
почему Google Chrome не отображает ценность?
модель:
[DataType(DataType.Date)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }
View:
<td class="fieldLabel">Est. Pur. Date</td>
<td class="field">@Html.EditorFor(m=>m.EstPurchaseDate)</td>
8 ответов:
когда вы украшаете свойство модели с
[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" />
браузеры, поддерживающие HTML5, такие как Google Chrome, отображают это поле ввода с помощью средства выбора даты.
чтобы правильно отобразить дату, значение должно быть отформатировано как
2012-09-28
. Цитата из спецификация:значение: действительная полная дата, как определено в [RFC 3339], с дополнительным квалификация, что компонент года состоит из четырех или более цифр представляет число больше 0.
вы можете применить этот формат с помощью :
[DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public Nullable<System.DateTime> EstPurchaseDate { get; set; }
в MVC5.2 Добавьте дату.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) }
в дополнение к ответу Дарина Димитрова:
Если вы только хотите, чтобы эта конкретная строка использовала определенный (отличный от стандартного) формат, вы можете использовать в MVC5:
@Html.EditorFor(model => model.Property, new {htmlAttributes = new {@Value = @Model.Property.ToString("yyyy-MM-dd"), @class = "customclass" } })
в MVC 3 мне пришлось добавить:
using System.ComponentModel.DataAnnotations;
среди использований при добавлении свойств:
[DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
особенно если вы добавляете эти свойства .файл edmx, как и я. Я нашел это по умолчанию .файлы edmx не имеют этого, поэтому добавление только propeties недостаточно.
Если убрать
[DataType(DataType.Date)]
из вашей модели, поле ввода в браузере Chrome отображается какtype="datetime"
и не будет показывать datepicker либо.
У меня все еще была проблема с передачей формата yyyy-MM-dd, но я обошел ее, изменив дату.cshtml:
@model DateTime? @{ string date = string.Empty; if (Model != null) { date = string.Format("{0}-{1}-{2}", Model.Value.Year, Model.Value.Month, Model.Value.Day); } @Html.TextBox(string.Empty, date, new { @class = "datefield", type = "date" }) }
ответ тип данных MVC4.Date EditorFor не будет отображать значение даты в Chrome, отлично в IE
в модели вам нужно иметь следующий тип объявления:
[DataType(DataType.Date)] public DateTime? DateXYZ { get; set; }
или
[DataType(DataType.Date)] public Nullable<System.DateTime> DateXYZ { get; set; }
вам не нужно использовать следующие атрибуты:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
на сегодняшний день.cshtml использовать этот шаблон:
@model Nullable<DateTime> @using System.Globalization; @{ DateTime dt = DateTime.Now; if (Model != null) { dt = (System.DateTime)Model; } if (Request.Browser.Type.ToUpper().Contains("IE") || Request.Browser.Type.Contains("InternetExplorer")) { @Html.TextBox("", String.Format("{0:d}", dt.ToShortDateString()), new { @class = "datefield", type = "date" }) } else { //Tested in chrome DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat; dtfi.DateSeparator = "-"; dtfi.ShortDatePattern = @"yyyy/MM/dd"; @Html.TextBox("", String.Format("{0:d}", dt.ToString("d", dtfi)), new { @class = "datefield", type = "date" }) } }
удачи! С уважением, Блертон
Если вам нужно иметь контроль над форматом даты (другими словами, не только формат yyyy-mm-dd является приемлемым), другим решением может быть добавление вспомогательного свойства типа string и добавление валидатора даты к этому свойству и привязка к этому свойству в пользовательском интерфейсе.
[Display(Name = "Due date")] [Required] [AllowHtml] [DateValidation] public string DueDateString { get; set; } public DateTime? DueDate { get { return string.IsNullOrEmpty(DueDateString) ? (DateTime?)null : DateTime.Parse(DueDateString); } set { DueDateString = value == null ? null : value.Value.ToString("d"); } }
и вот дата проверки:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] public class DateValidationAttribute : ValidationAttribute { public DateValidationAttribute() { } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value != null) { DateTime date; if (value is string) { if (!DateTime.TryParse((string)value, out date)) { return new ValidationResult(validationContext.DisplayName + " must be a valid date."); } } else date = (DateTime)value; if (date < new DateTime(1900, 1, 1) || date > new DateTime(3000, 12, 31)) { return new ValidationResult(validationContext.DisplayName + " must be a valid date."); } } return null; } }