【问题标题】:SemanticUI dropdown menu does not pick up menu items dynamically语义 UI 下拉菜单不会动态选择菜单项
【发布时间】:2017-11-29 05:13:18
【问题描述】:

我需要使用语义下拉菜单根据所选国家/地区显示州名。所以,我在后台使用单独的 asp: DropDownList for country 和 state 从数据库中获取数据。在 Page_Load() 上,我将后端代码中的菜单项构造为 HTML 字符串,以供语义下拉菜单加载和显示菜单项。每次我改变国家时它都很好。但是每次重新加载整个页面感觉都不好。

现在,我正在尝试仅刷新状态下拉列表(语义下拉列表)而不重新加载页面。 因此,我将 asp: dropdownlist 控件放置在 asp: UpdatePanel 中以进行页面的部分呈现。但是当我更改国家/地区时,状态下拉列表不会选择更新面板中加载的更新值。 在调试时,我可以看到在 asp 下拉列表中更新的状态值和在后端的 HTML 字符串。

<asp:UpdatePanel ID="UpdatePanel6" runat="server">
    <ContentTemplate>
        <!-- Country Dropdown and sql data source-->
        <asp:SqlDataSource ID="SqlDataSourceCountry" runat="server" ConnectionString="<%$ ConnectionStrings:.......%>"
            SelectCommand="......." SelectCommandType="StoredProcedure"></asp:SqlDataSource>
        <asp:DropDownList ID="DropDownListCountry" runat="server" AutoPostBack="True" DataSourceID="......"
            DataTextField="CountryName" DataValueField="CountryCode" Style="display: none">
        </asp:DropDownList>

        <!-- State Dropdown and sql data source-->
        <asp:SqlDataSource ID="SqlDataSourceState" runat="server" ConnectionString="<%$ ConnectionStrings:..... %>"
            SelectCommand=".........." SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter ControlID="......" Name="EnterCountryCode" PropertyName="......." Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:DropDownList ID="DropDownListState" runat="server" AutoPostBack="True" 
            DataSourceID="......" DataTextField="....." DataValueField="......" Style="display: none">
        </asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>

<div id="dvIDCountryCodeDropdownClone" class="ui selection dropdown dvDropDownCountry">
     <input type="hidden" name="countryDropdown">
     <i class="dropdown icon"></i>
     <%=strClsCountryNameHTML%>
</div>
<div id="dvIDStateCodeDropdownClone" class="ui selection dropdown dvStateCityDropDown">
    <input type="hidden" name="stateDropdown">
    <i class="dropdown icon"></i>
    <%=strClsStateNameHTML%>
</div>

这里是初始化下拉菜单的脚本

<script type="text/javascript">
$('#dvIDCountryCodeDropdownClone').dropdown();
    $('#dvIDStateCodeDropdownClone').dropdown();
</script>

我也在 pageLoad() 中尝试过这种初始化,但没有奏效。 我搜索了文章并尝试了建议的选项,例如再次初始化下拉列表,(.ui.dropdown).dropdown("refresh") 等。没有解决问题。

谁能给我一些解决这个问题的想法?

【问题讨论】:

    标签: javascript html vb.net webforms semantic-ui


    【解决方案1】:

    UpdatePanel 执行 ajax 并仅更新其中具有 ID 和 runat="server" 的组件和元素。

    做这样的事情:

    ASPX

    <asp:UpdatePanel ID="UpdatePanel6" runat="server">
        <ContentTemplate>
    
            // SqlDataSources and DropDownLists
    
            <div id="dvIDCountryCodeDropdownClone" class="ui selection dropdown dvDropDownCountry">
                <input type="hidden" name="countryDropdown">
                <i class="dropdown icon"></i>
                <div id="countryDropdown" class="menu" runat="server" >
                </div>
            </div>
            <div id="dvIDStateCodeDropdownClone" class="ui selection dropdown dvStateCityDropDown">
                <input type="hidden" name="stateDropdown">
                <i class="dropdown icon"></i>
                <div id="stateDropdown" class="menu" runat="server" >
                </div>
            </div>
    
        </ContentTemplate>
    </asp:UpdatePanel>
    

    不要忘记设置id="UniqueId"runat="server"

    您可以观察 SqlDataSource 的“OnSelected”或“OnDataBinding”事件并执行以下操作:

    private void FeedCountryDropDown(IEnumerable<Country> countries)
    {
        if (countries == null || !countries.Any())
            return;
    
        var sb = new StringBuilder();
        foreach(var c in countries)
        {
            sb.Append("<div class=\"item\" data-value=\"")
                .Append(c.Id.ToString())
                .Append("\">")
                .Append(c.Name)
                .Append("</div>");
        }
        countryDropdown.InnerHtml = sb.ToString();
    }
    
    private void FeedStatesDropDown(IEnumerable<State> states)
    {
        if (states == null || !states.Any())
            return;
    
        var sb = new StringBuilder();
        foreach (var s in states)
        {
            sb.Append("<div class=\"item\" data-value=\"")
                .Append(s.Id.ToString())
                .Append("\">")
                .Append(s.Name)
                .Append("</div>");
        }
        stateDropdown.InnerHtml = sb.ToString();
    }
    

    Ajax 操作后下拉列表刷新

    <script>
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        $('#dvIDCountryCodeDropdownClone').dropdown();
        $('#dvIDStateCodeDropdownClone').dropdown();
    
        prm.add_endRequest(function () {
            $('#dvIDCountryCodeDropdownClone').dropdown('refresh');
            $('#dvIDStateCodeDropdownClone').dropdown('refresh');
        });
    </script>
    

    【讨论】:

    • 您好,Henry,它第一次很好用。当我第二次选择另一个国家时,它不起作用。可能是什么问题?
    • 您是否在语义下拉列表中进行更改?当您更改时,是否调用回发到服务器?
    • 是的,我正在更改语义下拉菜单。当我更改时,不会调用回发。
    • 您可能误解了 asp.net 网络表单。 WebForms 通过视图状态引擎模拟状态。 runat="server" 告诉 asp.net webform 什么保存在 viewstate 中以及哪些 Html 元素转换为服务器中的控件,这就是为什么我建议你在我的答案中写 runat="server" 。您需要在脚本管理器中注册一个事件以强制回发。请参阅THIS 链接了解如何操作。
    • THIS 的回答中,我给出了如何强制回电的建议。
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多