【问题标题】:Does the ASP.NET ParameterCollection (or its ParametersChanged event) depend on viewstate?ASP.NET ParameterCollection(或其 ParametersChanged 事件)是否依赖于视图状态?
【发布时间】:2011-03-01 13:35:32
【问题描述】:

使用反射器我在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-事件(通过OnParameterChanged 中的this._owner.CallOnParametersChanged())。

现在我的问题是:如果 EnableViewState 设置为 false(例如在整个页面上)会发生什么?作为附录:我使用ControlParameters 指向DropDownListSelectedValue

我认为这意味着:

  1. obj2 可能是之前在同一个请求中设置的值(即 UpdateValue 之前已被调用)或 null(如果尚未设置其他值)。
  2. 作为DropDownLists SelectedValue 不能为null obj3 永远不会为空。
  3. OnParametersChanged 总是会在任何请求中第一次调用UpdateValues 时被调用

但是如果 在 PostBack 期间将相同的条目加载到 DropDownList ASP.NET 会在整个 PostBack 的列表中保留选择,即使 ViewState 被禁用(我只能猜测它是如何工作的但它确实......)。

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

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


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

只是为了摆脱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;
}

因此,它实质上检索POSTed 数据中选定项目的值,如果它可以在DropDownList 包含的项目列表中找到具有此键的项目,则将其设置为选定。

【问题讨论】:

    标签: c# asp.net viewstate


    【解决方案1】:

    您是对的:如果您希望 ASP.NET Web 控件“更改”事件和行为正常工作,则不能禁用视图状态。

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多