ASP.NET ParameterCollection(或其ParametersChanged事件)是否依赖于viewstate?

时间:2010-06-09 08:56:07

标签: c# asp.net viewstate

使用反射器我在System.Web.UI.WebControls.Parameter类中找到了以下代码:

internal void UpdateValue(HttpContext context, Control control)
{
    object obj2 = this.ViewState["ParameterValue"];
    object obj3 = this.Evaluate(context, control);
    this.ViewState["ParameterValue"] = obj3;
    if (((obj3 == null) && (obj2 != null)) ||
            ((obj3 != null) && !obj3.Equals(obj2)))
    {
        this.OnParameterChanged();
    }
}

该行

this.OnParameterChanged();

是最终触发ParametersChanged - 事件的内容,据我所知(通过this._owner.CallOnParametersChanged()中的OnParameterChanged)。

现在我的问题是:如果将EnableViewState设置为false(例如在整个页面上),会发生什么?作为附录:我正在使用ControlParameter指向SelectedValue的{​​{1}}。

我认为这意味着:

  1. DropDownList将是之前在同一请求中设置的值(即之前已调用obj2)或UpdateValue如果尚未设置其他值。< / LI>
  2. 由于null DropDownList不能SelectedValue null永远不会为空。
  3. obj3将始终在任何请求中第一次调用OnParametersChanged时调用
  4. 但是如果在PostBack期间将相同的条目加载到UpdateValues ASP.NET保留了PostBack列表中的选择,即使ViewState被禁用(我只能猜测如何这有效,但确实......)。

    这归结为以下内容:如果禁用了ViewState,并且在每个请求中将相同的值加载到DropDownList并且用户选择了“很久以前”的条目X并通过其他方式触发了PostBack更改DropDownList中的选择ASP.NET将在DropDownList上触发ParametersChanged - 事件(因为上面列表中的#3),尽管在我的理解中参数没有改变它的值。

    我错了,或者这是否意味着如果此行为导致问题,我不能(不应该)禁用ViewState?


    更新(与问题没有直接关系)

    只是为了解决ParameterCollecion如果禁用了视图状态,如何通过帖子保留所选值的问题:通过DropDownList的实现......

    反射器显示(在IPostBackDataHandler中):

    DropDownList

    因此它基本上检索protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) { string[] values = postCollection.GetValues(postDataKey); this.EnsureDataBound(); if (values != null) { base.ValidateEvent(postDataKey, values[0]); int selectedIndex = this.Items.FindByValueInternal(values[0], false); if (this.SelectedIndex != selectedIndex) { base.SetPostDataSelection(selectedIndex); return true; } } return false; } ed数据中所选项目的值,如果它可以在POST包含的项目列表中找到带有此键的项目,则将其设置为已选中。

1 个答案:

答案 0 :(得分:0)

您是对的:如果您希望ASP.NET Web控件“已更改”事件和行为起作用,则无法禁用viewstate。

它们用于确定是否存在更改的基本机制是将viewstate中序列化的值与等效的发布值(如果有)进行比较。 TextBox.TextChanged(例如)在其类文档中明确说明了这一点:

  

TextBox控件必须保留一些   邮件到服务器之间的值   这个事件能正常工作。确定   为此启用了视图状态   控制。