Как заставить DateTime связываться с RazorPages ViewModel? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть проект ASP Core 2.2, который использует RazorPages, я связываю некоторые данные, некоторые из которых я отправляю клиенту, клиент должен отредактировать эти данные там, где это необходимо, перед отправкой обратно.

Этоработает для всего отлично, пока я не хочу связать объект DateTime.Данные привязаны к локальному элементу управления datetime HTML, как и ожидалось, и в соответствии с сетевым трафиком они отправляются обратно в данные формы запросов POST, однако объект DateTime в OnPost всегда читается как 01/01/0001

Я уже проверил это в других браузерах на случай возникновения проблем.FireFox даже не отображает datetime-local правильно (это просто текстовое поле, а не средство выбора даты).

Я также попытался отправить объект DateTime как локальное и время UTC, и я установил свою культуру наen-GB, где я нахожусь.

Мой код для этого следующий:

RequestLocalizationOptions localizationOptions = new RequestLocalizationOptions
{
    SupportedCultures = new List<CultureInfo> { new CultureInfo("en-GB") },
    SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-GB") },
    DefaultRequestCulture = new RequestCulture("en-GB")
};

app.UseRequestLocalization(localizationOptions);

StartAt устанавливается для каждой строки как:

StartAt = DateTime.Now.ToUniversalTime(),

и привязывается к представлению следующим образом:

<input asp-for="@Model.CreationData.DataLines[lnNo].StartAt" class="form-control"/>

Весь связанный объект:

public class JobCreationData
{
    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    public int SelectedJobWorkflow { get; set; }

    public List<JobCreationDataLine> DataLines { get; set; } = new List<JobCreationDataLine>();

    public class JobCreationDataLine
    {
        public int WorkflowVersionId { get; set; }
        public string WorkflowVersionCode { get; set; }
        public string WorkflowVersionDescription { get; set; }

        public int SelectedWorkCenterId { get; set; }

        public DateTime StartAt;

        public List<JobCreationBusinessUnit> BusinessUnits { get; set; }
    }

    public class JobCreationBusinessUnit
    {
        public int WantedBusinessUnitId { get; set; }
        public int BusinessUnitId { get; set; }
        public string Alias { get; set; }
        public bool IsRequired { get; set; }

        public int SelectedBusinessUnitLineId { get; set; }
    }
}

Ниже приведены снимки экрана, на которых показан элемент управления HTML5, результат привязанного объекта недействителени данные формы, отправляемые в OnPost.

BindingIssue FormData

Как вы можете видеть, я ожидаю, что DateTime будет правильно связываться.

Есть идеи?

1 Ответ

0 голосов
/ 21 декабря 2018

По вашему запросу я напишу его как ответ.

Поле StartAt должно быть преобразовано в свойство с помощью метода установки и получения:

public DateTime StartAt { get; set; }

Вы можетесделайте свой код еще дальше, сделав пользовательскую модель подшивки .

Представьте, что вы работаете с различными DateTime форматами и культурами, и вы хотите, чтобы все ваши значения были в определенном форматекогда они представлены на сервер.Вместо того, чтобы делать это вручную везде, вы можете написать это один раз как переплет и позволить ему позаботиться об этом за вас.

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