在 ASP.NET MVC3 中正确使用 TempData?
Posted
技术标签:
【中文标题】在 ASP.NET MVC3 中正确使用 TempData?【英文标题】:Proper use of TempData in ASP.NET MVC3? 【发布时间】:2012-09-26 01:33:40 【问题描述】:我有一个 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");
;
);
这在我的初始测试中有效,尽管在我的笔记本电脑上有一个并发用户。这是安全的,还是有更好的方法来传递这些数据?
【问题讨论】:
【参考方案1】:布兰登
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
【讨论】:
我认为“MVC 中的 TempData 实际上一直持续到被检索到”意味着这是一种安全模式,因为 TempData 在密钥中有 GUID。你同意吗? 嗯,不,我不认为它确实如此......如果我错了,有人纠正我虽然这个链接“临时数据的持久性”可能会有所帮助***.com/questions/3982465/…我相信它很好,因为它确实保持单独跟踪它们,但您始终必须小心其所处的状态。【参考方案2】:TempData
的生命周期很短。从当前请求到后续请求。 TempData 在幕后使用Session
存储数据。但是生命周期比常规会话变量要短,这取决于后续请求。
如果您确定要在设置 TempData 的上一次调用之后立即进行 ajax 调用,则可以使用它。如果你想要更多的控制权,你可以将它保存在Session
变量中,并在你想要的地方使用它n次后销毁会话变量。
【讨论】:
我喜欢使用Session
的想法。就像你说的,更多的控制权。【参考方案3】:
仅当您希望在 ASP .NET MVC 中的控制器之间传递值时才使用 TempData。
【讨论】:
以上是关于在 ASP.NET MVC3 中正确使用 TempData?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET MVC3 中使用“FormCollection”接收关联数组数据
如何在 ASP.net MVC3 中获取 Advantage Database 数据?