加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core-mvc – 将复杂对象存储在MVC 6中的TempData中

发布时间:2020-12-15 22:51:56 所属栏目:asp.Net 来源:网络整理
导读:通过使用TempData,我一直在尝试通过重定向将数据传递给一个操作: if (!ModelState.IsValid){ TempData["ErrorMessages"] = ModelState; return RedirectToAction("Product","ProductDetails",new { code = model.ProductCode });} 但不幸的是,它失败了以下
通过使用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类型

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读