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

C# 是否可以序列化或保存viewbag状态?,c#,.net,asp.net-mvc,viewbag,C#,.net,Asp.net Mvc,Viewbag,在我们的MVC项目中,我们有一个定制的缓存系统,我们在控制器中保存和加载我们的模型。我们也使用Viewbag对象,但是我们很难找到保存该对象状态的方法。它也没有标记为[Serializable],所以字节数组是不可能的 能否以某种方式将Viewbag对象的状态保存到可管理的数据库对象中? 您能否以某种方式覆盖或扩展Viewbag的行为 我想完全放弃Viewbag。Viewbag是一个继承的。使用“GetDynamicMemberNames”获取键很简单,但是获取值要稍微详细一些。以下内容将Vie

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

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

我想完全放弃Viewbag。

Viewbag是一个继承的。使用“GetDynamicMemberNames”获取键很简单,但是获取值要稍微详细一些。以下内容将ViewBag转换为字典(无耻地抄袭并借用):

var values=newdictionary();
IEnumerable keys=ViewBag.GetDynamicMemberNames();
foreach(字符串键入键)
{
var binder=Microsoft.CSharp.RuntimeBinder.binder.GetMember(
CSharpBinderFlags。无,键,
ViewBag.GetType(),
新[]{CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None,null)};
var callsite=callsite.Create(活页夹);
var val=callsite.Target(callsite,ViewBag);
添加(键,值);
}

我想彻底抛弃Viewbag

这听起来是个好主意——如果可能的话,最好使用强类型视图模型。

ViewBag是一个继承。使用“GetDynamicMemberNames”获取键很简单,但是获取值要稍微详细一些。以下内容将ViewBag转换为字典(无耻地抄袭并借用):

var values=newdictionary();
IEnumerable keys=ViewBag.GetDynamicMemberNames();
foreach(字符串键入键)
{
var binder=Microsoft.CSharp.RuntimeBinder.binder.GetMember(
CSharpBinderFlags。无,键,
ViewBag.GetType(),
新[]{CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None,null)};
var callsite=callsite.Create(活页夹);
var val=callsite.Target(callsite,ViewBag);
添加(键,值);
}

我想彻底抛弃Viewbag


这听起来是个好主意——如果可能的话,最好使用强类型视图模型。

您能使用类似JSON.NET的东西对其进行序列化吗?我根本没有研究过JSON.NET。你能给出一个如何实现这一点的指针吗?是的,完全废弃
ViewBag
,或者将其保留在容易在每次执行action方法时重新填充的琐碎情况下。你能用JSON.NET之类的东西对其进行序列化吗?我根本没有看过JSON.NET。你能给出一个如何实现这一点的指针吗?是的,完全废弃
ViewBag
,或者将其保留在容易在每次执行action方法时重新填充的小情况下。
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);
}