部分回发后组合框启用状态重置
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);
背景
我有一个搜索功能,允许最终用户在数据库中搜索项目。此搜索功能有一个文本框、两个组合框和一个按钮。
当组合框项目中的一个被选中时,另一个的值会发生变化,并且它被设置为禁用。这是由 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);