Asp.Net 核心 Tempdata 和 redirecttoaction 不起作用

Bri*_*der 14 redirecttoaction tempdata asp.net-core-2.2

我的 basecontroller 类中有一个方法可以将数据添加到 tempdata 以显示弹出消息。

protected void AddPopupMessage(SeverityLevels severityLevel, string title, string message)
{
    var newPopupMessage = new PopupMessage()
    {
        SeverityLevel = severityLevel,
        Title = title,
        Message = message
    };
    _popupMessages.Add(newPopupMessage);
    TempData["PopupMessages"] = _popupMessages;
}
Run Code Online (Sandbox Code Playgroud)

如果操作返回一个视图,这可以正常工作。如果该操作正在调用重定向操作,则会出现以下错误。

InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type
Run Code Online (Sandbox Code Playgroud)

有什么想法吗 ?

Chr*_*att 28

TempData使用Session,它本身使用IDistributedCache. IDistributedCache没有能力接受对象或序列化对象。因此,您需要自己执行此操作,即:

TempData["PopupMessages"] = JsonConvert.SerializeObject(_popupMessages);
Run Code Online (Sandbox Code Playgroud)

然后,当然,在重定向之后,您需要将其反序列化回您需要的对象:

ViewData["PopupMessages"] = JsonConvert.DeserializeObject<List<PopupMessage>>(TempData["PopupMessages"]);
Run Code Online (Sandbox Code Playgroud)

  • 简而言之,您只需在使用内存会话时不必序列化,但永远不应在生产中使用内存会话。因此,Core 实际上让你为现实世界做好了准备,而 MVC 没有。 (3认同)
  • 内存是RAM,它是易失性的。如果应用程序停止或运行它的服务器重新启动,那么存储在其中的所有内容都会消失。此外,内存受进程限制。如果您使用容器或 IIS 中的网络场运行应用程序的多个实例,则每个实例都有自己的内存分配,因此也有自己的会话存储。 (3认同)
  • 这完全从asp.net 变成了asp.net 核心? (2认同)
  • 是和否。不同之处在于 MVC 将默认为内存中会话存储,这恰好不需要序列化,然后当您尝试切换到不同的会话存储时会得到异常。虽然 Core 默认也支持内存中,但`IDistributedCache` 接口确保所有会话存储的行为相同,即需要复杂对象的序列化。 (2认同)
  • 在生产中使用 InMemory 会话有什么问题? (2认同)