Html.Hidden для форматов DateTime неправильно в ASP.NET - PullRequest
7 голосов
/ 15 марта 2012

Я пишу приложение ASP.NET MVC3 на C # и обнаружил, что вызов Html.HiddenFor, на мой взгляд, будет отображать DateTime иначе (и неправильно), чем если бы я должен был вызвать Html.DisplayFor.

Модель, которая принимает значение, имеет декоратор DisplayFormat, и это похоже на Html.DisplayFor. Рассматриваемое свойство записывается как:

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

И представление отображает это, используя:

 @Html.DisplayFor(model => model.MeetingStartDate)
 @Html.HiddenFor(model => model.MeetingStartDate)

Вызов DisplayFor отобразит дату как 16/04/2012, однако HiddenFor отобразит ее как value="04/16/2012 00:00:00".

Я пытался изменить текущую культуру, чтобы установить DateTimeFormat, но это не имело никакого эффекта.

Текущая культура - en-GB, поэтому в любом случае не следует печатать даты en-US.

Ответы [ 5 ]

23 голосов
/ 30 сентября 2014

Альтернатива in-view с использованием TextBoxFor будет работать, если вы укажете формат даты и скрытый атрибут html.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" })
8 голосов
/ 16 марта 2012

Если вы хотите создать скрытое поле, которое соответствует формату, который вы определили, вы можете определить собственный шаблон редактора, чтобы переопределить шаблон по умолчанию (~/Views/Shared/EditorTemplates/HiddenInput.cshtml):

@if (!ViewData.ModelMetadata.HideSurroundingHtml) 
{
    @ViewData.TemplateInfo.FormattedModelValue
}
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue)

и теперь вы украшаете свойство модели атрибутом [HiddenInput]:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
[HiddenInput(DisplayValue = false)]
public DateTime MeetingStartDate { get; set; }

и по вашему мнению:

@Html.DisplayFor(model => model.MeetingStartDate)
@Html.EditorFor(model => model.MeetingStartDate)

, который будет использовать правильный формат для скрытого значения:

<input data-val="true" data-val-required="The MeetingStartDate field is required." id="MeetingStartDate" name="MeetingStartDate" type="hidden" value="15/03/2012" />
4 голосов
/ 05 июля 2012

Или вы можете перехитрить реализацию HiddenFor и использовать вместо нее TextBoxFor и вручную установить type = "hidden" .

Примерно так:

public static MvcHtmlString HiddenInputFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
{
  IDictionary<string, object> htmlAttributesTmp = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
  if (htmlAttributesTmp.ContainsKey("type"))
  {
    htmlAttributesTmp["type"] = "hidden";
  }
  else
  {
    htmlAttributesTmp.Add("type", "hidden");
  }

  return html.TextBoxFor(expression, htmlAttributesTmp);
}
0 голосов
/ 21 августа 2013

если вы даете id, то проблема не возникает

<%= Html.TextBoxFor(model => Model.DiscountRate,new {  @id = "DiscountRate", @Value=Model.DiscountRate})%>
0 голосов
/ 15 марта 2012

В вашей модели для функции Get свойства MeetingStartDate вы можете вернуть отформатированный DateTime?

DisplayFormat не будет работать для скрытых значений, поскольку MVC создает значение в скрытом поле, которое можетбыть правильно проанализирован во время действия отправки формы из данных, которые в настоящее время установлены для свойства.

Что у вас есть ожидаемые действия MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...