ASP.NET MVC 2: сессия или TempData на главной странице? - PullRequest
0 голосов
/ 12 октября 2010

У меня есть div на моей главной странице, который отображается, только если Session ["message"] содержит данные:

<%
    if (!String.IsNullOrEmpty(Session["message"].ToString()))
    {
%>        
        <div id="sessionMessage" class="sessionMessage"><%:Session["message"].ToString()%></div>
<%
    }
%>  

Я использую его для передачи общей информации пользователям как об успешном, так и об неудачном действии.

Я проверил его на сбоях, и он прекрасно работает. Просто установите Session ["message"] в блоке catch и верните новый экземпляр представления:

{ 
   //Invalid - redisplay with errors
   Session.Add("message", "That object already exists.  Please try again.");
   return View(new DetailViewModel());            
}

Проблема: Однако, для случаев успеха, которые включают RedirectToAction, сессия ["message"] всегда очищается к тому времени, когда я попадаю на главную страницу:

//Send message to view for user to see
Session.Add("message", "Object added.");

//Redirect to the details
return RedirectToAction("Details", new { id = viewModel.MyObject.ObjectId });

Я подумал о переходе на TempData, но он выдает ошибку нулевой ссылки при начальной загрузке страницы. Я предполагаю, что это потому, что TempData является членом класса Controller, а мастер-страница не имеет контроллера как такового?

Ответы [ 2 ]

3 голосов
/ 12 октября 2010

Хорошо использовать TempData на главной странице.Но если TempData["message"] не содержит ничего, то вызов .ToString() для него выдаст исключение нулевой ссылки.Session и TempData ведут себя одинаково в этом отношении.Это принципиальное отличие состоит в том, что TempData очищается при прочтении, а Session - нет.Так что вы, скорее всего, вероятно увидите проблему с TempData, но ваш код имеет такую ​​же потенциальную ошибку с любым из них.

0 голосов
/ 12 октября 2010

Я настоятельно рекомендую вам использовать TempData для всех пользовательских функций оповещения и уведомлений.

Сеанс может сохраняться вечно, пока TempData очищается после его чтения или если вы используете MVC 1 после загрузки следующей страницы.Использование сеанса означает, что вы можете дать пользователю запутанное сообщение об ошибке, которое вы забыли удалить.

...