У меня вопрос: правильно ли я поступаю, сохраняя данные отчета в TempData?
Нет, абсолютно нет. Сохраните что-нибудь в TempData тогда и только тогда, когда вы сразу после этого перенаправляете, так как TempData переживает только одно перенаправление. Если вы сохраните что-то в TempData в своем действии GET и затем отобразите представление, AJAX-запрос, например, из этого представления, уничтожит TempData, и вы не вернете значения обратно в свой запрос POST.
Правильный шаблон следующий (нет TempData
вообще):
public ActionResult Report(DateTime? date)
{
if (!date.HasValue)
{
date = DateTime.Now;
}
// Clear the ModelState so that the date is displayed in the correct format as specified by the DisplayFormat attribute on the model
ModelState.Clear();
// Expensive call to database to retrieve the report data
ReportModel model = DataAdapter.Convert(this.reportService.GetReport((DateTime)date));
return View(model);
}
[HttpPost]
public ActionResult Report(ReportModel model)
{
if (ModelState.IsValid)
{
return RedirectToAction("Report", new { date = model.Date });
}
else
{
// Redisplay the view, the user inputted value for date will be loaded from ModelState
// TODO: query the database/cache to refetch any fields that weren't present
// in the form and that you need when redisplaying the view
return View(model);
}
}
(1) Сделайте еще один вызов на сервисном уровне из действия HttpPost
(Я бы предпочел не делать еще один вызов базы данных из-за проверки
невозможность просто перерисовать форму, так как она кажется неэффективной). Я предполагаю, что я
может реализовать кэширование на уровне службы, чтобы избежать базы данных
туда и обратно ...
Это именно то, что вы должны сделать. И если у вас есть проблемы с оптимизацией этих запросов или опасения поразить вас или что-то в каждом POST-запросе, кешируйте эти результаты. В настоящее время базы данных гипероптимизированы и предназначены именно для этого (не злоупотребляйте, конечно, определяйте индексы по соответствующим столбцам, и производительность должна быть хорошей). Но, конечно, кэширование - лучший способ избежать попадания в базу данных, если у вас очень требовательный веб-сайт с большим количеством запросов и пользователей.
(2) Используйте скрытые вводы в форме (юк!).
Юк, я согласен, но мог бы работать в ситуациях, когда их у вас не много.
(3) Постоянно хранить последний просмотренный отчет в сеансе.
Нет, избегайте сессии. Сессия - враг масштабируемых приложений без сохранения состояния.