部分回发后组合框启用状态重置

Combobox enabled state reset after partial postback

背景

我有一个搜索功能,允许最终用户在数据库中搜索项目。此搜索功能有一个文本框、两个组合框和一个按钮。

当组合框项目中的一个被选中时,另一个的值会发生变化,并且它被设置为禁用。这是由 Javascript 完成并有效的。

所有控件都在更新面板中。

问题

更新面板的回调完成后,禁用的组合框将被重置,将其呈现为启用。

我的猜测

Javascript 所做的更改未保存到视图状态并在初始请求中发回。

任何人都可以阐明这个问题吗?

代码

ASP

<asp:UpdatePanel runat="server" ID="UPJobDetailSearch" ChildrenAsTriggers="true">
            <ContentTemplate>
              <div id="searchbox" class="searchbox">
                    <dx:ASPxTextBox ID="TxtSearchTerm" runat="server" CssClass="searchbox" name="searchbox" NullText="Search for.." SkinID="None" />
                </div>
                <div id="searchcombo">
                     <dx:ASPxComboBox ID="CbSearchCriteria" ClientInstanceName="CbSearchCriteria" Width="150" CssClass="combobox" AutoPostBack="false" NullText="Choose Criteria" runat="server" SelectedIndex="-1" SkinID="None">
                    <dx:ASPxComboBox ID="CbSearchCriteria" ClientInstanceName="CbSearchCriteria" Width="150" CssClass="combobox" AutoPostBack="false" NullText="Choose Criteria" runat="server" SelectedIndex="-1" SkinID="None">
                        <Items>
                            <dx:ListEditItem Text="Id" Value="ID" />
                            <dx:ListEditItem Text="Num" Value="NUM" />
                        </Items>
                    </dx:ASPxComboBox>
                </div>
                <div id="searchLocationcombo">
                    <dx:ASPxComboBox ID="CbSearchLocationCriteria" ClientInstanceName="CbSearchLocationCriteria" CssClass="combobox" AutoPostBack="false" runat="server" NullText="Location" SelectedIndex="-1" SkinID="None"
                        ClientSideEvents-SelectedIndexChanged="function(s,e){ ChangeSearchCriteriaItem(s,e); }">
                        <Items>
                            <dx:ListEditItem Text="Jobs" Value="Jobs" />
                            <dx:ListEditItem Text="Comms" Value="Comms" />
                        </Items>
                    </dx:ASPxComboBox>
                </div>
                <div id="SearchBtn" class="searchbtn">
                    <dx:ASPxButton ID="BtnSearch" CssClass="BtnSearch" runat="server" Text="Search" OnClick="BtnSearch_Click" ClientSideEvents-Click="function(){ ShowSearching(); }" />
                </div>
        </ContentTemplate>
 </asp:UpdatePanel>

注意。我的控件是 DevExpress aspx 控件。 (不过我不认为这会很重要)

Javascript

 function ChangeSearchCriteriaItem(s, e) {
            debugger;

            var cmbLocationCriteria = ASPxClientControl.GetControlCollection().GetByName("CbSearchLocationCriteria")
            var selecteditem = cmbLocationCriteria.GetSelectedItem();
            var cmbSearchCriteria = ASPxClientControl.GetControlCollection().GetByName("CbSearchCriteria");

            if (selecteditem.text == "Comms Log") {

                cmbSearchCriteria.SetValue("JobId");
                cmbSearchCriteria.SetEnabled(false);
            }
            else {
                cmbSearchCriteria.SetEnabled(true);
            }
        }

这是 WebForms 中的常见问题。是的,你的猜测是正确的。启用状态未保存在 ViewState 中。

最好的方法是使用 pageLoad 函数:

<script> 
   ///<summary>
   ///  This will fire on initial page load, 
   ///  and all subsequent partial page updates made 
   ///  by any update panel on the page
   ///</summary>
   function pageLoad(){ alert('page loaded!') }  
</script>

在 pageLoad 函数中,您可以根据需要重置启用状态。

第二个选项

您还可以尝试在回发事件的代码隐藏中注册一个 ClientScript,第三个参数将是您的 JavaScript 函数,将在回发完成后调用。在此示例中,您将在函数 'javascriptFunctionName':

中设置启用状态
ClientScriptManager.RegisterStartupScript(
       typeof(page1), 
       "CssFix", 
       "javascriptFunctionName()", 
        true);