【问题标题】:DropDownList AutoPostBack inside update panel loses css designs更新面板内的 DropDownList AutoPostBack 丢失 css 设计
【发布时间】:2012-12-08 07:16:57
【问题描述】:

我有这个页面结构

<MasterPage>
  <script type="text/javascript" src="../js/jquery.main.js"></script>
  <link rel="stylesheet" type="text/css" href="../css/all2.css" media="all" />
 <ContentPage>

  <updatePanel>
    <asp:DropDownList id="ddlCountry" runat="server" AutoPostBack="True"  CssClass="width_412" OnSelectedIndexChanged="ddlCountry_SelectedIndexChanged" ></asp:DropDownList>
  </updatePanel>

 </ContentPage>
</MasterPage>

现在我需要 AutoPostBack="True" 来绑定所选国家/地区的状态。

问题是 “当我输入 AutoPostBack="True"”时,我会丢失 DropDownList 设计

不带 AutoPostBack:

使用 AutoPostBack:

我进入 jquery.main.js,发现 select 的设计被动态替换了

function replaceSelects() {
for(var q = 0; q < selects.length; q++) {
if (!selects[q].replaced && selects[q].offsetWidth && selects[q].className.indexOf("default") == -1){
    selects[q]._number = q;
    //create and build div structure
    var selectArea = document.createElement("div");
    var left = document.createElement("span");
    left.className = "left";
    selectArea.appendChild(left);
    var disabled = document.createElement("span");
    disabled.className = "disabled";
    selectArea.appendChild(disabled);
    selects[q]._disabled = disabled;
    var center = document.createElement("span");
    var button = document.createElement("a");
    var text = document.createTextNode(selectText);
    center.id = "mySelectText"+q;
    var stWidth = selects[q].offsetWidth;
    selectArea.style.width = stWidth + "px";
    if (selects[q].parentNode.className.indexOf("type2") != -1){
        button.href = "javascript:showOptions("+q+",true)";
    }else{button.href = "javascript:showOptions("+q+",false)";}
    button.className = "selectButton";
    selectArea.className = "selectArea";
    selectArea.className += " " + selects[q].className;
    selectArea.id = "sarea"+q;
    center.className = "center";
    center.appendChild(text);
    selectArea.appendChild(center);
    selectArea.appendChild(button);
    //hide the select field
    selects[q].className += " outtaHere";
    //insert select div
    selects[q].parentNode.insertBefore(selectArea, selects[q]);
    //build & place options div
    var optionsDiv = document.createElement("div");
    var optionsListParent = document.createElement("div");
    optionsListParent.className = "select-center";
    var optionsListParent2 = document.createElement("div");
    optionsListParent2.className = "select-center-right";
    var optionsList = document.createElement("ul");
    optionsDiv.innerHTML += "<div class='select-top'><div class='select-top-left'></div><div class='select-top-right'></div></div>";
    optionsListParent.appendChild(optionsListParent2);
    optionsListParent.appendChild(optionsList);
    optionsDiv.appendChild(optionsListParent);
    selects[q]._options = optionsList;
    optionsDiv.style.width = stWidth + "px";
    optionsDiv._parent = selectArea;
    optionsDiv.className = "optionsDivInvisible";
    optionsDiv.id = "optionsDiv"+q;
    populateSelectOptions(selects[q]);
    optionsDiv.innerHTML += "<div class='select-bottom'><div class='select-bottom-left'></div><div class='select-bottom-right'></div></div>";
    document.getElementsByTagName("body")[0].appendChild(optionsDiv);
    selects[q].replaced = true;
    }
all_selects = true;
  }
  }

我认为更新面板在加载时会被回发,请帮帮我。

【问题讨论】:

    标签: c# javascript drop-down-menu updatepanel autopostback


    【解决方案1】:

    我进入 jquery.main.js 发现 select 的设计被动态替换了

    恐怕UpdatePanel 的工作原理是替换其中的所有内容。这就是你的样式被破坏的原因。

    如果保持样式对您很重要,您有两种选择:

    • 迁移到更原生的 AJAX 解决方案。即,捕捉 JavaScript 中的变化,然后对页面中的某些 Web 服务甚至静态方法进行 AJAX 调用,以执行您需要执行的操作。

    • 在 UpdatePanel 的每次调用完成后,看看是否有办法让 jQuery 重新设置下拉菜单的样式。

    老实说,UpdatePanel 是 Microsoft 在某种 Ajax 库上的第一次尝试,而这并不是他们的最大努力。摆脱这一点并不是最糟糕的主意。不过,我知道这不是您正在寻找的快速答案。

    【讨论】:

    • 但是应该有一些方法来保留设计元素或者重新绑定设计元素吧?
    • @sajanyamaha - 整个部分重新渲染。因此,如果您在页面首次加载时发生了一些 jQuery 样式,那么不,该 jQuery 不会自动重新触发。您要么必须手动重新启动它,要么放弃更新面板
    • 我怎样才能“重新启动”它,我尝试在更新面板中提供链接引用和 js 引用,没有用。
    • @sajanyamaha - 恐怕我不知道。我会专门提出一个新问题,并确保引用您在此下拉列表中使用的任何 jQuery 插件。
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多