<asp:DropDown>
我有一个带有两个控件的网页:
当用户选择一个国家时,我想填写州列表。
尝试 #1 - OnSelectedIndexChanged
第一件事很简单:在OnSelectedIndexChanged
第一个下拉菜单中,填写第二个框:
//be sure to set AutoPostBack of cbCountry to true in the properties window
protected void cbCountry_SelectedIndexChanged(object sender, EventArgs e)
{
cbState.Items.Clear();
FetchStatesForCountryIntoStateDropDown(cbState, cbCountry.SelectedValue);
if (cbState.Items.Count > 0)
cbState.SelectedIndex = 0;
}
这工作得很好,除了它触发了页面刷新。发送帖子时用户被打断,页面被重新加载。页面不再是他们离开的地方,他们不再坐在下拉菜单中。
尝试 #2 - 老式的 kludgey UpdatePanels
@Seglo 将 UpdatePanels 称为老式的杂物。但是因为我找不到更好的东西 - 让我们试试吧!将这些东西包装在更新面板中,让它发挥作用:
这样做的问题是,当UpdatePanel
更新时,它会删除两个控件并用新控件替换它们。这意味着用户在第一个下拉菜单中失去了焦点。人们建议使用 javascript 尝试保存和恢复焦点的可怕 kludges。但我宁愿正确地做事。
尝试 #3 - 仅 UpdatePanel 您需要更新的内容
我不需要更新国家下拉列表(也不需要标签)。我只需要更新状态下拉列表;那么为什么不只将它包装在一个<asp:UpdatePanel>
. 事实上,这是 StackOverflow 上建议的答案:
那行得通。国家下拉菜单不会失去焦点。事件OnSelectedIndexChanged
触发,状态下拉列表填充...
...我第一次更改国家/地区下拉菜单。
如果我再次更改Country ,则会引发异常:
无效的回发或回调参数。
不知何故,更新面板弄乱了 WebForms 控件;使回发数据无效。这是有道理的,因为弄乱了 WebForms 控件会使回发数据无效。
尝试 #4 - 尝试自己使用 javascript 伪造回发
它不会给你带来任何好处;但人们已经尝试通过 javascript 手动触发回发:
$('#userControl1').on('focusout', function() {
__doPostback('UpdatePanel2UniqueId', '');
});
除非不知道and ClientID
,否则脚本不会运行;我也不知道它是否能解决我的问题cbCountry
UpdatePanel1
尝试 #5 -PageMethods
用于获取状态列表。
现在我只链接其他人的随机建议。我需要大约 4 个小时来尝试实施任何建议。这意味着我已经失去了一天半的时间来尝试填充组合框。
我不能为我在谷歌上找到的每一个随机建议浪费一天的时间;我需要一个实际的答案。所以我把他们包括在内只是为了向脾气暴躁的人展示研究工作(好像研究工作很重要)。
有人建议调用 ASP.net PageMethods
,并更新cbState
客户端 javascript:
function GetStates(country)
{
PageMethods.GetTeam(teamCode, CountryCallback);
}
function CountryCallback(result)
{
var teamName = $get('TeamName');
var seed = $get('Seed');
var rpi = $get('RPI');
var scoutingReport = $get('ScoutingReport');
teamName.innerText = result.TeamName;
seed.innerText = result.Seed;
rpi.innerText = result.RPI;
scoutingReport.innerText = result.ScoutingReport;
}
onchange="GetTeam(this.options[this.selectedIndex].value);"
这里的问题与尝试#2 相同。视图状态将是错误的,因为我已经搞砸了 ASP.net 背后的表单。
似乎存在一个根本问题,即 ASP.net 和viewstate从根本上与客户端 DOM 更新不兼容。任何修改页面客户端的尝试都会使整个 ASP.net Web 表单编程模型无效。