2015-02-02 4 views
0

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

У объекта есть довольно много полей, поэтому нередко многократно сохранять и убеждать пользователя в сохранении их данных. Мы показываем сообщение «Сохранено успешно» с помощью 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 будут вокруг жизни текущего запроса, и только следующий запрос (или пока элемент не будет удален явно) и является лучшим местом для размещения данных, которые вы хотите передать другое представление, к которому вы будете перенаправлять.

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

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

+1

Это хороший вопрос о Azure и Get. Чтобы быть в безопасности, я предпочитаю передавать необязательный параметр в метод Redirect, а не использовать TempData. Мне будет интересно посмотреть, что публикуют другие. –

+0

По умолчанию TempData основан на сеансе, но вы можете предоставить пользовательскую реализацию TempDataProvider, которая может хранить параметры в URL, Cookies или где-то еще –

+0

Neil, добавляет ли дополнительный параметр в URL-адрес? Если да, и я добавляю этот URL-адрес, не приведет ли сообщение «сохранено успешно» к каждому открытию этой закладки? –

ответ

1

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

В 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).