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

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

我的控制器

public ActionResult Run() { List objs = _db.MyObjs.ToList(); string uniqueId = Guid.NewGuid().ToString(); ViewData["UniqueID"] = uniqueId; TempData["ObjIdList" + uniqueId] = String.Join(",", objs .Select(o => o.ObjID).ToArray()); 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"); }; }); } 

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

布兰登

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

杰森C.

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

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

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

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

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

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