使用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
.
我想这意味着:
-
obj2
可能是在同一请求(即
UpdateValue
以前被叫过)或
null
如果尚未设置其他值。
-
作为一个
下拉框
S
选择值
不能
无效的
obj3
永远不会是空的。
-
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
如果它可以在项目列表中找到具有此键的项目,
下拉框
包含将其设置为选中。