これは明らかな解決策がある一般的なシナリオのように見えますが、どういうわけか私はそれに遭遇していません。
イベントにDropDownList
バインドされたイベントハンドラーSelectedIndexChanged
とAutoPostback="true"
、があります。これは意図したとおりに機能します。
イベントハンドラーは値が変更されたときに実行されますが、クライアント側でjQueryを使用してスクリプトを介して値が変更された場合、ユーザーが値を変更したとき(およびドロップダウンのonchange
イベントが発生したとき)にポストバックがトリガーされます。次に、サーバー側のコードは、サーバーが最後に状態を確認してから値が変更されていないことを検出します。したがって、イベントハンドラーはサーバー側で実行されません。
ビューステートを介してロードされるもののように見えますが、無効にしViewState
ても効果はありません。
- ページは、値「A」が選択された状態でドロップダウンをレンダリングします。
- ユーザーがドロップダウンリストを値「B」に変更します。
- 値は自動的にサーバーに送信され、
SelectedIndexChanged
イベントハンドラーが実行されます。 - クライアントスクリプトを実行して、を使用してクライアントの値を「A」に戻します
jQuery.val()
。 - ユーザーは値を「B」に戻します。
- 値は自動的にサーバーに送信されますが、サーバーが最後にページをレンダリングしたときに値が「B」であったため、
SelectedIndexChanged
イベントハンドラーは実行されません。
クライアント側
<asp:DropDownList ID="dlst" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dlst_SelectedIndexChanged">
<asp:ListItem Text="A" Value="A" />
<asp:ListItem Text="B" Value="B" />
</asp:DropDownList>
<asp:Button ID="btnChange" runat="server" Text="Change" OnClientClick="return changeDDL(this,event)" />
<script type="text/javascript">
function changeDDL(sender, e) {
var dlst = $("#<%= dlst.ClientID %>");
dlst.val(dlst.val() === "A" ? "B" : "A");
return false;
}
</script>
サーバ側
protected void dlst_SelectedIndexChanged(object sender, EventArgs e)
{
btnChange.Text = dlst.SelectedValue == "A" ? "Change B" : "Change A";
}