Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET ParameterCollection(或其ParametersChanged事件)是否依赖于viewstate?_C#_Asp.net_Viewstate - Fatal编程技术网

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

C# ASP.NET ParameterCollection(或其ParametersChanged事件)是否依赖于viewstate?,c#,asp.net,viewstate,C#,Asp.net,Viewstate,使用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["P

使用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();
正如我所理解的那样(通过
这一点,.\u owner.CallOnParametersChanged()
中的
OnParameterChanged
),是什么最终触发了
ParametersChanged
事件

现在我的问题是:如果
EnableViewState
设置为
false
(例如在整个页面上),会发生什么情况?作为补充:我使用
ControlParameter
s指向
DropDownList
SelectedValue

我想这意味着:

  • obj2
    可能是在同一请求中先前设置的值(即之前调用了
    UpdateValue
    ),或者如果尚未设置其他值,则为
    null
  • 作为
    DropDownList
    s
    SelectedValue
    不能为
    null
    obj3
    永远不会为null
  • OnParametersChanged
    总是在任何请求中第一次调用
    updateValue
    时调用
  • 但是,如果在回发期间将相同的条目加载到
    DropDownList
    ,则ASP.NET会在整个回发过程中保留列表中的选择,即使ViewState被禁用(我只能猜测它是如何工作的,但它会…)

    这归结为以下几点:如果ViewState被禁用,并且在每次请求时都将相同的值加载到
    DropDownList
    ,并且用户“很久以前”就选择了条目X并通过除更改下拉列表中的选择之外的其他方式触发回发ASP.NET将在
    参数集合
    上触发一个
    参数更改
    -事件(因为上面列表中的#3),尽管据我所知,该参数没有更改其值

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


    更新(与问题无直接关系)

    为了解决在禁用viewstate时,
    DropDownList
    如何通过回发保留所选值的问题:通过其
    IPostBackDataHandler
    的实现

    反射器显示(在<代码>下拉列表中<代码>):


    因此,它本质上检索
    POST
    ed数据中所选项目的值,如果它能在
    DropDownList
    包含的项目列表中找到具有此键的项目,它会将其设置为已选项目。

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

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

    TextBox控件必须保留一些 在发送到服务器的 此事件无法正常工作。确定 该视图状态已为此启用 控制

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