Lightning Blog
Blazor記事イメージ画像

【Blazor】 JavaScriptから.NETメソッド呼び出しの方法

更新日:2024/06/06
この記事では、JavaScriptから.NET(C#)のメソッドを呼び出す方法について解説していきます。

    目次

  • 今回の実装イメージ
  • .NET(C#)側のソースコード
  • JavaScript側のソースコード
  • 動作確認とまとめ

今回の実装イメージ

セクション画像

今回のサンプルコードの実装イメージになります。

title%20%E5%AE%9F%E8%A3%85%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%0A%0A.NET-%3EJavaScript%3AJS%E5%81%B4%20%E3%81%AE%20callDotNetMethod%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%0AJavaScript-%3E.NET%3A.NET%E5%81%B4%E3%81%AE%20GetMessage%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%0AJavaScript-%3E.NET%3A.NET%E5%81%B4%E3%81%AE%20UpdateMessage%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97.NETJavaScript実装イメージJS側 の callDotNetMethod 呼び出し.NET側の GetMessage 呼び出し.NET側の UpdateMessage 呼び出し

まず.NETからJavaScriptのメソッド呼び出します。 呼び出されたJavaScriptのメソッドから、.NET側のメソッドを参照して呼び出す処理を記載します。

.NETからJavaScriptのメソッド呼び出す方法は、以下の記事で説明しています。 よかったら参照してみてください。

カード画像
JavaScriptを呼び出し方

BlazorでWEB開発は主にHTML, CSS, C#を使用しますが、JavaScriptの利用も避けられない場面がある。JavaScriptをBlazor内で呼び出すためには、IJSRuntimeサービスを利用する。IJSRuntimeを用いることで、C#からJavaScriptの関数を非同期的に実行可能。例として、ボタンクリックでJavaScriptのアラートを表示する方法を説明。BlazorでのJavaScript使用は最小限に留めるべきだが、必要な場面での知識は重要。

更新日:2023/07/19

このような仕組みでコードを書いています。


.NET(C#)側のソースコード

セクション画像

.NET側のソースコードは以下のとおりです。


@page "/javascript-call-dotnet"
@inject IJSRuntime JSRuntime

<h3>JavaScriptから.NET呼び出し</h3>

<button class="btn btn-primary" @onclick="CallJavaScript">JavaScript呼び出しボタン</button>

<p>@message</p>

@code {
    /// <summary>
    /// 画面に表示するメッセージ
    /// </summary>
    private static string? message;

    /// <summary>
    /// メッセージを取得(JavaScriptから呼び出し可能なメソッド)
    /// </summary>
    /// <remarks>staticメソッドである必要あり</remarks>
    [JSInvokable("GetMessage")]
    public static Task<string> GetMessage()
    {
        return Task.FromResult(".NET -> JavaScript へのメッセージ");
    }

    /// <summary>
    /// メッセージを更新(JavaScriptから呼び出し可能なメソッド)
    /// </summary>
    /// <remarks>staticメソッドである必要あり</remarks>
    /// <param name="newMessage">更新するメッセージ</param>
    [JSInvokable("UpdateMessage")]
    public static Task UpdateMessage(string newMessage)
    {
        message = newMessage;
        return Task.CompletedTask;
    }

    /// <summary>
    /// JavaScriptのメソッド呼び出し
    /// </summary>
    private async Task CallJavaScript()
    {
        // JavaScriptの"callDotNetMethod"メソッドを呼び出し
        await JSRuntime.InvokeVoidAsync("callDotNetMethod");
    }
}

GetMessageUpdateMessageメソッドはJavaScript側から呼ばれるメソッドです。 JavaScriptから.NETのメソッドを呼び出すには、以下の条件を満たす必要があります。

  • JSInvokableを付与されていること
  • アクセス修飾子がpublicかつstaticであること

CallJavaScriptメソッドでは、JavaScript側のcallDotNetMethodメソッドを呼び出す処理が書いてあります。 callDotNetMethodメソッドには、.NET側のメソッドを参照して呼び出す処理が書いてあります。

callDotNetMethodメソッドなどのJavaScript側のソースコードは、次のセクションで見ていきます。


JavaScript側のソースコード

セクション画像

JavaScript側のソースコードは以下のとおりです。


async function callDotNetMethod () {
    // 非同期で .NETメソッドを呼び出し、結果を取得する例
    const result = await DotNet.invokeMethodAsync('BlazorJavaScriptCallDotnet', 'GetMessage');
    // 取得結果である「.NET -> JavaScript へのメッセージ」がコンソールへ表示されます
    console.log(result);

    // 非同期で .NETメソッドにデータ(引数)を渡して呼び出す例
    await DotNet.invokeMethodAsync('BlazorJavaScriptCallDotnet', 'UpdateMessage', 'JavaScript -> .NET へのメッセージ');
};

DotNet.invokeMethodAsyncは、メソッドを使って、.NET側のGetMessageメソッドを非同期で呼び出します。 第1引数にはアセンブリ名BlazorJavaScriptCallDotnet、第2引数にはメソッドGetMessageを指定します。

アセンブリ名は、以下の赤枠部分の文字列を指定すれば大丈夫です。

アセンブリ名

再びDotNet.invokeMethodAsyncメソッドを使って、今度は引数を渡して、.NET側のUpdateMessageメソッドを呼び出します。 第3引数に渡したいデータ("JavaScript -> .NET へのメッセージ"という文字列)を指定します。この操作も非同期で行われます。


動作確認とまとめ

セクション画像

動作確認してみましょう。ボタンクリックして、メッセージが表示されるのを確認してください。

動作確認

この記事では、JavaScriptからBlazor Serverアプリケーションの.NETメソッドを呼び出す方法について解説しました。

Blazorでは、JavaScriptを利用しないと実装できない機能が多々あるので、 そういった状況になったら是非使ってみてください。


ブログ内の記事で書かれているサンプルコードは、GitHubから確認する事ができます。 是非参考にしてみてください。

この本では、Blazorの基本から高度なテクニックまで、実際のプロジェクトに役立つ知識を網羅しています。 初心者から経験者まで、Blazorを扱うすべての開発者にとっての必読書です。 この記事の執筆者も参考にした「Blazor入門」で、あなたのBlazorスキルを飛躍的に向上させませんか?

合わせて読みたい

カード画像
RenderFragmemtの使い方

Blazorでのページ作成時に共通レイアウトの再利用性を高めるため、RenderFragmentを利用する方法を紹介。RenderFragmentを使ったコンポーネントを作成し、その中でChildContentを通してページ固有の内容を指定。これにより、類似のレイアウトを持つページでもコードの重複を防ぎ効率的な実装が可能になる。

更新日:2023/07/09

カード画像
@refを使い方

Blazorの@refを用いてコンポーネント内のデータやメソッドにアクセスする方法を詳解。@refはBlazorコンポーネント参照のためのディレクティブで、親から子コンポーネントのメソッドやプロパティを操作できる。具体的な使用シナリオとしてフォームバリデーションやモーダルダイアログが挙げられるが、レンダリング後の使用や過度な依存を避けることが推奨される。

更新日:2023/09/05

An error has occurred. This application may no longer respond until reloaded. Reload 🗙