コンテンツにスキップ

クエリサポート

最小限の使用方法

最小限必要なものは以下の内容です。

  • [BlazorPath]属性を付与したクラスを用意します。この際、クラス定義にはpartial属性が必要です。
  • そのクラス内のメンバーとしてconst string型の定数を定義します。
  • メンバーの属性として、[Query<QueryClass>]を付与します。

URLビルダー関数を生成する過程で、[Query<QueryClass>]の定義を元にクエリ対応版の関数が生成されます。

WebPaths.cs
1
2
3
4
5
6
7
8
[BlazorPath]
public partial class WebPaths
{
  [Query<QueryRecord>]
  public const string CounterWithQuery = "/counter/query";
}

public record QueryRecord(string query = "hello", int page = 0, bool? opt = null);

注意!

QueryRecordクラスは、.csファイルに記述してください。
SourceGeneratorの仕様上、.razorファイルに記述することはできません。

推奨: パラメータの初期値を明確にする

各パラメータはデフォルト値を指定するか、nullableにすることを推奨します。(クエリパラメータが指定されなかった場合のことを考慮する必要があるはずです)

生成されたコード
Auto Generated Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// <auto-generated />
public partial class WebPaths
{
  public partial class Helper
  {
    public static string CounterWithQuery(QueryRecord __query)
      => string.Format("/counter/query{0}", BuildQuery([
        ToEscapedStrings("query", __query.query),
        ToEscapedStrings("page", __query.page),
        ToEscapedStrings("opt", __query.opt)
      ]));
  }
}

仕組み

[Query<QueryClass>]属性を付与したメンバーに対して、以下の関数が生成されます。

Auto Generated Code
1
2
3
4
5
6
public static string CounterWithQuery(QueryRecord __query)
  => string.Format("/counter/query{0}", BuildQuery([
    ToEscapedStrings("query", __query.query),
    ToEscapedStrings("page", __query.page),
    ToEscapedStrings("opt", __query.opt)
  ]));

上記の生成されたコードを見ると分かる通り、QueryRecordクラスの各プロパティをクエリパラメータとして展開されています。
この関数を生成する際に、BlazorPathHelperが内部で行っている内容は以下の通りです。

  1. [Page<QueryClass>]属性が付与されているかどうかを確認
  2. 指定されている場合は、QueryClassで定義されているプロパティを抽出
    • メンバーも使用できるはずですが、推奨しません。
  3. 各プロパティごとに、ToEscapedStrings関数を呼び出し、クエリパラメータを生成
    • 例えば上記の場合は、"query=hello", "page=0", "opt=true"のような文字列が生成されます。
  4. 生成されたクエリパラメータをBuildQuery関数に渡し、クエリ文字列を生成
    • 上記の場合、"?query=hello&page=0&opt=true"のような文字列が生成されます。
    • 例えばopt=nullの場合は、"?query=hello&page=0"のようになり、optパラメータは出力されません。

入れ子プロパティはサポートされていません

上記の定義の通り、実際にはクラス自体を復元しているわけではなく、一度プロパティを抽出しています。
そのため、現在入れ子プロパティはサポートされていません。

クエリ名を変更する

[Query<QueryRecord>]属性を指定した場合、クエリ名はQueryRecordのプロパティ名がそのまま使用されます。
クエリ名を変更したい場合は、[QueryName("shortName")]属性を付与してください。

WebPaths.cs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public record QueryRecord
{
    [QueryName("short")] // or [SupplyParameterFromQuery(Name = "short")]
    public required string SuperLongName { get; set; }
}

[BlazorPath]
public partial class WebPaths
{
    [Query<QueryRecord>]
    public const string QueryTest = "/query-test";
      // -> /query-test?short=hello
}

対応している型

QueryClassのプロパティとしては以下のような定義が可能です。

通常の型

クラスの定義例 出力されるクエリURLの例
record QueryClass(int val1) "/?val1=5"
record QueryClass(bool? flg1) "/?flg1=true", "/"

これ以外でも、ToString()が実装されておりBlazor側が復元できる型ならば、基本的には対応しているはずです。

配列

クラスの定義例 出力されるクエリURLの例
record QueryClass(string[] arr) "/?arr=foo&arr=bar&arr=buz"

string[]の他にも、int[]bool[]なども対応しています。
IEnumerableListなどはBlazor側が対応していないため、サポートされていません。