「Photino.Blazor - ルーティング」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「Photino.NET - ルーティング」を「Photino.Blazor - ルーティング」に、リダイレクトを残さずに移動しました)
 
1行目: 1行目:
== 概要 ==
== 概要 ==
Photino.NETは、デスクトップアプリケーションのための軽量なフレームワークであり、そのルーティングシステムもシンプルながら効果的な設計となっている。<br>
Photino.Blazorにおけるルーティングの基本的な仕組みは、通常のBlazorアプリケーションと同様、コンポーネントベースのルーティングを採用している。<br>
ルーティングシステムは、URLパスとコンポーネントを紐付け、ユーザの画面遷移を管理する。<br>
<br>
<br>
基本的なルーティングの仕組みとして、Photino.NETではシングルページアプリケーション (SPA) のような形式でルーティングを実装する。<br>
実装方法として、<code>@page</code>ディレクティブを使用する。<br>
メインウインドウにおいて、JavaScriptを使用してコンテンツの切り替えを行う。<br>
これは、Razorコンポーネントファイルの先頭に記述して、そのコンポーネントがどのURLパスで表示されるかを定義する。<br>
<br>
<br>
一般的に、ルーティングの実装方法として、以下に示すようなアプローチを取る。<br>
<syntaxhighlight lang="c#">
# まず、PhotinoWindowクラスのインスタンスを生成して、初期URLを設定する。<br>これは、アプリケーションのエントリーポイントとなる。
@page "/counter"
#: <syntaxhighlight lang="c#">
var window = new PhotinoWindow()
<h1>Counter</h1>
    .Load("wwwroot/index.html");
