Есть ли способ предотвратить ошибки нулевого объекта от сложных объектов при обновлении страницы? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть действие контроллера, которое использует TempData для получения сложных объектов из другого действия. Проблема возникает, когда пользователь обновляет страницу и получает нулевые ошибки объекта в представлении. Сложные объекты не передаются через URL, как и другие значения. Есть ли способ предотвратить это? Альтернативным решением было бы удалить все параметры запроса из URL на странице refre sh и отобразить представление, как будто это новый объект.

Controller

public IActionResult Daily(Daily daily)
{
    new ReportDaily().GetAvailableSavedCriteria(out List<ReportCriteria> reportCriteria, out Notification not);

    if (daily.SelectedCriteria == null) {
        //Create daily report object and initialize the default values
        var newModel = new Daily
        {
            PaymentTypes = DGetPaymentTypes(),
            Users = DGetUsers(),
            Criteria = reportCriteria,
            StartDate = DateTime.Today.Date,
            EndDate = DateTime.Today.Date,
            County = true,
            Municipality = true
        };
        return View(newModel);
    }
    else
    {
        daily.PaymentTypes = TempData.Get<List<Daily.PaymentType>>("PaymentTypes") == null ? DGetPaymentTypes() : TempData.Get<List<Daily.PaymentType>>("PaymentTypes");
        daily.Users = TempData.Get<List<Daily.User>>("Users") == null ? DGetUsers() : TempData.Get<List<Daily.User>>("Users");
        daily.Criteria = reportCriteria;
        return View("Daily", daily);
    }
}

1 Ответ

1 голос
/ 17 марта 2020

TempData используется только для одного перенаправления. Чтобы сохранить данные от другого действия после обновления, вы можете использовать Session для его достижения.

Чтобы использовать Session в ядре mvc, вам нужно добавить следующие коды в файл starup.cs:

  • Добавить services.AddSession(); в метод ConfigureServices.
  • Добавьте app.UseSession(); в методе Configure.

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

HttpContext.Session.SetString("PaymentTypes", JsonConvert.SerializeObject(pamentTypeList));

Ежедневное действие:

//.....

daily.PaymentTypes = HttpContext.Session.GetString("PaymentTypes") == null ? DGetPaymentTypes() : JsonConvert.DeserializeObject<List<Daily.PaymentType>> (HttpContext.Session.GetString("PaymentTypes"));
...