7

我在一个页面上有两个 ASP.NET 下拉列表控件。第一个回调服务器并获得一个数组,该数组返回给客户端并用于通过 javascript 填充第二个下拉列表。但是,如果我在第二个(和新填充的)下拉列表中进行选择,然后进行回发,则第二个下拉列表的选择和内容将丢失。这是一个问题,因为我需要获取选定的值并在回发后保留列表的内容。

我该如何解决?我认为这是在回发之前的某个时间点更新视图状态的问题?


我正在填充的控件是 ASP.NET 下拉列表。这是我用来填充它们的javascript。

正在使用的代码如下(为简洁起见略有删减):

我正在填充的 ASP.NET 控件:

<asp:DropDownList ID="ddlStateCounty" runat="server" OnSelectedIndexChanged="ddlStateCounty_OnSelectedIndexChanged" AutoPostBack="true" />

获取逗号分隔值列表的回调代码:

public void RaiseCallbackEvent(string eventArgument)
    {
    return "1, 2, 3";
}

Javascript人口代码:

function ReceiveServerData(retValue)
{ 
    var statesArray = retValue.split(',');
    var statesList = document.getElementById('{0}');

    if (statesArray.length > 0 && statesList != null)
        {
                for (var j = 0; j < statesArray.length; j++)
            {
                    var newOption = document.createElement('OPTION');
                        statesList.options.add(newOption);
            newOption.value = statesArray[j].toString().trim();
                    newOption.innerText = statesArray[j];
                }
    }
}
4

4 回答 4

6

您说您没有正确的 ViewState 是正确的,这就是当您将数据发布回服务器时未填充值的原因。

强烈建议您迁移到在 ASP.NET AJAX 控件工具包(它同时具有 .NET 2.0 和 .NET 3.5 版本)中使用Cascading Drop Down,因为它可以满足您的需求,并且通过回发进行维护。

您的另一个选择是onchange在 JavaScript 填充的下拉列表中设置一个事件,然后在其中填充一个隐藏字段,因为该字段将被发送回服务器,并且提交的值将在发布的数据中维护,一些喜欢:

$addHandler('change', $get('dynamicDDL'), function () { $get('hiddenField').value = this.options[this.selectedIndex].value; });

对于演示,我使用 MS AJAX 简写来添加事件等。关于我使用的方法的更多信息可以在这里找到:http: //msdn.microsoft.com/en-au/library/bb397536.aspx

于 2009-01-06T12:34:40.587 回答
3

Request.Form[Control.UniqueID] 为您提供选定的值。

于 2009-08-03T05:06:34.017 回答
1

只需使用 response.forms 集合来获取所选值。

于 2009-01-06T12:14:49.083 回答
0

我猜“你不是用 asp.net 的方式做事”。

在我看来,如果您的 javascript 修改不是本机 asp.net,那么您填充的元素不是 asp.net 控件,因此您会在回发中丢失它们。asp.net 确实需要它的模型和实际页面之间的紧密绑定。

不过可能有点离谱-如果您可以发布一些代码会有所帮助。(JS 和代码隐藏方法)

编辑新信息:

是的 - 所以你基本上是通过基于 AJAXified 返回字符串(?)的 JS 来创建一个完全正常的 html 元素负载,asp.net 代码隐藏没有任何概念。如果没有自己设置测试应用程序,我不能 100% 确定这是问题所在,但这听起来是正确的。

然后检查 Request.Forms - 正如其他人所建议的那样 - 将是目前解决此问题的最简单方法,但您应该记住,asp.net 变得越来越痛苦,您越偏离按照它想要的方式做事你去。我认为值得研究如何从代码隐藏中添加这些新选项。

于 2009-01-06T12:07:33.200 回答