C# ASP.NET ParameterCollection(或其ParametersChanged事件)是否依赖于viewstate?
使用reflector,我在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
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
sSelectedValue
不能为null
obj3
永远不会为nullOnParametersChanged
总是在任何请求中第一次调用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;
}