В. Возможно ли иметь поле Datetime в качестве ключа к таблице в asp.net-mvc-core? - PullRequest
0 голосов
/ 17 ноября 2018

Если да, (в чем я сейчас сомневаюсь), пожалуйста, предоставьте детали.Мой тест подробно описан здесь, мне действительно нужна помощь.

Формат даты сервера - дд / мм / гггг.

Определение для таблицы Тест:

CalendarDate    datetime2(7)    Key
Name            nvarchar(50)
BirthDate       datetime2(7)

Данные2018-04-15 00: 00: 00.0000000 Джо 2018-04-15 00: 00: 00.0000000

Test.cs

 public partial class Test
    {
    public DateTime CalendarDate { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
    }

Context.cs

  modelBuilder.Entity<Test>(entity =>
        {
            entity.HasKey(e => new { e.CalendarDate });
            entity.Property(e => e.CalendarDate).HasColumnType("datetime2(7)");

            entity.Property(e => e.Name).HasMaxLength(50);
            entity.Property(e => e.BirthDate).HasColumnType("datetime2(7)");
        });

Scaffolded контроллер и представления были созданы.Примечание. Никакого другого форматирования не было добавлено.

Примечание: CalendarDate (ключ) был добавлен в индексное представление для ясности.

Указатель:

Указатель

КалендарьДата Имя Дата рождения

15/04/2018 12:00:00 Джо 15/04/2018 12:00:00 AM Редактировать | Подробности | Удалить

Примечание в представлении индекса

<a asp-action="Edit" asp-route-id="@item.CalendarDate">Edit</a>  

не находит запись, но

@Html.ActionLink ("Редактировать", "Редактировать", new {CalendarDate = item.CalendarDate})

делает, если идентификатор изменяется на CalendarDate в контроллере.

Редактировать отображение:

CalendarDate 15.04.2008 00:00:00 Имя Joe BirthDate 2018-04-15T00: 00: 00.000

Примечание: CalendarDate (ключ) был добавлен в Edit View для ясности.

Также обратите внимание: Формат отображается как ММ / ДД / ГГГГ.Обновление не удалось.

Создание работ.Если я создаю 01/01/2018, а затем Редактирую, обновление Редактирование работает.

IE работает, только если день и месяц равны.

Есть ли у кого-нибудь образец рабочей функции, гдеКлюч это поле даты и времени, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Спасибо Ясу Икеде за следующее: Проблема в том, что в URL есть '/'. В индексном представлении я изменил ссылку с:

<a asp-action="Edit" asp-route-id="@item.CalendarDate">Edit</a>

до

<a asp-action="Edit" asp-route-id="@item.CalendarDate.ToString("o")">Edit</a>

Это исправляет проблему с маршрутизацией, и Редактирование теперь работает нормально.

Также см. Следующие сведения о проблемах / исправлениях составного ключа.

Разработка первого ключа даты и времени. Мой контроллер леса находит ММ / дд / гггг вместо дд / мм / гггг

и

MVC 5 Формат даты отображается как ММ / дд / гггг в Редактировать, когда я хочу дд / ММ / гггг

0 голосов
/ 18 ноября 2018

Это происходит не потому, что id является DateTime, а потому, что id содержит символы косой черты (/). Даже когда они кодируются, они декодируются и распознаются как символы косой черты в URL, тогда как кодировка действует в строке запроса, которая является частью после ? в URL.

Следовательно, <a asp-action="Edit" asp-route-id="@item.CalendarDate">Edit</a> генерирует URL-адрес, подобный /Model/Edit/2%2F3%2F2018%2012%3A00%3A00%20AM, и фактически распознается как /Model/Edit/2/3/2018 12:00:00 AM, и веб-приложение не может найти соответствия на карте маршрута.

С другой стороны, @Html.ActionLink("Edit", "Edit", new { CalendarDate = item.CalendarDate }) работал, потому что он генерирует URL, например Model/Edit?CalendarDate=03%2F03%2F2000%2001%3A00%3A00. В этом случае он направляется на Model/Edit, и контроллер получает значение CalendarDate.


Одним из решений является избавление от /{id?} из следующей строки в Startup.cs.

app.UseMvc(routes =>
{
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

итак, будет выглядеть

app.UseMvc(routes =>
{
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}");
});

затем вы увидите, что URL для ссылки редактирования будет сгенерирован как /Model/Edit?id=2%2F3%2F2018%2012%3A00%3A00%20AM, где значение даты и времени находится в строке запроса и не декодируется, так что оно правильно передается в контроллер.


Если вы не хотите изменять функциональность маршрутизации, другое решение - изменить весь код, как показано ниже

<a asp-action="Edit" asp-route-id="@item.CalendarDate">Edit</a>

до

<a asp-action="Edit" asp-route-id="@item.CalendarDate.ToString("o")">Edit</a>

.ToString("o") преобразует значение даты и времени в формат ISO 8601. В этом формате не используются символы косой черты, поэтому нет проблем с его отображением в URL.

К счастью, где изменить не так много. Только три места в Index.cshtml и одно в Details.cshtml. Вы можете заменить регулярное выражение (@[^.]+\.CalendarDate) с заменой $1.ToString("o").

Таким способом вы можете уменьшить количество изменений, сравнивая с @Html.ActionLink("Edit", "Edit", new { CalendarDate = item.CalendarDate }), потому что это решение не требует каких-либо изменений в контроллере.

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