「Blazor - ルーティング」の版間の差分
 (→概要)  | 
				|||
| 65行目: | 65行目: | ||
ルートパラメータは波括弧で囲んで指定して、対応するプロパティに<code>[Parameter]</code>属性を付与する。<br>  | ルートパラメータは波括弧で囲んで指定して、対応するプロパティに<code>[Parameter]</code>属性を付与する。<br>  | ||
<br>  | <br>  | ||
Blazorのパラメータ受け渡しには、3つの方法がある。<br>  | |||
<br>  | |||
==== ルートパラメータ ====  | |||
  <syntaxhighlight lang="c#">  |   <syntaxhighlight lang="c#">  | ||
  @page "/user/{Id}"  |   @page "/user/{Id:int}"  | ||
  @code {  |   @code {  | ||
     [Parameter]  |      [Parameter]  | ||
     public   |      public int Id { get; set; }  | ||
    // 整数以外の値が渡された場合は404エラー  | |||
 }  | |||
 </syntaxhighlight>  | |||
<br>  | |||
==== 複数パラメータ ====  | |||
 <syntaxhighlight lang="c#">  | |||
 @page "/orders/{CustomerId:int}/{OrderId:int}"  | |||
 @code {  | |||
    [Parameter]  | |||
    public int CustomerId { get; set; }  | |||
    [Parameter]  | |||
    public int OrderId { get; set; }  | |||
 }  | |||
 </syntaxhighlight>  | |||
<br>  | |||
==== クエリパラメータ ====  | |||
 <syntaxhighlight lang="c#">  | |||
 // URL: /search?query=blazor&page=1  | |||
 @page "/search"  | |||
 @inject NavigationManager Navigation  | |||
 @code {  | |||
    private string SearchQuery;  | |||
    private int Page;  | |||
    protected override void OnInitialized()  | |||
    {  | |||
       var uri = Navigation.ToAbsoluteUri(Navigation.Uri);  | |||
       if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("query", out var query))  | |||
       {  | |||
          SearchQuery = query;  | |||
       }  | |||
       if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("page", out var page))  | |||
       {  | |||
          Page = Convert.ToInt32(page);  | |||
       }  | |||
    }  | |||
  }  |   }  | ||
 </syntaxhighlight>  | |||
<br>  | |||
==== 制約パターンの使用 ====  | |||
制約パターンも使用できる。<br>  | |||
<br>  | |||
 <syntaxhighlight lang="c#">  | |||
 @page "/date/{date:datetime}"  | |||
 @page "/products/{id:guid}"  | |||
 @page "/blog/{*slug}"  // catch-allパラメータ  | |||
 </syntaxhighlight>  | |||
<br>  | |||
==== カスケード ====  | |||
これらのパラメータは、コンポーネント間でのカスケード時にも使用可能である。<br>  | |||
<br>  | |||
 <syntaxhighlight lang="c#">  | |||
 <ChildComponent CustomerId="@CustomerId" />  | |||
  </syntaxhighlight>  |   </syntaxhighlight>  | ||
<br><br>  | <br><br>  | ||
2025年1月26日 (日) 22:37時点における版
概要
Blazorでは、URLパターンとコンポーネントを紐付けることでルーティングを実現する。
Blazorのルーティングは、@pageディレクティブを使用して設定する。
このように定義することにより、/counterというURLにアクセスした時にこのコンポーネントが表示される。
※注意
ファイル名は大文字で始まる必要があり、razorファイルの拡張子は.razorの必要がある。
 // Pages/Counter.razorファイル
 
 @page "/counter"
 @page "/counter/{currentCount:int}"
 
 <h1>Counter</h1>
 
 <p>Current count: @currentCount</p>
 
 @code {
    // オプションのルートパラメータ
    [Parameter]
    public int currentCount { get; set; }
 }
