Razor からの移行

このページには、Razor の書き方をこの API へ置き換える対応表と、その置き換えでは済まず、コンポーネントの形そのものが変わる4点を載せます。

変わらないもの#

ここで書くコンポーネントは Blazor のコンポーネントです。BodyComponentBaseComponentBase から派生します。ライフサイクルメソッド、[Parameter][Inject][CascadingParameter] は、いま使っているものがそのまま使えます。StateHasChangedIDisposable も同じです。.razor ファイルからこのコンポーネントを呼べますし、その逆もできます(コンポーネントと再利用)。

対応表#

Razor ここ
@page "/counter" [Route("/counter")]
@inject IJSRuntime Js [Inject] private IJSRuntime Js { get; set; }
@code { … } 通常のクラスメンバー
<div class="card">…</div> Div.Class("card")[…]
<img src="/x.png" /> Img.Src("/x.png")
@onclick="Save" .OnClick(() => Save())
@bind="_name" .Bind("value", "oninput", () => _name)
@if (x) { … } else { … } If(x, () => …, () => …)
@foreach (var r in rows) { … } ForEach(rows, key: r => r.Id, content: r => …)、または [ViewPart] イテレータをスプレッドで差し込む(制御構文
@key="r.Id" ForEachkey 引数、または .Key(…)
@ref="_el" .Ref(…)
<Card Title="x" /> Component<Card>().Param(c => c.Title, "x")
<Card>…</Card> Component<Card>()[…]
<CascadingValue Value="@_t"> Component<CascadingValue<T>>().Param(c => c.Value, _t)[…]
@((MarkupString)html) Raw(html)
<text>…</text> Fragment(…)
@layout MainLayout [Layout(typeof(MainLayout))]、そのまま
レイアウトの @Body オーバーライドした Chrome の中の Bodyレイアウト

置き換えでは済まない4点#

属性が子より先に来る#

Razor では、属性を開始タグのどこに書いてもよく、子はその後に続きます。この API では、装飾を要素に繋げてから、子を角括弧に入れます。角括弧はその時点で View を作り終えているので、その後ろに装飾を繋ぐことはできません(BCF3008)。

ゲッターが返すのは1つの式#

.razor ファイルは、文を書けるテンプレートです。Body が返すのは1つの式で、その手前にローカル変数を置けます。2つ目の return は専用のシーケンス空間を必要とするため受け付けません。C# 本来の if/switch ならゲッターの末尾に置けますが、その分だけ縮退します(BCF1004BCF2002)。

IfForEach が C# のキーワードではなく構文として用意されているのも、同じ理由です。分岐のあるテンプレートを書き直す前に制御構文を読んでください。

キーは必須で、外すなら明示する#

Razor の @key は省略でき、書き忘れても気づきません。ForEachkey に既定値はないので、リストは項目を識別するか、key: null と書いて代償を引き受けるかのどちらかです。後者がキーを使わない書き方です。

覚える名前は HTML の名前だけ#

どの要素も同じ名前の HTML 要素で、レイアウトは CSS が担います。VStack.Padding() はありません。Text() もなく、文字列をそのまま書けばテキストノードです。HTML を知っていれば、要素について覚えることは他にありません。

コンポーネントを1つ書き直す#

書き直すのはマークアップだけで、C# はそのままにします。@code のメンバーをクラス本体へ移し、テンプレートを Body ゲッターに書き換えます。置き換えられないものは、ビルドが指摘します。どの診断も代わりに書くコードを示し、リファレンスに1件ずつ項があります。

最初に出る間違いは機械的な2つです。1つはクラスに partial が付いていないこと(BCF1001)、もう1つはゲッターの return の後ろに文が残っていること(BCF1004)です。

次に読むもの#

An unhandled error has occurred. Reload 🗙