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

Pau*_*aul 7 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(',');
    ...        
}
Run Code Online (Sandbox Code Playgroud)

我的看法

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");
        };
    });
}
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ins 11

布兰登

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

杰森C.

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

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

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