用户控件(ascx)和属性

Jag*_*agd 21 asp.net viewstate user-controls properties

我发现在用户控件中保留属性值的唯一方法是使用ViewState.

public string Title {
        get { return Convert.ToString(ViewState["Title"]); }
        set { ViewState["Title"] = value; }
    }
Run Code Online (Sandbox Code Playgroud)

我不能说我对此印象非常深刻,因为用户控件的属性越多,你就越容易陷入ViewState.是否有更好的方法来坚持物业?

Say*_*imi 10

这取决于.如果您需要将属性值保留在post-back之外,那么您将不得不使用ViewState或Session.由于这些控件是在每个帖子上重新创建的,否则你无法真正维护该状态.


dar*_*iom 8

使用ViewState存储用户控件的属性值完全没有问题.

您的声明"用户控件拥有的属性越多,您将在ViewState中保留的垃圾越多"并不一定如此.当然可以让ViewState跟踪控件属性的值,但不能将数据存储在__VIEWSTATE隐藏表单字段变量中.

听起来很疯狂吧?有关ViewState如何工作的精彩文章,请参阅TRULY了解ViewState.

这取决于您在其生命周期中初始化控件属性的时间.在控件开始跟踪属性值的更改__VIEWSTATE后,ViewState将仅存储在隐藏字段中StateBag.这种情况发生在OnInit生命周期早期的控制方法中,但是有一些技术可以提前设置您的属性值,这不会产生__VIEWSTATE膨胀的成本,并且仍然会给您带来所有好处.

请参阅链接的文章.它比我更清楚,更好地讨论了一切:-)


Ste*_*fan 5

你的问题正是ViewState的用途:要在回发后保持控件的属性,所以你的解决方案就好了.

您可以将其保存在会话中,但这实际上只会给服务器带来负担.根据您拥有的用户数量,这可能会很快变得非常难看.

另请注意,如果您使用会话,您必须做一些内务管理.例如,如果要在同一页面上使用两次用户控件,则需要确保每个控件都使用唯一的会话变量.