1

我有一个使用 ASP>NET AJAX 通过网络服务填充的下拉列表。在 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;    
}

但是,当我提交该控件所在的表单时,该控件的列表在回发时始终为空。如何让填充的列表数据在回发中持续存在?

编辑:也许我正在倒退。一个更好的问题可能是,我如何从 web 服务中填充下拉列表,而不必使用更新面板,因为它必须运行整个页面生命周期?

4

2 回答 2

4

您需要为此使用 Request.Form - 您不能从客户端即时加密 ViewState - 它会破坏它的全部意义:)。

编辑:响应您的编辑 :) 页面生命周期是允许您首先使用 ViewState 持久性的东西。控制树是在那里处理的,而且,没有办法绕过它。

Request.Form 是一种非常可行的方法——它会告诉你选择的价值。如果你想知道所有的值,你可以对隐藏控件进行某种类型的序列化。

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

于 2008-10-01T02:57:35.893 回答
3

虽然我不确定它是如何做到的,但 AJAX 控件工具包中的 CascadingDropDown 确实支持这一点。

这是似乎做到这一点的行:

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

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

于 2008-10-01T03:01:22.000 回答