ルーティングファイル
Blazorでは、Pagesディレクトリに配置されたrazorファイルがルーティングの対象となる。
以下に示す/counterの場合では、デフォルトでは以下に示すファイルが参照される。
- /<プロジェクトのトップディレクトリ>/Pages/Counter.razorファイル
 
 @page "/counter"
 
 <h1>Counter</h1>
ただし、これは規約ベースのルーティングであり、@pageディレクティブで明示的に別のルートを指定することも可能である。
以下に示すように設定することにより、異なるファイル配置でも/counterにルーティングすることができる。
 // 例 : /Pages/MyCounter/Index.razorファイル
 
 @page "/counter"
Pagesディレクトリ配下のファイルへのルーティング
- /counter --> /Pages/Counter.razor
 
また、ネストされたディレクトリの場合は以下のようになる。
- /mypage --> /Pages/MyPage.razor
 - /admin/dashboard --> /Pages/Admin/Dashboard.razor
 - /settings/profile --> /Pages/Settings/Profile.razor
 
特殊なケースとして、Indexページは以下のようになる。
- / --> /Pages/Index.razor
 - /admin --> /Pages/Admin/Index.razor
 
なお、@pageディレクティブで明示的にルートを指定した場合は、この規約が上書きされる。
パラメータの受け渡し
ルートパラメータは波括弧で囲んで指定して、対応するプロパティに[Parameter]属性を付与する。
Blazorのパラメータ受け渡しには、3つの方法がある。
ルートパラメータ
 @page "/user/{Id:int}"
 
 @code {
    [Parameter]
    public int Id { get; set; }
 
    // 整数以外の値が渡された場合は404エラー
 }
複数パラメータ
 @page "/orders/{CustomerId:int}/{OrderId:int}"
 
 @code {
    [Parameter]
    public int CustomerId { get; set; }
 
    [Parameter]
    public int OrderId { get; set; }
 }
クエリパラメータ
 // URL: /search?query=blazor&page=1
 
 @page "/search"
 @inject NavigationManager Navigation
 
 @code {
    private string SearchQuery;
    private int Page;
 
    protected override void OnInitialized()
    {
       var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
 
       if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("query", out var query))
       {
          SearchQuery = query;
       }
 
       if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("page", out var page))
       {
          Page = Convert.ToInt32(page);
       }
    }
 }
制約パターンの使用
制約パターンも使用できる。
 @page "/date/{date:datetime}"
 @page "/products/{id:guid}"
 @page "/blog/{*slug}"  // catch-allパラメータ
カスケード
これらのパラメータは、コンポーネント間でのカスケード時にも使用可能である。
 <ChildComponent CustomerId="@CustomerId" />
ナビゲーション
プログラムによる画面遷移とリンクによる遷移の2つの方法がある。
 @inject NavigationManager NavigationManager
 
 @code {
    private void NavigateToCounter()
    {
       NavigationManager.NavigateTo("counter");
    }
 }
リンクによる遷移
NavLinkコンポーネントを使用して遷移する。
 <NavLink href="counter">
    <span class="oi oi-plus"></span> Counter
 </NavLink>
オプションパラメータ / クエリパラメータ
オプションパラメータ
波括弧内に?を付加することにより、実現できる。
 @page "/user/{id?}"
 
 @code {
    [Parameter]
    public string Id { get; set; }
 
    protected override void OnInitialized()
    {
       if (string.IsNullOrEmpty(Id))
       {
          Id = "default";
       }
    }
 }
レイアウトの適用
Blazorのルーティングでは、レイアウトの適用も重要である。
_Imports.razorファイルにおいて、デフォルトレイアウトを指定して、必要に応じて個別のコンポーネントで@layout指示子を使用して上書きすることができる。
エラーハンドリング
404エラー等のルーティングエラーは、App.razorで設定したNotFoundテンプレートによって処理される。
これにより、ユーザフレンドリーなエラー画面を表示することが可能である。
認証 / 認可
[Authorize]属性を使用することにより、特定のルートへのアクセスを制限することができる。