Почему TempData конвертирует long [] в int [] - PullRequest
0 голосов
/ 06 декабря 2018

ModelView ...

public class FieldIndexViewModel
{
    //Field Field { get; set; } //maybe?
    public long Id { get; set; }

В моем контроллере c # у меня есть "Id", который напечатан как long.Это все хорошо.

        // store our fieldlist ids for prev and next iterations
        long[] tempData = FieldIndexViewModels.Select(s => s.Id).ToArray();
        TempData["FieldList"] = tempData;

        return View(FieldIndexViewModels);
    }

В моем методе get FieldList изменяется на int, поэтому приведенное ниже не выполняется с ошибкой предиката.Исходные данные показывают, что теперь это int/int32.

    // GET: Fields/Edit/5
    [Authorize]
    public async Task<IActionResult> Edit(long? id, int? tn, int? workPy)
    {
        // grab field list from tempdata
        List<long> FieldList = new List<long>();
        if (TempData.ContainsKey("FieldList"))
        {
            long[] ids = (long[])TempData["FieldList"];

            List<long> temp = ids.ToList(); ;

            FieldList.AddRange(temp);
        }

Почему TempData меняет их и где?Они показывают долго в сырых данных прежде, чем начальный метод существует.

enter image description here

Хорошо enter image description here

Плохо enter image description here

Тот же класс ... не перезаписан, за исключением строки 315, которая теперь является новой, поэтому я могу продолжать кодирование (просто приведение int32 к long) сейчас

enter image description here

**** Совершенно новое ядро ​​ASP WebApp **** Та же проблема?!?

enter image description here

1 Ответ

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

TempData, по умолчанию в ASP.NET Core, сериализуется в файлы cookie как BSON.

К сожалению, при сохранении long[] как BSON (или JSON) не запоминаются типы - поэтому массивlongs и массив int выглядят одинаково.К сожалению, механизм десериализации является несовершенным с точки зрения определения подходящего типа для десериализации как.

Таким образом, вместо этого лучше всего использовать массив пользовательского типа (например, Bob с публичной long собственностью).Затем сериализуйте / закодируйте массив как строку JSON и сохраните эту строку в TempData (в этом случае это будет кодировка JSON в BSON!). На пути чтения вам, очевидно, потребуется JSON-декодирование string из TempData перед его использованием.

...