Porting Assistant for .NET CLI を使って未対応のコンポーネントに対応させる

今回は、AWSからリリースされている「Porting Assistant for .NET」のCLIツールを操作し未対応のタグを変換できるようにします。

「Porting Assistant for .NET」は、.NET Frameworkで開発されたアプリケーションを .NET Coreに移植するためのサポートツールです。無料で使用できます。

# 困っていたこと

「Porting Assistant for .NET」で ASP.NET のaspx ファイルをBlazor コンポーネントに変換を行ってくれますが、変換できるタグに制限がありました。

ASP.NET WebForms の &lt;asp:ListBox&gt; , &lt;asp:DropDownList&gt; , &lt;asp:CheckBoxList&gt;, &lt; asp:RadioButtonList&gt; のようなタグは変換されず下記のようにコメントアウトされます。

``` html
        <tr>
            <td>
                @* The following tag is not supported: <asp:ListBox id="listbox1" runat="server"> *@@* </asp:ListBox> *@
            </td>
            <td>
                @* The following tag is not supported: <asp:DropDownList id="dropdown1" runat="server"> *@@* </asp:DropDownList> *@
            </td>
            <td>
                @* The following tag is not supported: <asp:CheckBoxList id="checklist1" runat="server"> *@@* </asp:CheckBoxList> *@
            </td>
            <td>
                @* The following tag is not supported: <asp:RadioButtonList id="radiolist1" runat="server"> *@@* </asp:RadioButtonList> *@
            </td>
        </tr>

```

今回はこれらを特定のタグに変換するようにしてみます。

# 利用するツール・動作要件

Code translation assistant https://github.com/aws/cta を利用します。

CLI の使い方は前回の記事を参照ください。

[Porting Assistant for .NET をCLIで使う](https://qiita.com/miyamocchi/items/d7299bf45f6a2bc112bb)

# TAgConfigs の準備

ASPコンポーネントタグに対する設定は TagConfigs ディレクトリにダウンロードされます。

このディレクトリに対応したタグをおいて変換を行います。

このファイルは S3 のリポジトリからダウンロードされますので、いちどCLIツールで変換を行うかディレクトリがない場合は作成します。

今回も Debug ビルドで作成したモジュールで実行したので、CTA.Rules.PortCore/bin/Debug/net6.0/TagConfigs/ ディレクトリに４ファイルを作成しました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/b274de6b-6a72-e180-3089-6268c8c0c778.png)

asp.ListBox.yaml の内容
``` yaml
!Template
TagName: asp:ListBox
CodeBehindType: System.Web.UI.WebControls.ListBox
CodeBehindHandler: Default

Templates:
    Default: |
        @Html.DropDownListFor("dlp1","selectList")
```
asp.dropdownlist.yaml の内容
``` yaml
!Template
TagName: asp:DropDownList
CodeBehindType: System.Web.UI.WebControls.DropDownList
CodeBehindHandler: Default

Templates:
    Default: |
        @Html.DropDownListFor("dlp1","selectList")
```
asp.checkboxlist.yaml の内容
``` yaml
!Template
TagName: asp:CheckBoxList
CodeBehindType: System.Web.UI.WebControls.CheckBoxList
CodeBehindHandler: Default

Templates:
    Default: |
        @Html.CheckBoxFor( model.CheckBox1)
```
asp.RadioButtonList.yaml の内容
``` yaml
!Template
TagName: asp:RadioButtonList
CodeBehindType: System.Web.UI.WebControls.RadioButtonList
CodeBehindHandler: Default

Templates:
    Default: |
        @Html.RadioButtonFor("rdb1", "item1")
```

今回はyamlファイルの内容が展開されるかを確認するので、html ヘルパーの内容は固定文字で記述しています。

# 変換の実行と作成されたファイル

前回と同じコマンドで変換を行います。

``` cmd 
 .\CTA.Rules.PortCore.exe -v net8.0 -c true -s C:\Users\masanao\source\repos\ASPNETWebApplication1\ASPNETWebApplication1.sln
```


変換が完了しました。razor コンポーネントが作成さてれいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/617400c2-882f-95bf-b951-5fdc556d20bf.png)

WebForm1.razor の内容を確認しました。
TagConfigs　の設定通り変換ができていることがわかります。

``` html
        <tr>
            <td>
                @Html.DropDownListFor("dlp1","selectList")
            </td>
            <td>
                @Html.DropDownListFor("dlp1","selectList")
            </td>
            <td>
                @Html.CheckBoxFor( model.CheckBox1)
            </td>
            <td>
                @Html.RadioButtonFor("rdb1", "item1")
            </td>
        </tr>
```

# 属性値の変換

次に各要素の属性値を反映させてみます。

用意したASP.NET画面ソース(抜粋)

``` html
  <td>
    <asp:ListBox id="listbox1" runat="server" ForeColor="Red" ToolTip="リストを選択してください。" />
  </td>
  <td>
    <asp:DropDownList id="dropdown1" runat="server" ForeColor="#3333FF" ToolTip="リストを選択してください。" />
  </td>
  <td>
    <asp:CheckBoxList id="checklist1" runat="server" ForeColor="#009933" ToolTip="いずれかの選択肢にチェックをいれてください" />
  </td>
  <td>
    <asp:RadioButtonList id="radiolist1" runat="server" ForeColor="Yellow" ToolTip="いずれかの〇にチェックをいれてください" />
  </td>
```
今回は各コンポーネントに ForeColor, ToolTip の属性をいれたものを用意しました。

TagConfig の内容

``` yaml 
!Template
TagName: asp:CheckBoxList
CodeBehindType: System.Web.UI.WebControls.CheckBoxList
CodeBehindHandler: Default

Templates:
    Default: |
        @Html.CheckBoxFor( #ID#, new{ title=#ToolTip# style="Color=#ForeColor#" } )
```
元の属性値を##で囲った変数として指定しています。

変換後のファイル

``` html
        <tr>
            <td>
                @Html.DropDownListFor(listbox1, new{ title="リストを選択してください。" style="Color="Red"" })
            </td>
            <td>
                @Html.DropDownListFor(dropdown1, new{ title="リストを選択してください。" style="Color="#3333FF"" })
            </td>
            <td>
                @Html.CheckBoxFor( checklist1, new{ title="いずれかの選択肢にチェックをいれてください" style="Color="#009933"" } )
            </td>
            <td>
                @Html.RadioButtonFor(radiolist1, new{ title="いずれかの〇にチェックをいれてください" style="Color="Yellow"" })
            </td>
        </tr>
```
変数部分が展開されていることが確認できました。

# 参考情報

OSSとして公開されている Porting Assistant for .NET のGitHub リポジトリにリンク等がのっています。

https://github.com/aws/porting-assistant-dotnet-client

CLIツールとして利用している Code translation in Porting Assistant for .NET のツール
https://github.com/aws/cta