ASP.NET MVC делает обновление браузера делает TempData бесполезным? - PullRequest
7 голосов
/ 15 апреля 2010

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

Ответы [ 6 ]

19 голосов
/ 31 октября 2011

Вы должны написать

TempData.Keep("nameofthedata");

в вашем контроллере, тогда он будет сохранять эти данные и в ситуациях обновления.

13 голосов
/ 15 апреля 2010

В MVC 1 да, временные данные теряются после следующего запроса после сохранения ключа.

Однако в MVC 2 временные данные теряются после первой попытки доступа к ним.

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

Из примечаний к выпуску бета-версии MVC 2:

Улучшения TempDataDictionary

Поведение TempDataDictionary класс был немного изменен на сценарии адреса, где временные данные были удалены преждевременно или сохранялась дольше, чем необходимо. За Например, в тех случаях, когда временные данные были прочитайте в том же запросе, в котором это был установлен, временные данные сохранялись для следующего запроса, хотя Намерение было удалить его. В других случаи, временные данные не были сохранены через несколько последовательных перенаправлений.

Для решения этих сценариев Класс TempDataDictionary был изменен так что все ключи выживают до тех пор, пока ключ не будет прочитан из объекта TempDataDictionary. Метод Keep был добавлен в TempDataDictionary, чтобы вы могли указать что значение не должно быть удалено после прочтения. RedirectToActionResult является примером где метод Keep вызывается в Для того чтобы сохранить все ключи для следующий запрос.

Вы также можете посмотреть прямо в источнике MVC 2, чтобы увидеть эти изменения:

MVC 1:

  public object this[string key] {
        get {
            object value;
            if (TryGetValue(key, out value)) {
                return value;
            }
            return null;
        }
        set {
            _data[key] = value;
            _modifiedKeys.Add(key);
        }
    }

MVC 2:

   public object this[string key] {
        get {
            object value;
            if (TryGetValue(key, out value)) {
                _initialKeys.Remove(key);
                return value;
            }
            return null;
        }
        set {
            _data[key] = value;
            _initialKeys.Add(key);
        }
    }
2 голосов
/ 21 апреля 2010

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

1 голос
/ 14 февраля 2013

Tempdata используется при переадресации, поэтому если вы обновляете страницу, это означает, что вы делаете отдельный запрос к серверу, поэтому ваши данные теряются. Чтобы сохранить эти данные, вызовите метод Tempdata.Keep ("KeyofTempdata") в действии, на которое вы перенаправляете. Если вы хотите удалить данные, используйте Tempdata.Remove ("KeyofTempdata").

0 голосов
/ 15 апреля 2010

Единственные функции, которые могут решить вашу проблему - это Cache и Session.

ViewData по существу "умирает" при создании представления.

Если вы можете предоставить более подробную информацию о том, что вы пытаетесь достичь, возможно, может быть предложено другое решение, однако, похоже, что для вас лучше всего использовать Session или Cache.

0 голосов
/ 15 апреля 2010

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

...