Является ли TempData лучшим местом для хранения успешно/неуспешно сохраненного сообщения?

Я реализую ASP.NET MVC post/redirect/getpattern на веб-сайте Azure. Когда пользователь создает новый объект, он перенаправляется из представления создания в представление редактирования с новым идентификатором объекта как частью URL-адреса.

Объект имеет довольно много полей, поэтому нередко приходится сохранять несколько раз, и чтобы убедить пользователя в том, что его данные сохраняются, мы показываем сообщение «Успешно сохранено» с использованием javascript.

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Branch branch, int orgs)
    {
        if (ModelState.IsValid)
        {
            // model is valid, save it and redirect to edit
            _branchRepository.Save(branch);
            TempData["Message"] = new NotificationViewModel(NotificationSeverity.Success, 
                                  "Saved", 
                                  "Saved successfully");
            return RedirectToAction("Edit", new { id = branch.Id });
        }

        // model is invalid, don't save it, let them have another go
        TempData["Message"] = new NotificationViewModel(NotificationSeverity.Warning, 
                              "I'm sorry, Dave.", 
                              "I'm afraid I can't do that.");
        ModelState.Clear();
        return View("Edit", branch);
    }  

Мое понимание TempData заключается в том, что любые данные, хранящиеся в TempData, будут храниться в течение всей жизни только для текущего запроса и следующего запроса (или до тех пор, пока элемент не будет удален явно), и это лучшее место для размещения данных, которые вы хотите передать другому представлению, которое вы будет перенаправлен на.

Является ли TempData лучшим местом для этого сообщения?

Примечание. Я читал, что если вы балансируете нагрузку на свои веб-серверы, у вас должны быть включены фиксированные сеансы. Включает ли Azure Sticky Sessions автоматически или вам нужно настроить это вручную?


person Derek Tomes    schedule 02.02.2015    source источник
comment
Это хороший вопрос об Azure и Get. Чтобы быть в безопасности, я обычно передаю необязательный параметр в метод Redirect, а не использую TempData. Мне будет интересно посмотреть, что другие постят.   -  person Neil Thompson    schedule 03.02.2015
comment
По умолчанию TempData основан на сеансе, но вы можете предоставить собственную реализацию TempDataProvider, которая может хранить параметры в URL, файлах cookie или где-то еще.   -  person Sławomir Rosiek    schedule 03.02.2015
comment
Нил, необязательный параметр заканчивается в URL-адресе? Если это так, и я добавляю этот URL-адрес в закладки, не приведет ли это к тому, что сообщение «сохранено успешно» будет отображаться каждый раз, когда я открываю эту закладку?   -  person Derek Tomes    schedule 03.02.2015


Ответы (1)


Сохранение сообщения проверки между запросами при использовании шаблона PRG в TempData, на мой взгляд, является наиболее популярным использованием TempData. Кроме того, вы можете написать несколько фильтров действий, которые автоматически сохранят все состояние модели в tempdata, если вы вернете результат перенаправления, и переместите эти данные из tempdata в modelstate/viewstate, если вы вернете представление на этапе получения.

В MVC Contrib есть два таких фильтра: http://mvccontrib.codeplex.com/SourceControl/latest#src/MVCContrib/Filters/ModelStateToTempDataAttribute.cs http://mvccontrib.codeplex.com/SourceControl/latest#src/MVCContrib/Filters/TempDataToViewData.cs

Данные, хранящиеся в TempData, удаляются после завершения запроса, в котором они были прочитаны, пока вы не вызовете TempData.Keep(key).

person Sławomir Rosiek    schedule 02.02.2015