使用反射器我在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
指向SelectedValue
的{{1}}。
我认为这意味着:
DropDownList
将是之前在同一请求中设置的值(即之前已调用obj2
)或UpdateValue
如果尚未设置其他值。< / LI>
null
DropDownList
不能SelectedValue
null
永远不会为空。obj3
将始终在任何请求中第一次调用OnParametersChanged
时调用。但是如果在PostBack期间将相同的条目加载到UpdateValues
ASP.NET保留了PostBack列表中的选择,即使ViewState被禁用(我只能猜测如何这有效,但确实......)。
这归结为以下内容:如果禁用了ViewState,并且在每个请求中将相同的值加载到DropDownList
并且用户选择了“很久以前”的条目X并通过其他方式触发了PostBack更改DropDownList中的选择ASP.NET将在DropDownList
上触发ParametersChanged
- 事件(因为上面列表中的#3),尽管在我的理解中参数没有改变它的值。
我错了,或者这是否意味着如果此行为导致问题,我不能(不应该)禁用ViewState?
更新(与问题没有直接关系)
只是为了解决ParameterCollecion
如果禁用了视图状态,如何通过帖子保留所选值的问题:通过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;
}
ed数据中所选项目的值,如果它可以在POST
包含的项目列表中找到带有此键的项目,则将其设置为已选中。
答案 0 :(得分:0)
您是对的:如果您希望ASP.NET Web控件“已更改”事件和行为起作用,则无法禁用viewstate。
它们用于确定是否存在更改的基本机制是将viewstate中序列化的值与等效的发布值(如果有)进行比较。 TextBox.TextChanged
(例如)在其类文档中明确说明了这一点:
TextBox控件必须保留一些 邮件到服务器之间的值 这个事件能正常工作。确定 为此启用了视图状态 控制。