やりたかったこと
INPUT要素にreadonly属性を付与するかどうか、場合わけをしたい。
AIに聞いた結果
<INPUT asp-for"@Model.UserInputText" @(isReadOnly ? "disabled" : "")>
上記のように@を使ってC#のコードを埋め込むように提案される。
だが、ビルドするとタイトルの通りErrorRZ1031が発生する。
エラーメッセージを元に何種類かのAIに聞いても同じような提案をされ堂々巡りとなる。
解決方法
公式ドキュメントを見ると
"タグ ヘルパーでは要素の属性またはタグ宣言区分の C# は許可されません。 たとえば、次のようなコードは有効ではありません。"
<input asp-for="LastName"
@(Model?.LicenseId == null ? "disabled" : string.Empty) />
とありました。ダメなコードそのまま書いていました。
同じセクションに、
"上記のコードは、次のように記述できます。"
<input asp-for="LastName"
disabled="@(Model?.LicenseId == null)" />
"通常、@ 演算子は、レンダリングされた HTML マークアップに式のテキスト表現を挿入します。 ただし、式が論理 false に評価されると、フレームワークは代わりに 属性を削除します。 前の例では、Model または LicenseId が null の場合、disabled 属性は true に設定されます。"
とありました。
結果書き直したのは
var isReadOnly = readonlyを判定する条件式 ;
<INPUT asp-for"Lastname" readonly=@(isReadOnly)>
としたところ、無事にreadonlyを付けるか、付けないか条件によって判定させることができました。
実際に出力されるコードは
編集可能時
<input type="text" data-val="true" data-val-maxlength="The field Lastname must be a string or array type with a maximum length of '20'." data-val-maxlength-max="20" data-val-required="The Lastname field is required." id="Lastname" maxlength="20" name="LastName" value="Jack">
<div contenteditable="plaintext-only">Jack</div>
</input>
編集不可(readonly)
<input type="text" data-val="true" data-val-maxlength="The field Lastname must be a string or array type with a maximum length of '20'." data-val-maxlength-max="20" data-val-required="The Lastname field is required." id="Lastname" maxlength="20" name="LastName" value="Jack">
<div contenteditable="false">asdd</div>
</input>
となり単純にINPUT要素にreadonly属性がつくわけではないのですが、想定通りの動作のためOKとしました。