C# ASP.NET MVC3中TempData的正确使用?
我有一个ASP.NET MVC3应用程序,在该应用程序中,我的操作生成一个ID列表,我希望这些ID可供后续AJAX请求使用。这样我就可以在后台运行一个很长的进程并对其进行投票。ID列表是这个长时间运行的进程的必要输入。我不想将它们作为参数传递到URL中,因为该列表可能非常长,并在IE中引起问题 我的控制器C# ASP.NET MVC3中TempData的正确使用?,c#,jquery,asp.net-mvc-3,C#,Jquery,Asp.net Mvc 3,我有一个ASP.NET MVC3应用程序,在该应用程序中,我的操作生成一个ID列表,我希望这些ID可供后续AJAX请求使用。这样我就可以在后台运行一个很长的进程并对其进行投票。ID列表是这个长时间运行的进程的必要输入。我不想将它们作为参数传递到URL中,因为该列表可能非常长,并在IE中引起问题 我的控制器 public ActionResult Run() { List<MyObjs> objs = _db.MyObjs.ToList<MyObjs>();
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(',');
...
}
这在我的初始测试中起作用,尽管在我的笔记本电脑上有一个并发用户。这是安全的,还是有更好的方法传递这些数据?Brandon
TempData与ViewData类似,不同之处在于它会持续存在于两个连续的请求中,这使得它对于在两个不同的控制器动作之间传递数据非常有用
杰森C
MVC中的TempData实际上一直存在,直到被检索为止。由于FYI Tempdata实际上存储在用户SessionState中,因此它更像SessionData而不是ViewData
摘自我的一个问题回答-
从本质上讲,TempData类似于会话属性(存储在SessionState中),用于两个连续的控制器请求之间的通信。如果这是一个好的或坏的做法,那么在您的情况下,我认为将数据传递给tempdata是完全好的,但它们是其他选项,其中隐藏了字段。
另一个好的链接是TempData的生存期非常短。从当前请求到后续请求。TempData正在使用
会话
在后台存储数据。但是生存时间比常规会话变量短,这取决于后续请求
如果您确定要在设置TempData的上一次调用之后立即进行ajax调用,那么可以使用它。如果您想要更多的控制,您可以将其保存在会话变量中,并在您想在任何地方使用它n次后销毁会话变量。仅当您想在ASP.NET MVC中的控制器之间传递值时才使用TempData。我认为“MVC中的TempData实际上一直存在,直到被检索”这意味着这是一种安全模式,因为TempData的键中有GUID。你同意吗?嗯,不,我不认为。。。如果我错了,有人会纠正我,尽管这个链接“TempData的持久性”可能有助于我相信它很好,因为它确实会单独跟踪它们,但您必须始终小心其状态。我喜欢使用
会话
。就像你说的,更多的控制。
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");
};
});
}