部分回发后,Combobox启用状态重置

时间:2017-05-15 08:45:55

标签: javascript asp.net callback updatepanel viewstate

背景

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

当选择其中一个组合框项目时,其他值会更改,并且它将被设置为禁用。这是通过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>

NB。我的控件是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);
            }
        }

1 个答案:

答案 0 :(得分:1)

这是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功能中,您可以根据需要重置启用状态。

第二个选项

您还可以尝试在回发事件中在CodeBehind中注册ClientScript,第三个参数将是您的JavaScript函数,并在回发完成后调用。在此示例中,您将在函数'javascriptFunctionName'中设置启用状态:

ClientScriptManager.RegisterStartupScript(
       typeof(page1), 
       "CssFix", 
       "javascriptFunctionName()", 
        true);