Blazorの新しい実験的コンポーネント「QuickGrid」

devblogs.microsoft.com

ASP.NET Coreの.NET7 Preview 6におけるアップデートのブログの中でBlazorの新しい実験的なコンポーネントとしてQuickGridというデータグリッドコンポーネントの紹介があったので早速試してみた。

.NET7のアップデートブログに書かれているが見てみるとこのコンポーネント自体は.NET6から対応しているようだ。

 

www.nuget.org

というわけで、普通に.NET6のBlazor WebAssemblyのプロジェクトに上記をNugetする。

 

次に、「_Imports.razor」に次の記述を追記する。

 

@using Microsoft.AspNetCore.Components.QuickGrid

 

グリッドであるので、FetchData.razorを利用することとする。

どうやら、このQuickGridはIQueryable<>型を受け付ける仕様になっているよう。元々はWeatherForcastの配列をforeachでループさせて表示される形になっていたのでそこが変更点となる。

 

比較のために元の表示を残して以下のようにした。

 

 

@page "/fetchdata"
@inject HttpClient Http

<PageTitle>Weather forecast</PageTitle>

<h1>Weather forecast</h1>

<p>This component demonstrates fetching data from the server.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th>Temp. (C)</th>
                <th>Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
    <QuickGrid Items="@item">
        <PropertyColumn Property="@(p => p.Date.ToShortDateString())" Sortable="true" />
        <PropertyColumn Property="@(p => p.TemperatureC)" Sortable="true" />
        <PropertyColumn Property="@(p => p.TemperatureF)" Sortable="true" />
        <PropertyColumn Property="@(p => p.Summary)" Sortable="true" />
    </QuickGrid>
}

@code {
    public WeatherForecast[]? forecasts;

    IQueryable<WeatherForecast>? item;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");
        if (forecasts != null)
        {
            item = forecasts.AsQueryable();
        }
    }

    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public string? Summary { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}

 

実行結果は以下の通り。

 

 

QuickGridの機能としてソートや、ページング、フィルタリングといった機能があります。今までもUIコンポーネントを導入することで類似の機能を使うことはできましたがまだ実験的な機能とはいえ標準的なコンポーネントとしての検討があるということは素晴らしいことと思います。

 

.NET ラボ勉強会2022年6月登壇まとめ

Web開発者が始める .NET MAUI Blazor App

というタイトルで.NETラボ勉強会2022年6月登壇してきました。

 

 

dotnetlab.connpass.com

スライドは以下の通り。

 

www.slideshare.net

要点としては以下の通り。

  • 開発スタイルがBlazor WebAssemblyによく似ている
  • Web開発者にとってモバイル開発を始めるのに最適なフレームワークの一つである
  • 開発スタイルがBlazor WebAssemblyに似ているからといってなにもWebAssemblyが動いているわけではなくれっきとしたネイティブアプリケーションである
  • .NET MAUI Blazor Appも標準的な.NET MAUI同様のネイティブAPIを含むGPSや加速度APIなどのさまざまなAPIを使用可能
  • BlazorのUIコンポーネントなどBlazorの資産が有効活用できることも

 

というわけで、当日はAndroidの実機でのデモを交えてこれらのポイントを解説しました。

また、デモはしませんでしたがここまでのものを作る過程で驚きポイントとしてWebアプリやデスクトップアプリなどでホットリロードができるというのはまあリリースの通りできちんと動いているんだなという程度で便利には思ったけども驚きには感じませんでしたが、Android実機に対してもホットリロードできたという点に驚きと感動を覚えました。

やはり、デスクトップなど画面で動いているものとリアルな物理デバイスで動いているものとは少し感動が違うようです。

 

GitHubにあるBlazor WebAssembly ASP.NET Core HostedなプロジェクトをACRタスクでDockerコンテナイメージビルドする

まず、参考にしたのはここ。

docs.microsoft.com

参考のページとの際はプロジェクトの種類だ。

なので、ASP.NET Coreのビルドができれば基本的にはうまくいくはず。

 

前提条件

Blazor WebAssemblyのテンプレートにASP.NET Core Hostedのオプションをつけたプロジェクトがあり、Serverプロジェクトにコンテナサポートが入っていること。

(プロジェクト名/Server/Dockerfileがあること。)

 

GitHub個人用アクセストークンを作成する

上に示した参考ページの通りに個人用アクセストークンを作成する。

https://github.com/settings/tokens/new

上記より、[repo:status]と[public_repo]を有効にする。

トークンを生成し、このトークンをメモする。

 

Azure CLIを使えるようにする

すでに使えるのであればここは飛ばす。

docs.microsoft.com

ビルドタスクを作成する

まず、環境変数を設定します。

 

ACR_NAME=        # Azure container registryの名前
GIT_USER=      # GitHubのアカウント名
GIT_PAT= # 先ほど生成したトーク

 

次に、az acr task createコマンドを実行してタスクを生成します。

このときのポイントはDockerファイルはServerプロジェクト内にできているので参考ページとはDockerファイルのパスがずれているというところです。

また、--nameや--imageの名前は適宜変更してください。

 

 

 

az acr task create \
    --registry $ACR_NAME \
    --name taskhelloworld \
    --image helloworld:{{.Run.ID}} \
    --context https://github.com/$GIT_USER/<リポジトリ名> \
    --file <プロジェクト名>/Server/Dockerfile \
    --git-access-token $GIT_PAT

 

ビルドタスクをテストする

ここまででうまくいくとコンテナビルドができるはずです。

 

 

az acr task run --registry $ACR_NAME --name taskhelloworld

 

ここまでで成功したら、ソースコードを変更して自動的にトリガーするか試してみましょう。

 

 

 

このように、Azure portalのACRリソースのタスクタブにCommitトリガーで成功していたらここでの作業終了です。

 

Oracle DBでEF Coreを使う(既存テーブルをスキャフォルディングする)

今回は、.NET6のコンソールアプリケーションでサンプルアプリケーションを作成していきます。

まずは、普通にVS2022で.NET6のコンソールアプリのテンプレートでプロジェクトを作成します。

f:id:tomo_k:20220313074533p:plain

 

次に、NugetでOracle.EntityFrameworkCoreとMicrosoft.EntityFrameworkCore.Designパッケージをインストールします。

 

f:id:tomo_k:20220313074918p:plain

f:id:tomo_k:20220313080033p:plain



次に、パッケージマネージャコンソールで既存テーブルのスキャフォールディングを行います。

 

Scaffold-DbContext "データベースへの接続文字列" Oracle.EntityFrameworkCore

 

データベースへの接続文字列は従来Oracleへの接続文字列として使用していた形式が記述可能です。

オプションなどについては下記を参照してください。

docs.microsoft.com

2度目以降のスキャフォールディングは既存のファイルを上書きする必要があるので-Forceオプションをつけるとよいでしょう。

f:id:tomo_k:20220313080349p:plain

 

あとは、できたモデルをインスタンス化してあげればDBアクセスができます。

 

f:id:tomo_k:20220313082707p:plain



 

以下実行結果

f:id:tomo_k:20220313081318p:plain

 

考慮事項

 

生成されたデフォルトでは「ModelContext.cs」に接続文字列が直書きされているのでこれを適切な取り扱いをする