ASP.NET で Bootstrap モーダルにデータバインドする方法

モーダルのHTML構造

BootstrapのモーダルをASP.NETコントロールと連携させるには、ボタンにカスタムデータ属性を設定し、JavaScriptでその値を取得してフォームに反映します。

<button id="btnAdd" type="button" class="btn btn-primary" data-toggle="modal" data-target="#editModal">
    新規追加
</button>

<div class="modal fade" id="editModal" tabindex="-1" aria-labelledby="editModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="editModalLabel">入力フォーム</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <div class="mb-3">
                    <label for="modalId" class="form-label">ID</label>
                    <asp:TextBox ID="modalId" runat="server" CssClass="form-control" Style="display:none" />
                </div>
                <div class="mb-3">
                    <label for="modalName" class="form-label">氏名</label>
                    <asp:TextBox ID="modalName" runat="server" CssClass="form-control" />
                </div>
                <div class="mb-3">
                    <label for="modalWeightType" class="form-label">重量単位</label>
                    <asp:DropDownList ID="modalWeightType" runat="server" CssClass="form-control" AutoPostBack="false" />
                </div>
                <div class="mb-3">
                    <label for="modalApprover" class="form-label">承認者</label>
                    <asp:DropDownList ID="modalApprover" runat="server" CssClass="form-control" AutoPostBack="false" />
                </div>
                <div class="mb-3">
                    <label for="modalTotal" class="form-label">合計数量</label>
                    <asp:TextBox ID="modalTotal" runat="server" CssClass="form-control" />
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">キャンセル</button>
                <asp:Button ID="btnSave" runat="server" Text="保存" CssClass="btn btn-success" OnClick="btnSave_Click" />
            </div>
        </div>
    </div>
</div>

データバインド用ボタン

GridViewやRepeater内でモーダルを開くボタンには、data-属性でサーバー側のデータを埋め込みます。

<asp:LinkButton ID="lnkEdit" runat="server" 
    CssClass="btn btn-sm btn-warning" 
    Text="編集" 
    data-toggle="modal" 
    data-target="#editModal"
    data-id='<%# Container.DataItem("id") %>'
    data-name='<%# Container.DataItem("bran_enter_name") %>'
    data-total='<%# Container.DataItem("bran_sum_number") %>'
    data-weighttype='<%# Container.DataItem("bran_weight_type_id") %>'
    data-approver='<%# Container.DataItem("approver_id") %>'>
</asp:LinkButton>

JavaScriptによる値の自動設定

モーダルが表示される直前に、show.bs.modalイベントをフックして、ボタンのカスタム属性から値を取得し、対応するコントロールに設定します。

<script>
$(document).ready(function () {
    $('#editModal').on('show.bs.modal', function (event) {
        const button = $(event.relatedTarget);
        const modal = $(this);

        // モーダルタイトルを更新
        modal.find('.modal-title').text('入力情報の編集');

        // カスタムデータ属性から値を取得してフォームに設定
        modal.find('#modalId').val(button.data('id'));
        modal.find('#modalName').val(button.data('name'));
        modal.find('#modalTotal').val(button.data('total'));
        modal.find('#modalWeightType').val(button.data('weighttype'));
        modal.find('#modalApprover').val(button.data('approver'));
    });
});
</script>

サーバーサイドでの処理

保存ボタンのOnClickイベントでは、モーダル内のTextBoxDropDownListの値をそのまま取得してDBに保存します。UpdatePanelは不要です。モーダルはクライアントサイドで操作されるため、ページ全体のリフレッシュは発生しません。

タグ: ASP.NET Bootstrap modal jQuery DataBinding

7月19日 18:57 投稿