【发布时间】: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 指向DropDownList 的SelectedValue。
我认为这意味着:
-
obj2可能是之前在同一个请求中设置的值(即UpdateValue之前已被调用)或null(如果尚未设置其他值)。 - 作为
DropDownListsSelectedValue不能为nullobj3永远不会为空。 -
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 包含的项目列表中找到具有此键的项目,则将其设置为选定。
【问题讨论】: