标签: tempdata

在重定向中使用Asp.Net MVC TempData时是否存在可能的"竞争条件"?

当使用TempData时,我的理解是它会保留你所放置的任何内容,只需要一个请求.因此,当使用TempData在重定向中保留数据时(为了使用Post-Request-Get模式),用户的某些其他请求是否可能在发送重定向的响应和用户的浏览器请求重定向页面?在这种情况下,get将不再具有TempData可用,对吗?

现在,我明白发生这样的事情是非常罕见的,但考虑到用户可能在另一个选项卡中打开了另一个页面,并且可能在该页面上发生了ajax或定时回调请求,它突然没有对我来说似乎不可能.它通常被认为是太遥远而无法担心,还是我误解了什么?

编辑:更具体地说明我所询问的场景.

  1. 在选项卡1中,用户浏览具有帖子表单的页面
  2. 在选项卡2中,用户浏览到站点上的另一个页面,该页面在计时器上执行ajax回调
  3. 在选项卡1中,用户将表单发布到服务器
  4. 当服务器收到帖子时,它会在TempData中保存一些数据并发回重定向响应
  5. 在选项卡2中,发生定时ajax回调,向服务器发送GET请求.TempData将从会话中删除
  6. 在选项卡1中,浏览器接收重定向并发出GET请求
  7. 服务器处理GET请求并查找TempData,但它不再存在

asp.net asp.net-mvc redirect tempdata

16
推荐指数
1
解决办法
2901
查看次数

TempData在哪里存储?

TempData在哪里存储在ASP.NET MVC框架中(更具体地说,ASP.NET MVC 2)?它是存储在服务器端,还是发送到客户端?

asp.net-mvc tempdata asp.net-mvc-2

16
推荐指数
2
解决办法
6927
查看次数

如何在表单发布后检查视图中的TempData值?

我从一个填充我的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.你能帮助我吗 ?

asp.net-mvc if-statement view tempdata

14
推荐指数
2
解决办法
6万
查看次数

Asp.Net 核心 Tempdata 和 redirecttoaction 不起作用

我的 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)

有什么想法吗 ?

redirecttoaction tempdata asp.net-core-2.2

14
推荐指数
1
解决办法
1万
查看次数

第二次请求后,TempData不会销毁

我在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请求.

asp.net-mvc tempdata asp.net-mvc-3

13
推荐指数
1
解决办法
1万
查看次数

添加列表并重定向到另一个视图时,Asp.net核心TempData会出现500错误

我正在尝试构建警报列表并将其添加到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">&times;</button>
                @alert.Message
            </div>

        }
    </div>

}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪. …

redirect tempdata asp.net-core-mvc asp.net-core

12
推荐指数
1
解决办法
6302
查看次数

在<sessionState mode ="Off"/>时使用TempData

我试图让一个网站减少会话.所以添加 <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吗?

asp.net asp.net-mvc session tempdata

10
推荐指数
1
解决办法
8438
查看次数

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 tempdata

9
推荐指数
1
解决办法
1万
查看次数

TempData未被清除

我正在开发一个ASP.NET MVC 3 Web应用程序,我在其中使用TempData来存储模型对象,在用户未登录的场景中.

这是流程:

  1. 使用提交表单.
  2. 代码(特殊操作过滤器)将模型添加到TempData,重定向到登录页面.
  3. 用户重定向回GET操作,该操作读取TempData并直接调用POST操作

在第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)

我发现这篇文章指出:

  1. 只有在标记为删除时,才会在请求结束时从TempData中删除项目.
  2. 只有在阅读时才会标记要删除的项目.
  3. 通过调用TempData.Keep(key)可以取消标记项目.
  4. RedirectResult和RedirectToRouteResult始终调用TempData.Keep().

读它TempData["xxx"]不是一个"读",因此它们应被标记为删除?

最后一个关注我 - 因为我在POST(PRG)后进行重定向.但这是无法避免的.

有没有办法说"弃这个项目".TempData.Remove?或者我这样做错了吗?

c# asp.net-mvc tempdata asp.net-mvc-3

9
推荐指数
3
解决办法
1万
查看次数

TempData Cookie 问题。请求头的大小太长

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) …

cookies session tempdata asp.net-core

9
推荐指数
1
解决办法
1543
查看次数