通过使用TempData,我一直在尝试通过重定向将数据传递给一个操作:
if (!ModelState.IsValid) { TempData["ErrorMessages"] = ModelState; return RedirectToAction("Product","ProductDetails",new { code = model.ProductCode }); }
但不幸的是,它失败了以下消息:
“system.invalidOperationException
Microsoft.AspNet.Mvc.SessionStateTempDataProvider’不能将类型“ModelStateDictionary”的对象序列化为会话状态.
我在the MVC project in Github发现了一个问题,但是当它解释为什么我得到这个错误,我看不到什么会是一个可行的替代方案.
一个选项是将对象序列化为一个json字符串,然后将其反序列化并重建ModelState.这是最好的方法吗?是否有任何潜在的性能问题我需要考虑到?
最后,是否有任何序列化复杂对象或使用不涉及使用TempData的其他模式?
解决方法
您可以创建这样的扩展方法:
public static class TempDataExtensions { public static void Put<T>(this ITempDataDictionary tempData,string key,T value) where T : class { tempData[key] = JsonConvert.SerializeObject(value); } public static T Get<T>(this ITempDataDictionary tempData,string key) where T : class { object o; tempData.TryGetValue(key,out o); return o == null ? null : JsonConvert.DeserializeObject<T>((string)o); } }
而且,您可以使用它们如下:
说objectA是ClassA类型.您可以使用上述的扩展方法将其添加到临时数据字典:
TempData.Put(“key”,objectA);
并检索它可以这样做:
var value = TempData.Get&ClassA>(“key”)其中检索的值将是ClassA类型
原文地址:https://www.jb51.cc/aspnet/249675.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。