我们在MVC项目中有一个自定义缓存系统,我们在控制器中保存和加载模型。我们也使用Viewbag对象,但是我们找不到保存此对象状态的方法。它也没有标记为[Serializable],所以字节数组是不行的。
您能否以某种方式将Viewbag对象的状态保存到可管理的数据库对象中? 你能以某种方式覆盖或扩展Viewbag的行为吗?
我想完全废弃Viewbag。
答案 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。
这听起来是个好主意 - 在可能的情况下使用强类型视图模型要好得多。