【发布时间】:2016-01-06 17:14:05
【问题描述】:
我一直在尝试使用 TempData 将数据传递给重定向后的操作,如下所示:
if (!ModelState.IsValid)
{
TempData["ErrorMessages"] = ModelState;
return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode });
}
但不幸的是,它失败并显示以下消息:
'
System.InvalidOperationExceptionMicrosoft.AspNet.Mvc.SessionStateTempDataProvider'无法序列化'ModelStateDictionary'类型的对象到会话状态。'
我在 the MVC project in Github 中发现了一个问题,虽然它解释了我收到此错误的原因,但我看不出有什么可行的替代方案。
一种选择是将对象序列化为 json 字符串,然后将其反序列化并重建 ModelState。这是最好的方法吗?我需要考虑任何潜在的性能问题吗?
最后,对于序列化复杂对象或使用不涉及使用TempData 的其他模式,是否有任何替代方案?
【问题讨论】:
-
你不应该这样做。如果模型状态无效,则默认行为只是返回与无效模型相同的视图。所以你应该只这样做 return View(model);而不是重定向到行动
-
这只是一个例子,我正在寻找一种将任何复杂对象存储在 TempData 中的方法,不一定是 ModelState。此外,在某些情况下您可能无法遵循您的建议,我同意这是最佳做法
-
@hjgraca 这种情况的用例是一个视图,它具有多个用于添加和编辑数据列表的部分视图。例如,视图的模型实际上是模型的列表,然后有一个内联添加表单,它有自己的模型(其错误需要发回),然后每个项目也被内联编辑(每个项目都有自己的错误)。使用 Angular 等客户端框架很容易做到这一点,但使用 Razor 就不太容易了。
-
仅供参考,您不能只序列化为 JSON,因为 ModelError 类没有适当的构造函数。事实上,这是一个有问题的孩子,内部 ModelError 类。因此,我认为解决方案是序列化 KVP,然后反序列化并将它们添加回来。完成后我会发布这些过滤器。
-
@MichaelPerrenoud 我正在按照这些思路在 TempData 中存储自定义类(不是 ModelState)。我只是想知道是否有更好的方法。
标签: c# asp.net-core asp.net-core-mvc tempdata