在ASP.NET MVC3中正确使用TempData?

时间:2012-10-04 22:33:19

标签: c# jquery asp.net-mvc-3

我有一个ASP.NET MVC3应用程序,其中我的操作生成一个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");
        };
    });
}

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

3 个答案:

答案 0 :(得分:11)

布兰登

  

TempData与ViewData类似,不同之处在于它持续存在两个连续的请求,这使得它对于在两个不同的控制器操作之间传递数据这一点非常有用

杰森C

  

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

取自我的一个问题回复 - MVC3 Controller Action Result 'Remember' Passed-in Id

本质上,TempData类似于会话属性 - (存储在SessionState中),用于连续两次向控制器发出请求之间的通信。好像这对你的情况来说是一个好的或坏的做法,我认为将数据传递给tempdata是完全没问题的,但是它们是其他选项,其中包含隐藏的字段。 另一个值得关注的好链接是ASP.NET MVC - TempData - Good or bad practice

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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