2009-12-03 70 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