以下设置类型的工作,但它不是正确使用TempData,并在第一次使用后失败。我怀疑我应该使用ViewData,但我正在寻找一些正确的指导。
在我的家庭控制器中,我有一个索引操作,显示哪些成员需要创建字母:
Function Index() As ActionResult
Dim members = GetMembersFromSomeLongRunningQuery()
TempData("members") = members
Return View(members)
End Function
在索引视图中,我有一个创建字母的链接:
<%=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
最后,有一个Letter视图可以创建实际的字母。它的ContentType是“application / msword”,因此数据实际上出现在Word而不是浏览器中。
就像我说的那样,第一次通过时效果很好。但是,由于字母出现在Word中,当用户返回浏览器时,它们仍然在屏幕上显示“创建字母”链接。如果他们试图再次点击它(即第一次尝试后卡纸),他们会在CreateLetters中出错,因为TempData(“成员”)现在是空的。我知道这就是TempData的工作原理(单次拍摄请求),这就是我试图摆脱它的原因。
如何使用ViewData进行重构?或者,我如何同时显示Letter页面(即Word文档)并将应用程序重定向回索引?
答案 0 :(得分:1)
我只是在另一个视图上再次检索该对象,但为什么不在首次检索时缓存该对象
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 :(得分:1)
TempData旨在将数据保留在重定向中,而ViewData旨在将数据传递给视图。虽然TempData可以通过创建一个可以在Letter动作中调用的扩展方法(以及替换TempData(“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
答案 2 :(得分:-1)
你能把它填入应用程序变量吗?应用程序( “成员”)?