TempData ["message"] ненадежна - что я делаю не так? - PullRequest
3 голосов
/ 26 мая 2010

Я использую TempDate["Message"], чтобы показывать небольшие баннеры обновлений, когда пользователь делает на моем сайте такие вещи, как это:

[AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Admins")]
public ActionResult Delete(int id)
{
    _Repo.DeletePage(id); // soft-delete

    TempData["Message"] = "Page deleted!";
    return RedirectToAction("Revisions", "Page", new { id = id });
}

Тогда на моей главной странице у меня есть это:

<%-- message box (show it only if it contains a message) --%>
<% string Message = (TempData["Message"] ?? ViewData["Message"]) as string; 

   if(!string.IsNullOrEmpty(Message)){
       %>
       <div id="message"><%:Message %></div>
   <% }

   TempData["Message"] = null; ViewData["Message"] = null; %>

Я ударил и TempData, и ViewData, потому что где-то читал, что TempData следует использовать для перенаправлений, а ViewData следует использовать в противном случае.

Проблема в том, что часто сообщение не появляется сразу. Иногда для отображения сообщения требуется один или два клика по разным частям сайта. Это очень странно

Есть идеи?

Ответы [ 5 ]

2 голосов
/ 28 июня 2010

Вы должны проверить все места, где вы используете TempData["Message"] в вашем коде. Соответствует ASP.NET MVC делает обновление браузера делает TempData бесполезным? Вы можете прочитать TempData["Message"] только один раз (см. Также http://forums.asp.net/p/1528070/3694325.aspx). Во время первого использования TempData["Message"], TempData["Message"] быть удаленным из внутреннего TempDataDictionary.

Вероятно, было бы лучше использовать TempData["Message"] только внутри действия Revisions контроллера Page, а не внутри главной страницы или внутри представления.

2 голосов
/ 28 июня 2010

TempData не предназначен для передачи данных в представления, отсюда и название ViewData для этой цели. На самом деле я не могу придумать причину использовать TempData из определения представления вообще ...

Одним из наиболее распространенных случаев использования TempData является передача информации между действиями контроллера, когда вы выполняете перенаправление (например, действие Revisions в вашем примере выше может использовать вашу переменную TempData["Message"]).

Это обычная практика в средствах PRG кодирования взаимодействий MVC (Post-Redirect-Get), так как вам часто нужно передавать информацию из исходного целевого действия при выполнении Redirect to Get. Пример того, как это может быть полезно в Get, приведен ниже, где я часто просто по умолчанию использую новую модель представления, ЕСЛИ БЕЗ ее уже передали из перенаправления в TempData:

public ActionResult System() {
   SystemAdminVM model = (SystemAdminVM)TempData["screenData"] ?? new SystemAdminVM();

Еще одна вещь; Я вижу, как вы явно очищаете записи словаря TempData и ViewData в своем представлении. Вам не нужно этого делать, так как к этому моменту они все равно заканчивают свою жизнь ...

Удачного кодирования!

0 голосов
/ 13 августа 2010

Если вы настроили несколько рабочих процессов для своего приложения, но режим состояния сеанса - «InProc», то вы не можете использовать реализацию TempData по умолчанию, поскольку состояние сеанса становится непригодным для использования. (см. Состояние сеанса ASP.NET и несколько рабочих процессов )

Вместо этого можно попробовать использовать MvcFutures CookieTempDataProvider .

0 голосов
/ 30 июня 2010

Это пахнет, как будто вам нужна пара юнит-тестов, чтобы подтвердить поведение, которое вы видите. Попробуйте написать пару, используя этот пример в качестве отправной точки:

http://weblogs.asp.net/leftslipper/archive/2008/04/13/mvc-unit-testing-controller-actions-that-use-tempdata.aspx

0 голосов
/ 22 июня 2010

Поведение вашего приложения такое, которое вы ожидаете, если используете TempData там, где вы должны использовать ViewData.

Вы хотите перепроверить, что вы храните свои отзывы о состоянии в TempData только , когда контроллер выполняет перенаправление. В противном случае вам следует использовать ViewData.

...