【问题标题】:Intermittent results with ASP.NET MVC TempData - sometimes it loses it's valueASP.NET MVC TempData 的间歇性结果 - 有时它会失去它的价值
【发布时间】:2020-01-23 15:15:10
【问题描述】:

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

如果出于业务原因,无法添加实体,则会将 Error 属性与描述一起设置为 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>
}

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

【问题讨论】:

    标签: c# asp.net-mvc tempdata


    【解决方案1】:

    好吧,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/中使用它们

    【讨论】:

    • 我理解你的回答,但我正在设置一个请求(一个控制器操作)并尝试从重定向内部读取 - 所以这只是 1 个连续请求
    • @andrewb 好吧,ViewBagViewData 用于将数据从 Controller 操作传递到 View,TempData 用于将数据从操作传递到另一个操作或一个控制器到另一个控制器。请参考这个答案:stackoverflow.com/questions/45356403/…
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多