当使用TempData时,我的理解是它会保留你所放置的任何内容,只需要一个请求.因此,当使用TempData在重定向中保留数据时(为了使用Post-Request-Get模式),用户的某些其他请求是否可能在发送重定向的响应和用户的浏览器请求重定向页面?在这种情况下,get将不再具有TempData可用,对吗?
现在,我明白发生这样的事情是非常罕见的,但考虑到用户可能在另一个选项卡中打开了另一个页面,并且可能在该页面上发生了ajax或定时回调请求,它突然没有对我来说似乎不可能.它通常被认为是太遥远而无法担心,还是我误解了什么?
编辑:更具体地说明我所询问的场景.
TempData在哪里存储在ASP.NET MVC框架中(更具体地说,ASP.NET MVC 2)?它是存储在服务器端,还是发送到客户端?
我从一个填充我的TempData FormCollection然后我尝试TempData用MVC 4 检查我的视图中的值,但我的if声明没有按照我的预期工作.这是我的代码.
控制器:
[HttpPost]
public ActionResult TestForm(FormCollection data)
{
TempData["username"] = data["var"].ToString(); //data["var"] == "abcd"
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
视图:
@if (TempData["var"] == "abcd")
{
<span>Check</span> //Never displayed
}
else
{
@TempData["var"]; // Display "abcd"
}
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,我不明白为什么我不能显示这个Check.你能帮助我吗 ?
我的 basecontroller 类中有一个方法可以将数据添加到 tempdata 以显示弹出消息。
protected void AddPopupMessage(SeverityLevels severityLevel, string title, string message)
{
var newPopupMessage = new PopupMessage()
{
SeverityLevel = severityLevel,
Title = title,
Message = message
};
_popupMessages.Add(newPopupMessage);
TempData["PopupMessages"] = _popupMessages;
}
Run Code Online (Sandbox Code Playgroud)
如果操作返回一个视图,这可以正常工作。如果该操作正在调用重定向操作,则会出现以下错误。
InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type
Run Code Online (Sandbox Code Playgroud)
有什么想法吗 ?
我在actionfilter中的第一个请求中将值放入TempData.
filterContext.Controller.TempData["value"] = true;
Run Code Online (Sandbox Code Playgroud)
之后第二个请求进来,我检查了值
filterContext.Controller.TempData.ContainsKey("value")
Run Code Online (Sandbox Code Playgroud)
价值就在那里.然后第三个请求进来,我再次检查该值
filterContext.Controller.TempData.ContainsKey("value")
Run Code Online (Sandbox Code Playgroud)
而且价值仍然存在.在第二次请求后,这个值不应该被销毁吗?所有请求都是AJAX请求.
我正在尝试构建警报列表并将其添加到TempData.但是如果我没有重定向它就有效.当我重定向时,它给我500错误.我也在视图中设置了断点,但是当它正确地重定向时,它没有被击中.
ActionMethod
public IActionResult Create(CategoryCreateVM input)
{
if (ModelState.IsValid)
{
var category = mapper.Map<Categories>(input);
categoryBL.Add(category);
List<Alert> alert = new List<Alert>();
alert.Add(new Alert("alert-success", "success message"));
alert.Add(new Alert("alert-danger", "danger message"));
TempData["Alert"] = alert;
return RedirectToAction("Index");
}
return View(input);
}
Run Code Online (Sandbox Code Playgroud)
我如何访问视图.
@{
var alerts = TempData["Alert"] as List<Alert>;
}
@if (alerts != null && alerts.Count > 0)
{
<div class="">
@foreach (var alert in alerts)
{
<div class="alert @alert.AlertClass alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
@alert.Message
</div>
}
</div>
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪. …
我试图让一个网站减少会话.所以添加 <sessionState mode="Off" /> 到我的web.config.之后如果我执行
Session["test"] = "yes";
Run Code Online (Sandbox Code Playgroud)
我收到错误" 对象引用未设置为对象的实例." 这可以.
但是通过这种配置,我可以设置
TempData["test"] = "yes";
Run Code Online (Sandbox Code Playgroud)
在控制器中并TempData["test"];在View页面中打印.它运作良好.
根据MSDN "TempData属性值存储在会话状态".
那么如果我提一下<sessionState mode="Off" />TempData是如何工作的呢?ASP.NET仍然在会话或其他地方存储TempData吗?
我在我的控制器中使用临时数据 - 非常简单,当出现问题时:
TempData("StatusMessage") = "You have no items set to Auto-Ship."
Run Code Online (Sandbox Code Playgroud)
然后在每个页面上我都有一个用户控件,如下所示:
<div class="error-container">
<% If TempData.ContainsKey("ErrorMessage") Then%>
<script> $('div.error-container').show();</script>
<div class="msg-error"><p><%=TempData("ErrorMessage") %></p></div>
<% End If%>
<% If TempData.ContainsKey("StatusMessage") Then%>
<script> $('div.error-container').show();</script>
<div class="msg-status"><p><%=TempData("StatusMessage")%></p></div>
<% End If%>
<ul></ul>
</div>
Run Code Online (Sandbox Code Playgroud)
问题是当我确实在tempdata中添加了一个错误时它在第一个请求中正确显示,但是在下一个请求时也会再次出现 - 这显然非常令人困惑而且不是一个理想的行为.
我没有使用任何IoC,我确实在使用它时看到了相同问题的帖子.
我正在开发一个ASP.NET MVC 3 Web应用程序,我在其中使用TempData来存储模型对象,在用户未登录的场景中.
这是流程:
在第3步之后,我会想到TempData会被清除吗?
这是代码:
[HttpGet]
public ActionResult Foo()
{
var prefilled = TempData["xxxx"] as MyModel;
if (prefilled != null)
{
return Foo(prefilled);
}
}
[HttpPost]
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page
public ActionResult Foo(MyModel model)
{
// saves to db.. etc
}
Run Code Online (Sandbox Code Playgroud)
我发现这篇文章指出:
读它TempData["xxx"]不是一个"读",因此它们应被标记为删除?
最后一个关注我 - 因为我在POST(PRG)后进行重定向.但这是无法避免的.
有没有办法说"弃这个项目".TempData.Remove?或者我这样做错了吗?
在Controller 中,我将一组错误保存到cookiesviaTempData
var messages = new List<Message>();
...
TempData.Put("Errors", messages);
Run Code Online (Sandbox Code Playgroud)
TempData.Put 是一个扩展方法
public static class TempDataExtensions
{
public static void Put<T>(this ITempDataDictionary tempData, string key, T value) where T : class
{
tempData[key] = JsonConvert.SerializeObject(value);
}
public static T Get<T>(this ITempDataDictionary tempData, string key) where T : class
{
tempData.TryGetValue(key, out object o);
return o == null ? null : JsonConvert.DeserializeObject<T>((string)o);
}
}
Run Code Online (Sandbox Code Playgroud)
加载 HTML 时,我看到
并创建了几个 cookie(Chrome 开发者工具 > 应用程序 > 存储 > Cookies) …
tempdata ×10
asp.net-mvc ×7
asp.net ×2
asp.net-core ×2
redirect ×2
session ×2
c# ×1
cookies ×1
if-statement ×1
view ×1