当用户选择要填写状态列表的国家/地区时.
尝试#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 calls UpdatePanels an old-fashioned kludge.但是因为我找不到更好的东西 – 让我们来试试吧!将内容包装在更新面板中,让它实现它的神奇之处:
问题在于,当UpdatePanel更新时,它会删除这两个控件并用新的控件替换它们.这意味着用户在第一个下拉列表中失去了焦点.人们建议horrible kludges using javascript to try to save and restore the focus.但我宁愿做正确的事情.
尝试#3 – 仅UpdatePanel您需要更新的内容
我不需要更新国家/地区下拉列表(也不需要更新标签).我只需要更新州下拉列表;那么为什么不在< asp:UpdatePanel>中包装它呢?事实上this is the answer suggested on StackOverflow:
这很有效.国家下拉列表不会失去焦点.触发OnSelectedIndexChanged事件,并且状态下拉列表填充…
……我第一次改变国家下拉菜单.
如果我再次更改国家/地区,则会抛出异常:
Invalid postback or callback argument.
不知何故,updatepanel正在搞乱WebForms控件;使回发数据无效.这是有道理的,因为搞乱WebForms控件会使回发数据无效.
尝试#4 – 尝试使用javascript自行伪造回发
它没有给你任何收获;但是people have tried triggering a postback manually through javascript:
$('#userControl1').on('focusout',function() { __doPostback('UpdatePanel2UniqueId',''); });
除了不知道cbCountry和UpdatePanel1的ClientID外,脚本不会运行;我甚至不知道它是否能解决我的问题
尝试#5 – 使用PageMethods获取状态列表.
现在我只是链接其他人的随机建议.我花了大约4个小时试图实施任何建议.这意味着我已经失去了一天半的时间来尝试填充一个组合框.
我无法承受在谷歌上发现的每一个随机建议都失去一天;我需要一个真正的答案.所以我只是让他们向脾气暴躁的人们展示研究工作(好像研究工作很重要).
一些people have suggested calling ASP.net PageMethods
,and update the cbState
in client 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表单编程模型无效.