Как сохранить набор данных между вызовами MVC - PullRequest
2 голосов
/ 24 марта 2009

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

В моем домашнем контроллере у меня есть действие Index, которое показывает, каким участникам нужно создать буквы:

Function Index() As ActionResult
    Dim members = GetMembersFromSomeLongRunningQuery()
    TempData("members") = members
    Return View(members)
End Function

В представлении Index у меня есть ссылка для создания букв:

<%=Html.ActionLink("Create Letters", "CreateLetters", "Home")%>

Вернувшись в контроллер Home, у меня есть функция CreateLetters для обработки этого:

Function CreateLetters() As ActionResult
    Dim members = TempData("members")
    For Each member In members
        '[modify member data regarding the letter]
    Next
    TempData("members") = members
    Return RedirectToAction("Letter", "Home")
End Function

Наконец, есть представление «Письмо», которое создает настоящие буквы. ContentType - это «application / msword», поэтому данные на самом деле появляются в Word, а не в браузере.

Как я уже сказал, это прекрасно работает с первого раза. Однако, поскольку буквы появляются в Word, когда пользователь возвращается в браузер, они все еще находятся на экране со ссылкой «Создать письма». Если они попытаются ударить его снова (т. Е. Замятие бумаги после первой попытки), они получат ошибку в CreateLetters, потому что TempData ("members") теперь пуста. Я знаю, что именно так работает TempData (одиночные запросы), поэтому я пытаюсь от него отказаться.

Как бы это было изменено для использования ViewData? В качестве альтернативы, как можно одновременно отобразить страницу Letter (т.е. документ Word) и перенаправить приложение обратно в индекс?

Ответы [ 3 ]

1 голос
/ 24 марта 2009

Я бы просто получил объект снова в другом представлении, но почему бы не кэшировать объект при первом получении

Function Index() As ActionResult
    Dim members = GetMembersFromSomeLongRunningQuery()

// Pseudo code (am a C# man sorry)
    Cache.Remove("MembersItem")
    Cache.Add(members,"MembersItem", CacheExpiry....)

    TempData("members") = members
    Return View(members)
End Function


Function CreateLetters() As ActionResult
    Dim members = Cache.Get("MembersItem")

    For Each member In members
        '[modify member data regarding the letter]
    Next
    TempData("members") = members
    Return RedirectToAction("Letter", "Home")
End Function

Вам также следует рассмотреть возможность кэширования результатов запроса в течение указанного времени или сделать его зависимым от обновления. Вы также можете использовать объект сеанса, если это пользовательские данные.

1 голос
/ 13 января 2010

TempData предназначен для хранения данных при перенаправлении, а ViewData предназначен для передачи данных в представление. Ни то, ни другое не подходит для того, чего вы пытаетесь достичь, хотя TempData можно заставить работать таким образом, создав метод расширения, который вы можете вызвать в действии Letter (а также заменив TempData ("members") = members строка в CreateLetters)

using System.Web.Mvc;

namespace GoFetchV2.ExtensionMethods
{
    public static class TempDataExtensions
    {
        public static void Keep( this TempDataDictionary tempData, string key )
        {
            var value = tempData[ key ];
            tempData[ key ] = value;
        }
    }
}

Используется как ...

Function CreateLetters() As ActionResult
    Dim members = TempData("members")
    ' Do something with members but want to keep it for the next action '
    TempData.Keep("members")
    Return RedirectToAction("Letter", "Home")
End Function

Function Letter() As ActionResult
    Dim members = TempData("members")
    ' Do something with members but want to keep it for the next action '
    TempData.Keep("members")
    ' Return the msword binary data '
End Function
0 голосов
/ 24 марта 2009

Не могли бы вы просто вставить это в переменную приложения? Применение ( "члены")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...