将复杂对象存储在TempData中
我一直试图通过使用TempData重定向后将数据传递给一个动作,如下所示:
if (!ModelState.IsValid) { TempData["ErrorMessages"] = ModelState; return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode }); }
但不幸的是,它失败了以下消息:
‘
System.InvalidOperationException
:Microsoft.AspNet.Mvc.SessionStateTempDataProvider'
无法将类型为'ModelStateDictionary'
的对象序列化为会话状态。
我在Github的MVC项目中发现了一个问题,但是虽然它解释了为什么我收到这个错误,但我看不出什么是可行的替代方案。
一种选择是将对象序列化为json字符串,然后将其反序列化并重新构建ModelState
。 这是最好的方法吗? 我需要考虑哪些潜在的性能问题?
最后,是否有任何替代方法可以序列化复杂对象或使用其他不涉及使用TempData
?
您可以像这样创建扩展方法:
public static class TempDataExtensions { public static void Put(this ITempDataDictionary tempData, string key, T value) where T : class { tempData[key] = JsonConvert.SerializeObject(value); } public static T Get (this ITempDataDictionary tempData, string key) where T : class { object o; tempData.TryGetValue(key, out o); return o == null ? null : JsonConvert.DeserializeObject ((string)o); } }
并且,您可以按如下方式使用它们:
假设objectA
属于ClassA
类型。 你可以使用上面提到的扩展方法将它添加到临时数据字典中,如下所示:
TempData.Put("key", objectA);
要检索它,你可以这样做:
var value = TempData.Get
其中检索的value
ClassA
类型
我不能发表评论,但我添加了一个PEEK,这很好检查是否有或读取而不是删除下一个GET。
public static T Peek(this ITempDataDictionary tempData, string key) where T : class { object o = tempData.Peek(key); return o == null ? null : JsonConvert.DeserializeObject ((string)o); }
例
var value = TempData.Peek("key") where value retrieved will be of type ClassA