Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC3中TempData的正确使用?_C#_Jquery_Asp.net Mvc 3 - Fatal编程技术网

C# ASP.NET MVC3中TempData的正确使用?

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>();

我有一个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(',');
    ...        
}
这在我的初始测试中起作用,尽管在我的笔记本电脑上有一个并发用户。这是安全的,还是有更好的方法传递这些数据?

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");
        };
    });
}