ASP.NET - 丢失通过javascript填充的下拉列表选项

时间:2009-01-06 12:01:52

标签: asp.net javascript drop-down-menu

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

我该如何解决这个问题?我认为这是在回发之前的某个时刻更新viewstate的问题?


我填充的控件是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 个答案:

答案 0 :(得分:6)

您说明没有ViewState权限是正确的,这就是为什么在将数据发回服务器时不会填充值的原因。

强烈建议你迁移到使用ASP.NET AJAX Control Toolkit中的Cascading Drop Down(它同时包含.NET 2.0和.NET 3.5),就像它一样你所追求的是什么, 通过回发维护。

你的另一个选择是在填充JavaScript的下拉列表中有一个onchange事件,然后在其中填充一个隐藏字段,因为它将被发布回服务器并且提交的值将会在发布的数据中维护,例如:

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

对于演示,我使用MS AJAX简写添加事件等。有关我使用的方法的更多信息,请访问:http://msdn.microsoft.com/en-au/library/bb397536.aspx

答案 1 :(得分:3)

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

答案 2 :(得分:1)

只需使用response.forms集合即可获得所选值。

答案 3 :(得分:0)

我猜“你没有按照asp.net的方式做事”。

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

可能会离开基地 - 如果你可以发布一些代码会有所帮助。 (JS和代码隐藏方法)

修改新信息:

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

检查Request.Forms然后 - 正如其他人所建议的那样 - 现在是解决这个问题的最简单的方法,但是你应该记住,当你离开那里时,asp.net会越来越痛苦。它想要你的方式。我认为值得研究如何从代码隐藏中添加这些新选项。