Asp.net 如何填写asp:下拉列表客户端?

Asp.net 如何填写asp:下拉列表客户端?,asp.net,ajax,Asp.net,Ajax,我有一个包含两个的网页。但既然我找不到更好的了,那就让我们试试吧!将这些内容包装在更新面板中,让它发挥神奇的作用: 问题是,当更新面板更新时,它会删除两个控件并用新控件替换它们。这意味着用户在第一个下拉列表中失去了焦点。有人建议。但我宁愿做正确的事情 尝试#3-仅更新指定需要更新的内容 我不需要更新国家/地区下拉列表(也不需要更新标签)。我只需要更新状态下拉列表;那么,为什么不将其仅包装在中呢 这就行了。“国家/地区”下拉列表不会失去焦点。选中的索引已更改的事件将激发,状态下拉列表将填充

我有一个包含两个
的网页。但既然我找不到更好的了,那就让我们试试吧!将这些内容包装在更新面板中,让它发挥神奇的作用:

问题是,当更新面板更新时,它会删除两个控件并用新控件替换它们。这意味着用户在第一个下拉列表中失去了焦点。有人建议。但我宁愿做正确的事情


尝试#3-仅更新指定需要更新的内容 我不需要更新国家/地区下拉列表(也不需要更新标签)。我只需要更新状态下拉列表;那么,为什么不将其仅包装在
中呢

这就行了。“国家/地区”下拉列表不会失去焦点。选中的索引已更改的
事件将激发,状态下拉列表将填充

…我第一次更改国家下拉列表时

<script type="text/javascript">
    function ddlCountry_changed() {
        document.getElementById('<%= btnLoad.ClientID %>').click();
    }
</script>

Country:
<asp:DropDownList ID="ddlCountry" runat="server" onchange="ddlCountry_changed();">
    <asp:ListItem Text="Vietnam" Value="1"></asp:ListItem>
    <asp:ListItem Text="United State" Value="2"></asp:ListItem>
</asp:DropDownList>

<asp:UpdatePanel ID="updatePanel" runat="server">
    <ContentTemplate>
        <asp:Button ID="btnLoad" style="display: none" runat="server" OnClick="btnLoad_OnClick" />
        State:
        <asp:DropDownList ID="ddlState" runat="server">
        </asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>
如果我再次更改国家/地区,它将抛出一个异常:

回发或回调参数无效

不知何故,updatepanel正在干扰WebForms控件;使回发数据无效。这是有道理的,因为混淆WebForms控件会使回发数据无效


尝试#4-尝试自己使用javascript伪造回发 它不会给你带来任何好处;但是:

除非不知道
cbCountry
UpdatePanel1
ClientID
,否则脚本不会运行;我甚至不知道它是否能解决我的问题


尝试#5-使用
PageMethods
获取状态列表。 现在我只是把别人的随机建议联系起来。我花了大约4个小时来落实任何建议。这意味着我已经浪费了一天半的时间去填满一个组合框

我不能在谷歌上找到的每一条随机建议上浪费一天的时间;我需要一个真实的答案。所以我把他们包括进来只是为了向脾气暴躁的人表明,他们有研究工作(好像研究工作很重要)

一些:

这里的问题与第二次尝试相同。viewstate将是错误的,因为我弄乱了ASP.net背后的表单



似乎存在一个根本问题,即ASP.net和viewstate与客户端DOM更新根本不兼容。任何修改页面客户端的尝试都会使整个ASP.net web表单编程模型无效。

使用javascript更新
DropDownList
控件不会改变viewstate,这意味着在每次发布中更改都将被覆盖

我对隐藏字段中的列表内容进行了类似的JSON序列化,然后在每一篇文章中使用服务器代码对其进行反序列化

这是一个答案,它展示了一个完整的工作示例,以展示类似的内容(检查接受的答案)

编辑1 顺便说一句,为了摆脱:

回发或回调参数无效

您可以禁用viewstate验证,但不建议这样做。只有在您所在的intranet中,您可以在大部分时间信任您的用户时,才应禁用viewstate验证

<%@ Page EnableEventValidation="false"

转到下拉列表的设置


设置AutoPostBack=True,

我有一个技巧,它可以工作。它使用状态下拉列表中同一更新窗格中的隐藏按钮

<script type="text/javascript">
    function ddlCountry_changed() {
        document.getElementById('<%= btnLoad.ClientID %>').click();
    }
</script>

Country:
<asp:DropDownList ID="ddlCountry" runat="server" onchange="ddlCountry_changed();">
    <asp:ListItem Text="Vietnam" Value="1"></asp:ListItem>
    <asp:ListItem Text="United State" Value="2"></asp:ListItem>
</asp:DropDownList>

<asp:UpdatePanel ID="updatePanel" runat="server">
    <ContentTemplate>
        <asp:Button ID="btnLoad" style="display: none" runat="server" OnClick="btnLoad_OnClick" />
        State:
        <asp:DropDownList ID="ddlState" runat="server">
        </asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>
与尝试相关#1要解决页面位置问题,您可以尝试在aspx页面标题中使用此选项

<%@ Page MaintainScrollPositionOnPostback="true" %>


并在
cbCountry\u SelectedIndexChanged
方法中注册javascript,以在状态组合框中设置焦点。

使用AJAX控件工具包。。。它有一个CascadingDropDown,这将是完美的!:)


你已经搞定了,ViewState几乎会普遍阻止你做很多这类事情。这就是为什么我们从基于ViewState的模型转变为近乎纯MVC的模型。我建议使用PageMethods两次,一次更新,一次提交表单。然后在第二个PageMethod成功时重定向。(这将很快发生,你会感到惊讶)==另一种选择是使用UpdatePanel并忍受等待公平地说,有很多方法可以让你所要求的东西发挥作用,但是当你还不熟悉的时候,它们比第二页的方法花费的时间要长得多。在与UpdatePanel抗争并实施了笨拙的解决方法之后,我终于完全摆脱了它们,使用WebMethods/jQuery来实现魔力。@Dimitri修改页面客户端不会导致
无效的回发或回调参数。
执行此操作时出错?可以使用页面方法创建下拉列表。将其呈现为字符串,并使用jquery将html输出插入页面。在尝试#1中,OP提到他已经在这样做了。
<script type="text/javascript">
    function ddlCountry_changed() {
        document.getElementById('<%= btnLoad.ClientID %>').click();
    }
</script>

Country:
<asp:DropDownList ID="ddlCountry" runat="server" onchange="ddlCountry_changed();">
    <asp:ListItem Text="Vietnam" Value="1"></asp:ListItem>
    <asp:ListItem Text="United State" Value="2"></asp:ListItem>
</asp:DropDownList>

<asp:UpdatePanel ID="updatePanel" runat="server">
    <ContentTemplate>
        <asp:Button ID="btnLoad" style="display: none" runat="server" OnClick="btnLoad_OnClick" />
        State:
        <asp:DropDownList ID="ddlState" runat="server">
        </asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>
    protected void btnLoad_OnClick(object sender, EventArgs e)
    {
        ddlState.Items.Clear();

        if (ddlCountry.SelectedValue == "2")
        {
            ddlState.Items.Add(new ListItem() { Text = "California", Value = "1" });
        }
        else
        {
            ddlState.Items.Add(new ListItem() { Text = "Saigon", Value = "2" });
        }
    }
<%@ Page MaintainScrollPositionOnPostback="true" %>