<asp:DropDown>
私は2つのコントロールを持つWebページを持っています:
ユーザーが国を選択すると、州のリストを埋めたいと思います。
試行 #1 - OnSelectedIndexChanged
最初のことは非常に簡単でした:OnSelectedIndexChanged
最初のドロップダウン中に、2 番目のボックスに入力します。
//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 を昔ながらの kludge と呼んでいます。しかし、私はそれ以上のものを見つけることができないので、試してみましょう! それらを更新パネルにラップし、それを魔法のようにします:
問題は、UpdatePanel
更新時に両方のコントロールが削除され、新しいコントロールに置き換えられることです。これは、ユーザーが最初のドロップダウンでフォーカスを失ったことを意味します。人々は、javascript を使用してフォーカスを保存および復元しようとする恐ろしいクラッジを提案しています。しかし、私はむしろ物事を正しく行いたいです。
試行 #3 - 更新する必要がある UpdatePanel のみ
国ドロップダウン (およびラベル)を更新する必要はありません。Stateドロップダウンを更新するだけです。では、それだけを でラップしてみませんか。実際、これは StackOverflow で提案されている答えです:<asp:UpdatePanel>
そして、それは機能します。国ドロップダウンはフォーカスを失いません。OnSelectedIndexChanged
イベントが発生し、Stateドロップダウンが満たされます...
...国ドロップダウンを初めて変更します。
国 を再度変更すると、例外がスローされます。
ポストバックまたはコールバック引数が無効です。
どういうわけか、updatepanelが WebForms コントロールをいじっています。ポストバック データを無効にします。WebForms コントロールをいじるとポストバック データが無効になるため、これは理にかなっています。
試行 #4 - JavaScript を使用して自分でポストバックを偽造してみてください
それはあなたに何の利益ももたらしません。しかし、人々は javascript を介して手動でポストバックをトリガーしようとしました:
$('#userControl1').on('focusout', function() {
__doPostback('UpdatePanel2UniqueId', '');
});
とを知らない場合ClientID
を除いて、スクリプトは実行されません。それが私の問題を解決できるかどうかさえわかりませんcbCountry
UpdatePanel1
試行 #5 - PageMethods
State リストを取得するために使用します。
今、私は他の人のランダムな提案をリンクしているだけです. 提案を実行しようとすると、約 4 時間かかります。つまり、コンボ ボックスを埋めるのに 1 日半を費やしたことになります。
Google で見つけたすべてのランダムな提案で 1 日を失うわけにはいきません。私は実際の答えが必要です。だから、不機嫌そうな人々に研究努力があったことを示すためにそれらを含めているだけです(研究努力が重要であるかのように).
一部の人々は、 ASP.net を呼び出すことを提案し、クライアントの javascriptPageMethods
を更新cbState
します。
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);"
ここでの問題は Attempt#2 と同じです。ASP.net の背後にあるフォームをいじったので、viewstate は間違っています。
ASP.net とviewstateがクライアント側の DOM 更新と根本的に互換性がないという根本的な問題があるようです。クライアント側でページを変更しようとすると、ASP.net Web フォーム プログラミング モデル全体が無効になります。