是否可以序列化或保存viewbag状态?

时间:2013-08-26 18:43:51

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

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

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

我想完全废弃Viewbag。

1 个答案:

答案 0 :(得分:4)

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。

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