Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TempData和Post-Redirect-Get模式_C#_.net_Asp.net Core_.net Core_Asp.net Core 2.2 - Fatal编程技术网

C# 使用TempData和Post-Redirect-Get模式

C# 使用TempData和Post-Redirect-Get模式,c#,.net,asp.net-core,.net-core,asp.net-core-2.2,C#,.net,Asp.net Core,.net Core,Asp.net Core 2.2,有许多人主张将TempData与.NETCore2.2.x中的PRG模式结合使用 据我所知,这行代码存储数据: TempData["foo"] = JsonConvert.SerializeObject(model); 下面将重新构建模型,然后将其从TempData构造中删除: string s = (string)TempData["Model"]; var model = JsonConvert.DeserializeObject<ModelType>(s); 用户现在位于

有许多人主张将TempData与.NETCore2.2.x中的PRG模式结合使用

据我所知,这行代码存储数据:

 TempData["foo"] = JsonConvert.SerializeObject(model);
下面将重新构建模型,然后将其从TempData构造中删除:

string s = (string)TempData["Model"];
var model = JsonConvert.DeserializeObject<ModelType>(s);
用户现在位于/Controller/UserInfo页面上。如果用户按F5刷新页面,TempData[Model]将不再存在,获取用户信息将失败。修复方法可能是在读取模型后将其存储在TempData中,但这不会导致内存泄漏吗


我遗漏了什么吗?

TempData可用于存储瞬态数据。当多个请求需要数据时,它对重定向非常有用。当读取TempDataDictionary中的对象时,该对象将在该请求结束时标记为删除

这意味着如果你在TempData上放一些东西,比如

TempData["value"] = "someValueForNextRequest";
在另一个请求中,您访问它时,该值将在那里,但一旦您读取它,该值将被标记为删除:

//second request, read value and is marked for deletion
object value = TempData["value"];

//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null
Peek和Keep方法允许您读取值,而无需将其标记为删除。假设我们返回到将值保存到TempData的第一个请求

使用Peek,您只需一次调用即可获得值,而无需将其标记为删除,请参阅:

使用“保留”指定要保留的标记为删除的密钥。检索对象和稍后从删除中保存对象是两个不同的调用。看

当您始终希望为另一个请求保留值时,可以使用Peek。根据附加逻辑保留值时,使用Keep

在Get操作中进行以下更改

public IActionResult UserInfo()
    {
        //The First method ,
        string s = (string)TempData.Peek("Model");

        //The Second method
        string s = (string)TempData["Model"]; 
        TempData.Keep("Model");

        if(s==null)
        {
            return View();
        }
        else
        {
            User model = JsonConvert.DeserializeObject<User>(s);
            return View(model);
        }
    }

TempData通常用于敏感信息。PRG不需要它。@Jasen您将使用什么方法将信息从POST移动到GET?我没有数据库,因此无法使用ID进行传递。如果您想在首次访问后保留数据,会话状态将是TempData的逻辑替代方案。@DaveCluderay应用程序将在多个服务器上设置,所以单机sesison状态将不起作用,我认为仅仅为PRG模式引入分布式缓存是一种过分的做法。可能会用到cookies之类的东西。我对上一段代码中的术语感到困惑。当你说第一种方法和第二种方法时——你是说这两种方法都有效吗?是的,两种方法都有效,根据上述Peek和Keep方法的比较,在你的场景中使用第一种方法比使用第二种方法更好。
//second request, PEEK value so it is not deleted at the end of the request
object value = TempData.Peek("value");

//third request, read value and mark it for deletion
object value = TempData["value"];
//second request, get value marking it from deletion
object value = TempData["value"];
//later on decide to keep it
TempData.Keep("value");

//third request, read value and mark it for deletion
object value = TempData["value"];
public IActionResult UserInfo()
    {
        //The First method ,
        string s = (string)TempData.Peek("Model");

        //The Second method
        string s = (string)TempData["Model"]; 
        TempData.Keep("Model");

        if(s==null)
        {
            return View();
        }
        else
        {
            User model = JsonConvert.DeserializeObject<User>(s);
            return View(model);
        }
    }