Следующий вид настройки работает, но это не правильное использование 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) и перенаправить приложение обратно в индекс?