ASP.NET MVC のスキャフォールディングによって作成されるページにおいて、モデルのプロパティを読み取り専用としたい、またはページに表示したくない場合に指定するアノテーションをまとめました。
アノテーション指定方法 | スキャフォールディングの結果 | |
---|---|---|
参照系ページ (Index/Details/Delete) |
編集系ページ (Create/Edit) |
|
[HiddenInput] ([HiddenInput(DisplayInput = true)] と同じ) |
見出し、値とも表示される。 | 見出し、値とも表示される。 <input type=”hidden”>として出力される。 |
[HiddenInput(DisplayInput = false)] | 見出しは表示されるが、値は表示されない。 | 見出しは表示されるが、値は表示されない。 <input type=”hidden”>として出力される。 |
[Editable(false)] | 見出し、値とも表示される。 | 見出し、値とも表示されない。 |
[ReadOnly] | 見出し、値とも表示される。 | 見出し、値とも表示されない。 |
HiddenInput はあくまで <input type=”hidden”> として出力されるというだけで、読み取り専用か否かといった点で語るものではないと思われます。しかし、DisplayInput プロパティの指定によって値の表示/非表示が変わるため、調査に含めてみました。
以下、動作確認に使用したモデル クラスと実行結果です。(HTML は長いので、一部抜粋しています。)
▼モデル クラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class ReadOnlyAnnotationsTest { public int Id { get; set; } // エンティティの主キーとなるプロパティ。今回の実験には特に関係なし。 [HiddenInput] public int? HiddenInput { get; set; } [HiddenInput(DisplayValue = false)] public int? HiddenInputDisplayValueFalse { get; set; } [Editable(false)] public int? EditableFalse { get; set; } [ReadOnly(true)] public int? ReadOnlyTrue { get; set; } } |
▼実行結果: Index ページ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<table class="table"> <tr> <th>HiddenInput</th> <th>HiddenInputDisplayValueFalse</th> <th>EditableFalse</th> <th>ReadOnlyTrue</th> <th></th> </tr> <tr> <td>1</td> <td></td> <td>3</td> <td>4</td> <td> <a href="/ReadOnlyAnnotationsTests/Edit/1">Edit</a> | <a href="/ReadOnlyAnnotationsTests/Details/1">Details</a> | <a href="/ReadOnlyAnnotationsTests/Delete/1">Delete</a> </td> </tr> </table> |
▼実行結果: Details ページ
1 2 3 4 5 6 7 8 9 10 11 12 |
<dl class="dl-horizontal"> <dt>HiddenInput</dt> <dd>1</dd> <dt>HiddenInputDisplayValueFalse</dt> <dd></dd> <dt>EditableFalse</dt> <dd>3</dd> <dt>ReadOnlyTrue</dt> <dd>4</dd> </dl> |
▼実行結果: Edit ページ
[Editable(false)] または [ReadOnly] を付与したプロパティは表示されてないません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<div class="form-group"> <label class="control-label col-md-2" for="HiddenInput">HiddenInput</label> <div class="col-md-10"> 1 <input class="form-control" data-val="true" data-val-number="The field HiddenInput must be a number." id="HiddenInput" name="HiddenInput" type="hidden" value="1" /> <span class="field-validation-valid text-danger" data-valmsg-for="HiddenInput" data-valmsg-replace="true"></span> </div> </div> <div class="form-group"> <label class="control-label col-md-2" for="HiddenInputDisplayValueFalse">HiddenInputDisplayValueFalse</label> <div class="col-md-10"> <input class="form-control" data-val="true" data-val-number="The field HiddenInputDisplayValueFalse must be a number." id="HiddenInputDisplayValueFalse" name="HiddenInputDisplayValueFalse" type="hidden" value="2" /> <span class="field-validation-valid text-danger" data-valmsg-for="HiddenInputDisplayValueFalse" data-valmsg-replace="true"></span> </div> </div> |
Delete ページは Details ページに似ているので、省略。同様に、Create ページは Edit ページに似ているので、省略しています。
「見出し、値とも表示はされないけれど、<input type=”hidden”> として出力される」指定が欲しかったけど、無いみたいですね。こういった場合は、スキャフォールディングで作成されたページに対して、手で修正を加えてやる必要があるようです。