</syntaxhighlight>
// コンポーネントの実装
# フロントエンド側では、JavaScriptのルーティングライブラリ (例: Navigo) を使用してルーティングを管理する。<br>これにより、シングルページアプリケーションを提供することが可能となる。
// ...略
</syntaxhighlight>
<br>
パラメータを含むルートも設定可能である。<br>
例えば、ユーザIDに基づいた動的なルーティングは次のように実装することができる。<br>
<syntaxhighlight lang="c#">
@page "/user/{Id}"
@code {
    [Parameter]
    public string Id { get; set; }
}
</syntaxhighlight>
<br>
ナビゲーションについては、プログラムによる遷移と宣言的な遷移の両方をサポートしている。<br>
プログラムによる遷移には<code>NavigationManager</code>を使用して、宣言的な遷移には<code><NavLink></code>コンポーネントを使用する。<br>
<br>
<br>
重要な点では、Photino.NETではバックエンド (C#) とフロントエンド (JavaScript) 間の通信が可能である。<br>
これを利用して、ルーティングに関連する処理をバックエンド側で実装することもできる。<br>
  <syntaxhighlight lang="c#">
  <syntaxhighlight lang="c#">
  window.WebMessageReceived += (sender, message) => {
  // プログラムによる遷移
     if (message.Contains("navigate:")) {
@inject NavigationManager NavigationManager
       var route = message.Replace("navigate:", "");
      // ルーティング処理の実装
@code {
     private void NavigateToCounter()
    {
       NavigationManager.NavigateTo("/counter");
     }
     }
  };
  }
// 宣言的な遷移
<NavLink class="nav-link" href="counter">
    <span>Counter</span>
</NavLink>
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
また、Photino.NETのルーティングシステムは、デフォルトで外部URLへのナビゲーションを制限している。<br>
ルートパラメータのバリデーションやカスタム制約も実装可能である。<br>
これは意図しないナビゲーションを防ぐための重要な機能である。<br>
これにより、特定のパターンに一致するパラメータのみを受け付けるようなルーティングを設定することができる。<br>
<br>
<br>
ディープリンクの実装も可能であり、これによりデスクトップアプリケーションでありながら、Webアプリケーションのような柔軟なナビゲーションを提供することができる。<br>
さらに、入れ子のルーティングも実装可能である。<br>
これは、@pageディレクティブに複数のルートテンプレートを指定することで実現することができる。<br>
<syntaxhighlight lang="c#">
@page "/products"
@page "/products/{category}"
@code {
    [Parameter]
    public string Category { get; set; }
}
</syntaxhighlight>
<br>
<br>
また、ルーティングに関連するエラーハンドリングでは、404エラーや不正なルートへのアクセスに対して、適切なエラーページやフォールバックを実装することが推奨される。<br>
エラーハンドリングについて、存在しないルートへのアクセスや無効なパラメータに対して、カスタムの404ページや適切なエラーページを表示するように設定できる。<br>
これは、アプリケーションのルートコンポーネントでRouterコンポーネントを設定することで実現できる。<br>
<br>
<br>
カスタムスキームの実装も可能であり、これにより、アプリケーション固有のURLスキームを定義して特別なルーティング要件に対応することができる。<br>
また、Blazorの認証システムと組み合わせることにより、特定のルートへのアクセスを認証・認可により制限することも可能である。<br>
<br><br>
<br><br>



2024年12月31日 (火) 19:35時点における最新版

概要

Photino.Blazorにおけるルーティングの基本的な仕組みは、通常のBlazorアプリケーションと同様、コンポーネントベースのルーティングを採用している。
ルーティングシステムは、URLパスとコンポーネントを紐付け、ユーザの画面遷移を管理する。

実装方法として、@pageディレクティブを使用する。
これは、Razorコンポーネントファイルの先頭に記述して、そのコンポーネントがどのURLパスで表示されるかを定義する。

 @page "/counter"
 
 <h1>Counter</h1>
 
 // コンポーネントの実装
 // ...略


パラメータを含むルートも設定可能である。
例えば、ユーザIDに基づいた動的なルーティングは次のように実装することができる。

 @page "/user/{Id}"
 
 @code {
    [Parameter]
    public string Id { get; set; }
 }


ナビゲーションについては、プログラムによる遷移と宣言的な遷移の両方をサポートしている。
プログラムによる遷移にはNavigationManagerを使用して、宣言的な遷移には<NavLink>コンポーネントを使用する。

 // プログラムによる遷移
 @inject NavigationManager NavigationManager
 
 @code {
    private void NavigateToCounter()
    {
       NavigationManager.NavigateTo("/counter");
    }
 }
 
 // 宣言的な遷移
 <NavLink class="nav-link" href="counter">
    <span>Counter</span>
 </NavLink>


ルートパラメータのバリデーションやカスタム制約も実装可能である。
これにより、特定のパターンに一致するパラメータのみを受け付けるようなルーティングを設定することができる。

さらに、入れ子のルーティングも実装可能である。
これは、@pageディレクティブに複数のルートテンプレートを指定することで実現することができる。

 @page "/products"
 @page "/products/{category}"
 
 @code {
    [Parameter]
    public string Category { get; set; }
 }


エラーハンドリングについて、存在しないルートへのアクセスや無効なパラメータに対して、カスタムの404ページや適切なエラーページを表示するように設定できる。
これは、アプリケーションのルートコンポーネントでRouterコンポーネントを設定することで実現できる。

また、Blazorの認証システムと組み合わせることにより、特定のルートへのアクセスを認証・認可により制限することも可能である。


ルーティングの設定

Photinoアプリケーションのルーティングの基本設定を行い、以下に示す機能を提供する。
これはBlazorの標準的なルーティング設定であり、SPAアプリケーションのナビゲーション機能を実現するために必要な基本的な設定となっている。

  • 正しいURLの場合は対応するページを表示する。
  • 存在しないページにアクセスした場合は、エラーページを表示する。
  • 全てのページに共通のレイアウトを適用する。


以下の例では、Blazor向けのルーティング設定を行っている。

 <!-- App.razorファイル -->
 <!-- Blazor向けのルーティング設定を行うコンポーネント -->
 
 @using PhotinoSample.Shared  <!-- SharedディレクトリにMainLayout.razorファイルがあるものとする -->
 
 <Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
       <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
       <FocusOnNavigate RouteData="@routeData" Selector="body" />
    </Found>
    <NotFound>
       <PageTitle>Not found</PageTitle>
       <LayoutView Layout="@typeof(MainLayout)">
          <p role="alert">Sorry, there's nothing at this address.</p>
       </LayoutView>
    </NotFound>
 </Router>


  • <Router>タグ
    Blazorアプリケーションのルーティングを制御する主要なコンポーネントである。
    AppAssembly属性は、ルーティング情報を含むアセンブリを指定する。
    上記の例は、Appクラスを含むアセンブリ

  • <Found>タグ
    ルートが見つかった場合の処理を定義する。
    • <RouteView>タグ
      実際のページコンテンツを表示する。
      上記の例において、DefaultLayout属性は、MainLayoutをデフォルトレイアウトとして指定している。
    • <FocusOnNavigate>タグ
      ナビゲーション後にフォーカスを設定する機能を提供する。

  • <NotFound>タグ
    URLが見つからない場合 (404エラー) において、表示内容を定義する。
    <PageTitle>タグは、ページタイトルを設定する。一般的には、エラーメッセージを表示する。


また、上記の例において、@using PhotinoSample.SharedはBlazorのusingディレクティブのシンタックスであり、PhotinoSample.Shared名前空間をインポートする宣言である。

  • @
    BlazorのRazor構文であることを示すシンボルである。
  • using
    C#のusingステートメントと同じ働きをする。
  • PhotinoSample.Shared
    インポートする名前空間
    上記の例では、この名前空間には、MainLayout.razorファイル等の共有コンポーネントが含まれている。

    Sharedフォルダ / 名前空間には、アプリケーション全体で共有されるコンポーネントやレイアウトが配置されるのが一般的である。


この宣言により、PhotinoSample.Sharedに含まれるコンポーネントを完全修飾名 (PhotinoSample.Shared.MainLayout等) を使用せずに直接参照できる。

 <!-- 例: -->
 
 <!-- @using宣言がない場合 -->
 @typeof(PhotinoSample.Shared.MainLayout)
 
 <!-- @using宣言がある場合 -->
 @typeof(MainLayout)  // より簡潔に記述できる