关于c#:ASP.NET MVC TempData的间歇结果-有时会失去其价值

Intermittent results with ASP.NET MVC TempData - sometimes it loses it's value

在ASP.NET MVC应用程序中,我有一个控制器操作,该操作调用业务层以添加实体。

如果由于商业原因而无法添加实体,则将Error属性以及描述设置为true。

如果为true,则将错误消息设置为TempData键,然后重定向到具有代码的视图,该代码用于显示存储在TempData中的错误(如果存在)。有时显示条件块,有时不显示。

这是我的控制器中的相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var added = ModelHelper.CreateSessionCode(model);

if(added.Error)
{
    TempData["SessionCodesMessage"] = model.ErrorDescription;
    TempData["MessageClass"] ="alert-danger";
}
else
{
    TempData["SessionCodesMessage"] ="Created session code";
    TempData["MessageClass"] ="alert-success";
}

return RedirectToAction("Index");

然后在我看来,我有以下代码:

1
2
3
4
5
6
7
@if (TempData["SessionCodesMessage"] != null)
{
   
       
        @(TempData["SessionCodesMessage"])
   
}

该消息是否显示似乎不一致。这可能是浏览器缓存问题或类似问题吗?通过逐步执行代码,我可以确定执行是否取决于添加实体的结果进入了两个控制器条件块。


好吧,TempData就像ViewData,但有所不同。它可以包含两个连续请求之间的数据,但之后它们将被销毁。

如果要保留TempData值,则可以使用Keep:

1
TempData.Keep()

在您的情况下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var added = ModelHelper.CreateSessionCode(model);

if(added.Error)
{
    TempData["SessionCodesMessage"] = model.ErrorDescription;
    TempData.Keep("SessionCodesMessage");
    TempData["MessageClass"] ="alert-danger";
    TempData.Keep("MessageClass");
}
else
{
    TempData["SessionCodesMessage"] ="Created session code";
    TempData.Keep("SessionCodesMessage");
    TempData["MessageClass"] ="alert-success";
    TempData.Keep("MessageClass");
}

return RedirectToAction("Index");

如果要在每次删除时都将其明确显示而不删除它,也可以使用Peek。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var added = ModelHelper.CreateSessionCode(model);

if(added.Error)
{
    //second request, PEEK value so it is not deleted at the end of the request
    TempData["SessionCodesMessage"]; ="Created session code";
    object sessioncodevalue= TempData.Peek("SessionCodesMessage");
    TempData["MessageClass"]; ="alert-success";
    object messageclassvalue= TempData.Peek("MessageClass");
}
else
{
    //second request, PEEK value so it is not deleted at the end of the request
    TempData["SessionCodesMessage"]; ="Created session code";
    object sessioncodevalue= TempData.Peek("SessionCodesMessage");
    TempData["MessageClass"]; ="alert-success";
    object messageclassvalue= TempData.Peek("MessageClass");
}

return RedirectToAction("Index");

当您始终希望保留另一个请求的值时,可以使用Peek。并在保留值时使用Keep取决于其他逻辑。

有关这些功能以及如何在View中使用它们的更多信息,请参考本文:https://www.c-sharpcorner.com/UploadFile/ansh06031982/using-tempdata-peek-and -keep-in-Asp-Net-mvc /