用ASP.NET AJAX填充列表后更新viewstate

时间:2020-03-06 14:57:34  来源:igfitidea点击:

我有一个下拉列表,该列表通过使用ASP> .NET AJAX的Web服务进行填充。在javascript中方法的成功回调中,我通过循环填充了下拉列表:

function populateDropDown(dropdownId, list, enable, showCount) {
    var dropdown = $get(dropdownId);
    dropdown.options.length = 1;    
    for (var i = 0; i < list.length; i++) {
        var opt = document.createElement("option");
        if (showCount) {
            opt.text = list[i].Name + ' (' + list[i].ChildCount + ')';
        } else {
            opt.text = list[i].Name;
        }
        opt.value = list[i].Name;
        dropdown.options.add(opt);
    }
    dropdown.disabled = !enable;    
}

但是,当我提交该控件处于打开状态的表单时,该控件的列表在回发时始终为空。如何获取填充的列表数据以保留回发?

编辑:也许我要倒退。一个更好的问题可能是,由于必须经历整个页面生命周期,如何在不使用updatepanel的情况下从Web服务填充下拉列表?

解决方案

为此,我们需要使用Request.Form,我们不能从客户端即时加密ViewState,否则将破坏它的整个要点:)。

编辑:响应编辑:)页面生命周期是允许我们首先使用ViewState持久性的东西。控制树在那里处理,好吧,它周围没有任何东西。

Request.Form是一种完美可行的方法,它可以告诉我们选择的值。如果我们想知道所有值,则可以对隐藏的控件进行某种类型的序列化。

丑陋的,是的,但这就是为什么上帝(有人称他为ScottGu)发明了ASP.NET MVC :)的原因。

尽管我不太确定它是如何做到的,但是AJAX控件工具包中的CascadingDropDown确实支持此功能。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

这是执行此操作的行:

AjaxControlToolkit.CascadingDropDownBehavior.callBaseMethod(this, 'set_ClientState', [ this._selectedValue+':::'+text ]);

但是最简单的想法是将所选值放入回发事件的隐藏输入字段中。