質問への 2021/05/20 18:10 の私のコメントで、
Bootstrap modal や jQuery UI Dialog は JavaScript で起動するということになり、Blazor では以下の記事のようにするのですが、そのあたりはご存じですか?
ASP.NET Core Blazor で .NET メソッドから JavaScript 関数を呼び出す
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/javascript-interoperability/call-javascript-from-dotnet?view=aspnetcore-5.0
・・・と書いたのですが、button に特定の属性を付与して見かけ JavaScript を使わないで Modal を表示する方法もあります。検証してみましたが、Blazor WASM でもその方法を使えます。
以下の記事の Usage というセクションに (1) Via data attributes という JavaScript を書かない方法と、(2) Via JavaScript という JavaScript を書く方法が紹介されています。
Modal
https://getbootstrap.jp/docs/4.2/components/modal/
その両方を Blazor WASM アプリで検証しましたので、検証用に作ったサンプルを紹介しておきます。
Visual Studio のテンプレートで Blazor WASM アプリのプロジェクトを作った場合、プロジェクトには jquery.js と bootstrap.js は含まれないので、wwwroot 下に以下のように追加してください。
(2) Via JavaScript の方法はもちろん、(1) Via data attributes の方法でも bootstrap.js は必須です。bootstrap.js は jquery.js に依存しているので jquery.js も必須です(Bootstrap5 では jQuery に依存しなくなったそうですが)。バージョンに注意してください。自分は bootstrap.js は bootstrap.min.css と同じ 4.3.1、jquery.js は 3.5.1 を使いました。
上の exampleJsInterop.js は (2) Via JavaScript の方法で Modal を表示する場合に使うカスタム JavaScript を含む自作 js ファイルです。内容は以下の通りです。
exampleJsInterop.js
window.showBootstrapModal = () => {
$('#exampleModalCenter').modal();
}
index.html
wwwroot 下にある既存の index.html に上記 js ファイルへの参照を追加します(以下のコードで「<!-- 以下を追加 -->」となっている部分)。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>BlazorWasm</title>
<base href="/" />
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" />
</head>
<body>
<app>Loading...</app>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">????</a>
</div>
<script src="_framework/blazor.webassembly.js"></script>
<!-- 以下を追加 -->
<script src="js/jquery.js"></script>
<script src="js/bootstrap.js"></script>
<script src="js/exampleJsInterop.js"></script>
</body>
</html>
Modal.razor
検証用の razor ページは以下の通りです。@inject IJSRuntime JSRuntime; は (2) Via JavaScript の方法に必要です。
@page "/modal"
@inject IJSRuntime JSRuntime;
<!-- Modal -->
<div id="exampleModalCenter" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Modal body text goes here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
<h1>Bootstrap Modal</h1>
<!-- Via JavaScript -->
<button type="button" class="btn btn-primary" @onclick="ShowBootstrapModal">
Via JavaScript
</button>
<br />
<br />
<!-- Via data attributes -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
Via data attributes
</button>
@code {
private async Task ShowBootstrapModal()
{
await JSRuntime.InvokeVoidAsync("showBootstrapModal");
}
}
実行結果は以下の通りです。