2009-12-03 73 views
0

說我有一個屬性像...修改視圖狀態的值

public object MyObject 
{ 
    get { return (object)ViewState["myobject"]; } 
    set { ViewState["myobject"] = value; } 
} 

我修改,像這樣的對象...

object myObjCopy = MyObject; 
myObjCopy.ChangeSomething(); 
MyObject = myObjCopy; 

這是正確的方法?它感覺真的很笨重,我不知道我是否錯過了一些東西。有沒有一些聰明的範例可以更直觀地修改視圖狀態,而不需要在代碼中的任何地方使用臨時複製。

回答

0

正確的答案是,你不應該修改視圖狀態。您的控制器應該只是在返回視圖之前創建模型並填充視圖狀態。如果您在視圖中編寫代碼,則會遇到更大的問題。一般來說,視圖應該包含很少(如果有的話)改變或執行操作的代碼。

編輯:糟糕,我想我剛剛得到ViewData(在asp.net mvc中)與viewdata混淆。對不起...回答你真正的問題,是的,這只是唯一的方法:-)當你處理像視圖狀態那樣的「包」API時,它並不是非常笨重。

1

使用您定義的屬性,您不需要進行任何複製,就像您擁有的一樣。我不確定ChangeSomething()是什麼,但你應該可以直接在屬性上調用它。我通常會拔不出來作爲一個對象......這已經有一段時間,因爲我做了純粹的web表單的發展,但我的ViewState的幫手屬性通常看起來更像是:

public string CurrentUsername 
{ 
    get 
    { 
     if (ViewState["Username"] is string) 
      return (string)ViewState["Username"]; 
     return null; 
    } 
    set { ViewState["Username"] = value; } 
} 

編輯:關於它的思考,我猜複製可能只是爲了在每次引用屬性時刪除潛在的性能開銷。我不認爲這是在大多數情況下,一個有效的優化,但是如果你感到強烈的話,你可以像這樣的東西隱藏:

private string m_CurrentUsername; 
public string CurrentUsername 
{ 
    get 
    { 
     if (m_CurrentUsername == null && ViewState["Username"] is string) 
      m_CurrentUsername = (string)ViewState["Username"]; 
     return m_CurrentUsername; 
    } 
    set { ViewState["Username"] = m_CurrentUsername = value; } 
} 

就像我,雖然說 - 我不會推薦。

+0

我認爲你是過分分析我的問題,我並不關心投射開銷,我只是想舉一個簡單的例子。問題是,如果ChangeSomething()返回一個對象,我可以寫MyObject = MyObject.ChangeSomething();這很好,但如果ChangeSomething()返回void並修改實例變量,則不能直接使用MyObject.ChangeSomething()修改視圖狀態,只要該屬性包裝了普通實例變量即可。至少這是我在嘗試時看到的。我認爲這是與被序列化的底層對象有關。 – fearofawhackplanet 2009-12-03 18:32:29