ASP.NET MVC TempData 的间歇性结果 - 有时它会失去它的价值

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

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

如果出于业务原因无法添加实体,则会将错误 [​​=28=] 设置为 true 并附上描述。

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

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

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

然后在我看来我有这个代码:

@if (TempData["SessionCodesMessage"] != null)
{
    <div class="alert @TempData["MessageClass"] alert-dismissable" style="margin-top: 8px;">
        <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
        @(TempData["SessionCodesMessage"])
    </div>
}

而且消息显示与不显示似乎不一致。这可能是浏览器缓存问题或类似问题吗?通过逐步执行代码,我可以确认执行会根据添加实体的结果进入两个控制器条件块。

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

如果你想保留 TempData 值,那么你可以使用 Keep:

TempData.Keep()

你的情况:

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

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/