7

我有一个 ASP.NET MVC3 应用程序,其中我的操作会生成一个 ID 列表,我希望这些 ID 可用于后续的 AJAX 请求。这样我就可以在后台运行一个很长的进程并对其进行轮询。id 列表是这个长期运行过程的必要输入。我不想在 URL 中将它们作为参数传递,因为列表可能很长并导致 IE 出现问题。

我的控制器

public ActionResult Run()
{
    List<MyObjs> objs = _db.MyObjs.ToList<MyObjs>();

    string uniqueId = Guid.NewGuid().ToString();
    ViewData["UniqueID"] = uniqueId;
    TempData["ObjIdList" + uniqueId] = String.Join(",", objs .Select(o => o.ObjID).ToArray<int>());

    return View(objs);
}            

public void StartProcess(string uid)
{
    string ids = TempData["ObjIdList" + id].ToString().Split(',');
    ...        
}

我的观点

var uniqueId = '@ViewData["UniqueID"]';

$(document).ready(function (event) {
    $('#startProcess').click(function () {
        $.post("/Scheduler/StartProcess", { uid: uniqueId }, function () {
            getStatus();
        });
        event.preventDefault;
    });
});

function getStatus() {
    var r = new Date().getTime(); // cache killer for IE
    var url = '/Scheduler/GetCurrentProgress/' + uniqueId + "?r=" + r;
    $.get(url, function (data) {
        if (data != "100") {
            $('#status').html(data);
            setTimeout(function () { getStatus(); }, 100);
        } else {
            $('#status').html("Done");
        };
    });
}

这在我的初始测试中有效,尽管在我的笔记本电脑上有一个并发用户。这是安全的,还是有更好的方法来传递这些数据?

4

3 回答 3

11

布兰登

TempData 与 ViewData 类似,不同之处在于它会针对两个连续的请求持续存在,这使得它对于在两个不同的控制器操作之间传递数据等事情很有用

杰森 C

MVC 中的 TempData 实际上一直存在,直到被检索到。由于 FYI Tempdata 实际上存储在用户 SessionState 中,因此它更像 SessionData 而不是 ViewData

取自我的一个问题回复 - MVC3 控制器操作结果“记住”传入的 ID

本质上 TempData 就像一个 Session 属性 - (存储在 SessionState 中)用于在对控制器的两个连续请求之间进行通信。好像在您的情况下这是一个好或坏的做法,我认为将数据传递给 tempdata 会很好,但它们是其他选项,其中隐藏字段。另一个值得关注的好链接是ASP.NET MVC - TempData - Good or bad practice

于 2012-10-04T23:20:33.673 回答
3

的生命周期TempData很短。从当前请求到后续请求。TempDataSession用于在幕后存储数据。但是生命周期比常规会话变量要短,这取决于后续请求。

如果您确定要在设置 TempData 的上一次调用之后立即进行 ajax 调用,则可以使用它。如果您想要更多的控制权,您可以将它保存在Session变量中,并在您使用它 n 次后销毁会话变量。

于 2012-10-04T23:27:12.180 回答
0

仅当您希望在 ASP .NET MVC 中的控制器之间传递值时才使用 TempData。

于 2012-10-05T05:27:19.333 回答