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">×</a>
@(TempData["SessionCodesMessage"])
</div>
}
而且消息显示与不显示似乎不一致。这可能是浏览器缓存问题或类似问题吗?通过逐步执行代码,我可以确认执行会根据添加实体的结果进入两个控制器条件块。
好吧,TempData
与 ViewData
相似,但有所不同。它可以包含两个连续请求之间的数据,但之后它们将被销毁。
如果你想保留 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/
在 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">×</a>
@(TempData["SessionCodesMessage"])
</div>
}
而且消息显示与不显示似乎不一致。这可能是浏览器缓存问题或类似问题吗?通过逐步执行代码,我可以确认执行会根据添加实体的结果进入两个控制器条件块。
好吧,TempData
与 ViewData
相似,但有所不同。它可以包含两个连续请求之间的数据,但之后它们将被销毁。
如果你想保留 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/