【问题标题】:Is it possible to serialize or save viewbag state?是否可以序列化或保存 viewbag 状态?
【发布时间】:2013-08-26 18:43:50
【问题描述】:

我们的 MVC 项目中有一个自定义缓存系统,我们在控制器中保存和加载模型。我们也使用了 Viewbag 对象,但是我们很难找到一种方法来保存这个对象的状态。它也没有标记为 [Serializable],因此不能使用字节数组。

您能否以某种方式将 Viewbag 对象的状态保存到可管理的数据库对象中? 你能以某种方式覆盖或扩展 Viewbag 的行为吗?

我想彻底放弃 Viewbag。

【问题讨论】:

  • 你能用 JSON.NET 之类的东西序列化它吗?
  • 我根本没有研究过 JSON.NET。你能指点一下这怎么可能吗?
  • 是的,完全废弃 ViewBag 或将其保留用于很容易在每次执行操作方法时重新填充的琐碎情况。

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


【解决方案1】:

ViewBag 是一个DynamicViewDataDictionary,它继承了DynamicObject。使用“GetDynamicMemberNames”获取密钥很简单,但获取值稍微冗长一些。下面将 ViewBag 转换为字典(无耻抄袭Aaronaught's answer here借来的):

var values = new Dictionary<string, object>();
IEnumerable<string> keys = ViewBag.GetDynamicMemberNames();
foreach (string key in keys)
{
    var binder = Microsoft.CSharp.RuntimeBinder.Binder.GetMember(
        CSharpBinderFlags.None, key, 
        ViewBag.GetType(),
        new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });
    var callsite = CallSite<Func<CallSite, object, object>>.Create(binder);
    var val = callsite.Target(callsite, ViewBag);
    values.Add(key, val);
}

我想彻底放弃 Viewbag。

这听起来是个好主意——在可能的情况下使用强类型视图模型要好得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2020-12-08
    • 2020-07-04
    相关资源
    最近更新 更多