我正在学习ASP.net MVC5和书中的代码。
public ActionResult DemoTempData()
{
ViewData["Msg1"] = "From ViewData Message.";
ViewBag.Msg2 = "From ViewBag Message.";
TempData["Msg3"] = "From TempData Message.";
return RedirectToAction("Redirect1");
}
public ActionResult Redirect1()
{
TempData["Msg4"] = TempData["Msg3"];
return RedirectToAction("GetRedirectData");
}
public ActionResult GetRedirectData()
{
return View();
}
GetRedirectData
查看:
@{
ViewBag.Title = "GetRedirectData";
}
<h2>GetRedirectData</h2>
<ul>
<li>ViewData-Msg1:@ViewData["Msg1"]</li>
<li>ViewBag-Msg2:@ViewBag.Msg2</li>
<li>TempData-Msg3:@TempData["Msg3"]</li>
<li>TempData-Msg4:@TempData["Msg4"]</li>
</ul>
我知道ViewData
和ViewBag
不会传递价值。
视图中的Msg3
和Msg4
应该有值,但事实并非如此。
我检查Redirect1()
中的值,结果Msg3
是null
我对正在发生的事情感到很困惑。
答案 0 :(得分:3)
ASP.NET MVC TempData将其内容存储在Session状态中。因此,TempData在后续HTTP请求中使用后立即被销毁。
在您的情况下,您要将TempData [&#34; Msg3&#34;]分配给TempData [&#34; Msg4&#34;]。因此,一旦您使用TempData [&#34; Msg3&#34;]中的内容,它就会被销毁。因此,每当您尝试访问TempData [&#34; Msg3&#34;]时,您将获得空值。
Peek 和 Keep 方法允许您在不被破坏的情况下读取值。
参考:
https://msdn.microsoft.com/enus/library/system.web.mvc.tempdatadictionary.peek(v=vs.118).aspx
object value = TempData["value"];
TempData.Keep("value");
object value = TempData["value"];
答案 1 :(得分:-3)
使用内置的Session管道,它会一直存在,直到你将其销毁。我喜欢它,因为它总是有效,而且很容易。它可以在
中找到var conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.shell(function(err, stream) {
if (err) throw err;
stream.on('close', function() {
console.log('Stream :: close');
conn.end();
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
stream.end('ls -l\nexit\n');
});
}).connect({
host: '192.168.100.100',
port: 22,
username: 'frylock',
privateKey: require('fs').readFileSync('/here/is/my/key')
});
这实际上是当前的请求
保存使用(示例)
System.Web.HttpContext
要检索...
System.Web.HttpContext.Current.Session["Msg3"] = StringOfIds;