代码之家  ›  专栏  ›  技术社区  ›  scherand

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

  •  1
  • scherand  · 技术社区  · 16 年前

    使用Reflector,我在 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 S指向 SelectedValue A的 DropDownList .

    我想这意味着:

    1. obj2 可能是在同一请求(即 UpdateValue 以前被叫过)或 null 如果尚未设置其他值。
    2. 作为一个 下拉框 S 选择值 不能 无效的 obj3 永远不会是空的。
    3. OnParametersChanged 将始终调用 第一次 UpdateValues 在任何请求中调用 .

    但是如果 相同的条目加载到 下拉框 在回邮过程中 即使禁用了viewstate,ASP.NET也会在回发过程中将所选内容保留在列表中(我只能猜测它是如何工作的,但它确实是…)。

    这可以归结为以下几点:如果禁用了ViewState,并且正在将相同的值加载到 下拉框 对于每个请求,用户都选择了条目X“long ago”,并通过其他方式触发回发,而不是更改DropDownList ASP.NET中的选择,这将激发 参数已更改 -事件上 ParameterCollecion (由于上述列表中的3),尽管我认为参数并未改变其值。

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


    更新 (与问题无关)

    只是为了摆脱这个问题 下拉框 如果禁用了视图状态,则通过回发来保留所选值:通过其实现 IPostBackDataHandler …

    反射窗(英寸 下拉框 ):

    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;
    }
    

    因此,它基本上检索 POST 如果它可以在项目列表中找到具有此键的项目, 下拉框 包含将其设置为选中。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Jeff Sternal    16 年前

    您是正确的:如果希望ASP.NET Web控件“已更改”事件和行为正常工作,则无法禁用ViewState。

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

    文本框控件必须保留一些 发送到服务器的邮件之间的值 此事件正常工作。务必 已为此启用该视图状态 控制。

    推荐文章