【问题标题】:Cannot pass complex object to another Action method无法将复杂对象传递给另一个 Action 方法
【发布时间】:2018-02-07 10:10:18
【问题描述】:

我正在尝试使用 TempData 将对象传递给另一个操作方法。控制器没有重定向到操作方法,而是在 URL 中给我一个带有当前操作方法的白屏。如果我注释掉将对象传递给 TempData 的行,它会正确重定向。我的对象是否太复杂而无法通过?是否有将复杂对象传递给另一个操作方法的替代方法?

我将对象传递给 TempData:

public async Task<IActionResult> UploadFile(IFormFile file)
{
    if (file == null || file.Length == 0)
        return Content("file not selected");
    else
    {                
        var path = Path.Combine(
                Directory.GetCurrentDirectory(), "wwwroot",
                "processes.json");

        using (var stream = new FileStream(path, FileMode.Create))
        {
            await file.CopyToAsync(stream);

        }
        RetrieveModels rm = rm = new RetrieveModels(path);
        List<FoundPattern> foundList = new List<FoundPattern>();               
        List<ProcessModel> processes = rm.Processes;
        FindPatterns findp = new FindPatterns(processes, pt.KpiPatterns);
        foundList = findp.fp;
        TempData["list"] = foundList.ToList();
        TempData["Name"] = "Multiple Business Processes";
        return RedirectToAction("Overview");
    }           
}

我想重定向到的操作方法:

public IActionResult Overview()
{
    var list = TempData["list"] as List<FoundPattern>;
    ViewData["Name"] = TempData["Name"];
    return View(list);
}

我试图传递给 TempData 的对象列表:

public class FoundPattern
{
    public KpiPattern pattern = new KpiPattern();
    public List<FoundElement> elements = new List<FoundElement>();
}

对象内的对象列表:

public class FoundElement
{
    public List<string> ElementNames = new List<string>();
    public bool Present { get; set; }
}

有效时的响应标头:

HTTP/1.1 302 Found Location: /Home/Overview Server: Kestrel Set-Cookie: .AspNetCore.Mvc.CookieTempDataProvider=CfDJ8Mu_qDgU_59HncGqqkEm39LG_cUi_rzUyuXXaEYreUFPL2etHRuHPv_5GVKDLcIIcvFhQg1KOzDBfhbvDbjZDpcp8JYzq5kpLHtfnw962pyXNHyCNbx_MOkKwGFSG_dQ_M7LlSVxWYHjqalsSe26K4IlRfGN8V9B5MAgIhWoURgF; path=/; samesite=strict; httponly X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcWkFUXHNvdXJjZVxyZXBvc1xLUEl0b29sXEtQSXRvb2xcSG9tZVxVcGxvYWRGaWxl?= X-Powered-By: ASP.NET Date: Wed, 07 Feb 2018 10:38:40 GMT Content-Length: 0

HTTP/1.1 200 OK Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 Server: Kestrel Set-Cookie: .AspNetCore.Mvc.CookieTempDataProvider=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; samesite=strict X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcWkFUXHNvdXJjZVxyZXBvc1xLUEl0b29sXEtQSXRvb2xcSG9tZVxPdmVydmlldw==?= X-Powered-By: ASP.NET Date: Wed, 07 Feb 2018 10:38:40 GMT

当它不起作用时的响应标头:

HTTP/1.1 500 Internal Server Error Server: Kestrel X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcWkFUXHNvdXJjZVxyZXBvc1xLUEl0b29sXEtQSXRvb2xcSG9tZVxVcGxvYWRGaWxl?= X-Powered-By: ASP.NET Date: Wed, 07 Feb 2018 10:41:28 GMT Content-Length: 0

【问题讨论】:

  • TempData["Name"] 有效吗? TempData 实际上只是会话数据,那么会话通常可以工作吗?如果您担心对象会将其复杂序列化为 JSON,请将 JSON 存储在 TempData 中并在需要时反序列化。
  • @AshleyMedway 感谢您的回复。 TempData["Name"] 有效。我还使用 TempData 来存储一个简单的字符串列表,它工作得很好。但是现在它更复杂了,它不再起作用了。我想将它序列化为 JSON 是唯一的解决方案......
  • @CalC TempData 应该配置,因为TempData["Name"] 工作正常。只是为了检查一下,我确实添加了配置 TempData 提供程序的代码,但它没有帮助。
  • @mjwills 是的。我什至在退出操作方法之前在本地窗口中得到以下行:imgur.com/a/nE0WJ

标签: c# asp.net asp.net-mvc


【解决方案1】:

您正在使用CookieTempDataProvider 管理TempData。唉,顾名思义,它导致将TempData 存储在cookies 中。

问题是您的数据是 too large 以适合 cookie。您可能希望使用different ITempDataProvider 实现(例如SessionStateTempDataProvider)。

【讨论】:

  • 我刚刚切换到SessionStateTempDataProvider。感谢您的解决方案。你知道这种实现的最大尺寸是多少吗?我在任何地方都找不到它。
猜你喜欢
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多