Скажите действиям/контроллерам сохранять TempData

Я понимаю, что TempData предназначен для работы только между одностраничным запросом. Но я думаю, что есть ситуация, которая, я думаю, нарушает предполагаемую функциональность.

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

Есть ли в MVC способ сказать: «Этот контроллер/действие выходит за рамки обычных запросов страниц» и, следовательно, либо сохранить TempData, либо полностью удалить себя из жизненного цикла TempData?

Богатый


person kim3er    schedule 03.11.2009    source источник
comment
Вы почти наверняка неправильно используете TempData. TempData предназначен только для редиректов. Если вы используете его для перенаправления, изображения не будут проблемой, потому что запрос HTML должен предшествовать запросам изображений. Поскольку вы говорите, что запросы изображения делают мешают TempData, я делаю вывод, что вы используете его вне контекста перенаправления. См. blogs.teamb.com/craigstuntz/2009/01/23/37947 для более полного объяснения.   -  person Craig Stuntz    schedule 03.11.2009
comment
Спасибо за ответ. Вы правы в том, что я не использую TempData для перенаправления, но я не согласен с тем, что TempData предназначен только для перенаправления. Я очень рад, что ошибся, но я использую TempData для передачи данных между сообщениями одной и той же страницы. Я не хочу использовать ViewData, так как не буду вставлять информацию в HTML.   -  person kim3er    schedule 03.11.2009
comment
Тогда это твоя проблема. Одним из доказательств того, что я сказал выше, является тот факт, что то, что вы сейчас делаете, не работает. Только в случае перенаправления у вас есть любая уверенность в том, каким будет следующий запрос. Единственным надежным решением будет правильное использование TempData.   -  person Craig Stuntz    schedule 03.11.2009
comment
Поправьте меня, если я ошибаюсь, но теория перенаправления - это только ваша интерпретация, мне не удалось найти документацию, подтверждающую это. Я согласен с тем, что ограничение использования TempData перенаправлениями предотвратило бы конфликты, которые мы обсуждаем, но надлежащее тестирование также может защитить вас. В любом случае, спасибо за ваш вклад.   -  person kim3er    schedule 04.11.2009
comment
Помимо того факта, что TempData просто не работает ни для каких других целей, я обсуждал это в частном порядке с членом команды MVC после того, как предложил переименовать TempData в RedirectData во время исходной бета-версии MVC. (Ответ, по сути, был таким: «Это лучшее название, но уже слишком поздно в бета-цикле, чтобы выпускать такое критическое изменение».)   -  person Craig Stuntz    schedule 04.11.2009


Ответы (3)


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

using System.Web.Mvc;

namespace K3R.Web.Mvc.Filters {
    public sealed class PersistTempDataAttribute : ActionFilterAttribute {
        public PersistTempDataAttribute() { }

        public override void OnActionExecuting(ActionExecutingContext filterContext) {
            var tempData = filterContext.Controller.TempData;
            if (tempData == null || tempData.Count == 0)
                return;

            string[] keys = new string[tempData.Keys.Count];
            tempData.Keys.CopyTo(keys, 0);
            foreach (var key in keys)
                tempData[key] = tempData[key];
        }
    }
}

Будем признательны за любые отзывы о лучшем решении.

Богатый

person kim3er    schedule 03.11.2009
comment
Я не думаю, что полностью исключить контроллер из жизненного цикла возможно. Вы можете применить свой PersistTempDataAttribute либо ко всему контроллеру, либо к одному методу. Помните, что метод OnActionExecuting выполняется «до» вашей фактической функции, а метод OnActionExecuted выполняется «после» вашей функции. Однако хранение информации за рамками одного запроса лучше хранить в базе данных или любой другой системе кэширования. - person Sebastian; 03.11.2009
comment
Абсолютно, я полностью согласен. Я просто не хотел расстраивать существующий код, использующий TempData, включением контроллера изображений. Я признаю, что использование отдельного контроллера для доставки вспомогательных элементов, таких как изображения, вероятно, не лучший вариант в этом сценарии. - person kim3er; 03.11.2009
comment
Похоже, MVC2 теперь изменил способ работы TempData. Теперь он сохраняется до тех пор, пока данные не будут использованы. - person kim3er; 10.03.2010

Я не уверен в точном ответе на этот вопрос, так как сам новичок в MVC. Тем не менее, я слышал, что у людей возникают проблемы с запросами AJAX, уничтожающими TempData, прежде чем они этого хотят.

Я думаю, вы могли бы реализовать свою собственную систему на основе сеанса для хранения этой информации?

Я уверен, что кто-то еще скоро даст вам более полный ответ!

person Chris Roberts    schedule 03.11.2009
comment
Я добавляю контроллеры изображений в рабочий процесс, который уже использует TempData, я бы предпочел не раскачивать лодку. По этой причине я работаю над атрибутом, который сохраняет TempData. Я знаю, что это противоречит цели TempData, но я рассматриваю эти вспомогательные контроллеры как особый случай. Спасибо за вашу помощь. - person kim3er; 03.11.2009

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

Как это:

        return File(imageBytes, imageType);

Вы получаете байты из хранилища данных или где-то еще.

Надеюсь, поможет

person mare    schedule 03.11.2009
comment
Действие изображения работает, меня интересует влияние действия на TempData. - person kim3er; 03.11.2009