如何在MVC调用之间保留数据集

时间:2009-03-24 19:27:00

标签: asp.net-mvc model-view-controller

以下设置类型的工作,但它不是正确使用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文档)并将应用程序重定向回索引?

3 个答案:

答案 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)

你能把它填入应用程序变量吗?应用程序( “成员”)?