2013-08-26 63 views
2

我們在我們的MVC項目中有一個自定義的緩存系統,我們在控制器中保存和加載我們的模型。我們也使用Viewbag對象,但是我們無法找到保存此對象狀態的方法。它也沒有被標記爲[Serializable],因此字節數組不可用。是否可以序列化或保存viewbag狀態?

您能否以某種方式將Viewbag對象的狀態保存到可管理的數據庫對象中? 你可以用某種方式覆蓋或擴展Viewbag的行爲嗎?

我覺得完全廢棄Viewbag。

+0

你可以使用類似JSON.NET的序列化它? – DavidN

+0

我還沒有看過JSON.NET。你能否指出這將會是怎樣的可能? –

+0

是的,完全棄用'ViewBag'或將其保留爲瑣碎的情況,在每次執行操作方法時都很容易重新填充。 –

回答

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。

這聽起來像個好主意 - 儘可能使用強類型的視圖模型。

相關問題