Обратная передача формата даты и времени недопустима ModelState

У меня возникла проблема с использованием атрибута DisplayFormat в свойстве Datetime во время проверки обратной передачи.

Чтобы было ясно, это не главная проблема, но я хотел бы понять, как заставить его работать без "взлома" или просто обсудить этот вопрос (в случае, если это "нормальное" поведение).

Допустим, у меня есть некоторые даты в БД (например, 17. 10.2014, 12:00:00) для отображения в форме. Я использую DataType(Datatype.Date) а также DisplayFormat(...) атрибуты, но когда я отправляю обратно свою форму, я получаю недействительным ModelState из-за формата Datetime.

- файл класса MyModel (.cs)

namespace Package.To.Models {
    public class MyModel 
    {
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0: dd/MM/yyyy}", ApplyFormatInEditMode = true]
        public Datetime myDate { get; set; }

        ...other properties
    }
}

--cshtml файл

  @model Package.To.Models.MyModel

    @using (Html.BeginForm()) {

    @Html.ValidationSummary(true)

    <fieldset>
        <div class="editor-label">
            @Html.LabelFor(model => model.myDate) 
        </div>
        <div class="editor-field">
            <!-- displayed with the good format eg. 17/10/2014 -->
            @Html.EditorFor(model => model.myDate)
        </div>

        <input type="submit" value="Ok" class="button"/>
    </fieldset>
}

Файл --controller (.cs)

[HttpPost]
public ActionResult calledWhenSubmit(MyModel model)
{
  // invalid model.myDate: 1/1/0001 12:00:00 AM

  var errors = ModelState
               .Where(x => x.Value.Errors.Count > 0)
               .Select(x => new { x.Key, x.Value.Errors })
               .ToArray();
  // errors.Errors[0].ErrorMessage: "The value '17/10/2014' is not valid for myDate"
  // errors.Errors[0].Exception._COMPlusExceptionCode: -532462766

  if (ModelState.IsValid) // returning false
  {
    ...some code
  }
  return View();
}

Похоже, что если я удалю DisplayFormat(...) У атрибута все отлично работает (кроме того, что отображаемая дата в неверном формате в форме).

Я нашел много сообщений о проблемах Datetime и ModelState для SO, но ничего в конфигурации не было так просто, как я получил, так что я все слышал о том, что мне не хватает

1 ответ

У меня такая же проблема. Хотя вы установили DateFormatString но проверка контроллера не понимает этот формат, он понимает формат культуры. Вы должны изменить это в Startup.cs Метод ConfigureServices, добавив следующий код:

 var cultureInfo = new CultureInfo("en-US");
 CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
 CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
Другие вопросы по тегам