jQuery UI Datepicker を ASP.NET WebForms アプリケーションに統合しようとしています。アプリケーションはマスター ページを使用してすべてのページに共通の外観を提供し、すべてのコンテンツ ページは UpdatePanel の ContentTemplate 内に構築されます。日付ピッカーの機能をラップし、実行時にコードビハインドから日付ごとに minDate、maxDate、バリデーターなどを設定できるようにするユーザー コントロールを作成しました。また、ASP.NET がクライアント要素 ID を生成する方法にも対処する必要があります。
この 1 週間、私は高低を検索し、それを機能させるための多くのヒントを見つけました。これは、私が今いる場所のやや単純化されたバージョンです。
<asp:TextBox ID="txtTB" runat="server"
MaxLength="10"
CssClass="dateBox" />
<script type="text/javascript">
// This function enables the datepicker behavior for this textbox by its ClientID.
function <%=txtTB.ClientID %>() {
$("#<%=txtTB.ClientID %>").datepicker({
changeMonth: true, changeYear: true,
showOn: 'button',
buttonImage: "<%=Request.ApplicationPath %>/images/calendarIcon.gif",
buttonImageOnly: true, buttonText: '', duration: '',
onSelect: function() { }
});
};
// Register the above function to execute on initial page load...
$(document).ready(function(){ <%=txtTB.ClientID %>(); }) ;
// ...and also after any update panel it's on has been refreshed.
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(<%=txtTB.ClientID %>);
</script>
この問題に関連しているとは思えないバリデーターやその他のマークアップは省略しましたが、それはユーザー コントロールの要であるテキスト ボックスと、日付ピッカー機能を有効にする jQuery スクリプトです。基本的な考え方は、ASP.NET のクライアント ID を利用して次のことを行うことです。
- この特定のコントロールの JavaScript 関数に固有の関数名を指定してください
- その関数を jQuery に登録して、最初のページの読み込み後に日付ピッカーを有効にします
- 同じ関数を ASP.NET の PageRequestManager に登録して、ポストバック後に日付ピッカーを有効にします。
アイテム1と2はうまく機能しています。ただし、ポストバック後、datepicker 機能が失われ、テキスト ボックスだけが残ります。
ちょっと待って!それがすべてではありません。特定のページは複数のパネルで構成されており、一度に表示できるのはそのうちの 1 つだけです。これらは、現在のパネルの Visible プロパティを true にするだけで選択されます。他のすべてのパネルの Visible プロパティは false に設定されています。
これを取得します。最初のページの読み込み時に表示される最初のパネルの日付ピッカーは、期待どおりに機能します。2 番目のパネルにあるものは表示されません。最初のページに戻ると、日付ピッカーが再び表示されます。
誰かが私が間違っているという考えを持っていますか?